Wordpress 如何在自定义 WordPress 主题中以编程方式自动生成页面已安装并将它们分配给博客页面和首页

Wordpress how to auto-generat pages programmatically when custom WordPress theme is installed and assign them to blog page and front page

所以我有一个正在开发的自定义 WordPress 主题,在将它安装到新的 WordPress 设置中后,我想要一个自动生成的菜单以及 3 个页面,即:

这是我的主题将在很大程度上取决于。

我已经在自定义主题文件中为这些制作了 3 个模板页面,即:

因此,当安装主题时,这些主题是自动创建的,因此对客户来说是轻而易举的事。

我知道 Twig,但知之甚少 PHP 如果有人可以写下来,我可以将它放入我的 functions.php 文件中。

我将非常非常感谢,非常感谢!!


编辑
其他问题
此外,我还将自动创建主页和新闻页面。是否有快速代码可以自动将它们设置为默认主页和默认帖子页面?还是比这更复杂?

您可以使用 after_switch_theme 动作挂钩和 wp_insert_post 函数来实现您想要的。

after_switch_themeDocs

wp_insert_postDocs


  1. 所以要生成这三个页面,首先,我们创建一个包含 wp_insert_post 函数的函数。我们的自定义函数将采用两个参数,并首先检查您尝试创建的页面是否存在。如果该页面存在,它将 return false,否则,它将创建页面和 return 该页面的 ID。

The following code goes to the functions.php file of your active theme.

function your_theme_create_page($page_title, $page_content)
{
    $page_obj = get_page_by_title($page_title, 'OBJECT', 'page');

    if ($page_obj) {

        return false;

        exit();

    }

    $page_args = array(

        'post_type'      => 'page',

        'post_status'    => 'publish',

        'post_title'     => ucwords($page_title),

        'post_name'      => strtolower(trim($page_title)),

        'post_content'   => $page_content,

    );

    $page_id = wp_insert_post($page_args);

    return $page_id;

}
  1. 现在,在 after_switch_theme 操作挂钩上,我们 运行 另一个自定义函数。这次我们将创建一个关联数组来保存我们的 page titlespage contents。然后我们使用 foreach 循环将该数组提供给我们在上面创建的函数。

The following code also goes to the functions.php of your active theme.

add_action('after_switch_theme', 'my_custom_pages_on_theme_activation');

function my_custom_pages_on_theme_activation()
{

    $pages_array = array(

        'products page' => '<h3>Hello from products page</h3>',

        'policy page'   => '<h3>Hello from policy page</h3>',

        'services page' => '<h3>Hello from services page</h3>'

    );

    foreach ($pages_array as $page_title => $page_content) {

        $current_page = your_theme_create_page($page_title, $page_content);

        if (false != $current_page) {

            add_action('admin_notices', function () use ($page_title) {

?>
                <div class="notice notice-success is-dismissible">

                    <p><?php echo "Done! {$page_title} has been created"; ?></p>

                </div>

            <?php

            });

        } else {

            add_action('admin_notices', function () use ($page_title) {

            ?>
                <div class="notice notice-warning is-dismissible">

                    <p><?php echo "{$page_title} was not created! Check whether it already exists"; ?></p>

                </div>

<?php

            });

        }

    }

}

请注意,我使用了 admin_notices 操作挂钩来为用户提供视觉信息。

如果生成这些页面成功,则用户会看到以下消息:

另一方面,如果这些页面未生成或已经存在,则用户将看到以下消息:

现在我们已经创建了页面,您可以在管理屏幕的页面菜单中看到它们:

例如,页面内容如下:


现在,您可以更进一步,创建更复杂的模板并将它们提供给分类数组。

例如,您在名为 inc 的文件夹中有 page-products.phppage-policy.phppage-services.php 文件。所以你的文件夹结构应该是这样的:

Your-theme-folder
    |
    |css-folder
    |   |
    |   some-css.css
    |
    |javascript-folder
    |   |
    |   some-js.js
    |
    |inc-folder
        |
        page-products.php
        page-policy.php  
        page-services.php

那么你的关联数组将是这样的:

add_action('after_switch_theme', 'my_custom_pages_on_theme_activation');

function my_custom_pages_on_theme_activation()
{

    $products_page_title = 'products page'; 

    $policy_page_title   = 'policy page';

    $services_page_title = 'services page';

    $products_page_content = file_get_contents(__DIR__ . '\inc\page-products.php');

    $policy_page_content   = file_get_contents(__DIR__ . '\inc\page-policy.php');

    $services_page_content = file_get_contents(__DIR__ . '\inc\page-services.php');

    $pages_array = array(

        $products_page_title => $products_page_content,

        $policy_page_title   => $policy_page_content,

        $services_page_title => $services_page_content

    );

    foreach ($pages_array as $page_title => $page_content) {

        $current_page = your_theme_create_page($page_title, $page_content);

        if (false != $current_page) {

            add_action('admin_notices', function () use ($page_title) {

?>
                <div class="notice notice-success is-dismissible">

                    <p><?php echo "Done! {$page_title} has been created"; ?></p>

                </div>

            <?php

            });

        } else {

            add_action('admin_notices', function () use ($page_title) {

            ?>

                <div class="notice notice-warning is-dismissible">

                    <p><?php echo "{$page_title} was not created! Check whether it already exists"; ?></p>

                </div>

<?php

            });

        }

    }

}

如果您有任何问题,请告诉我。


回答附加问题

是的,这样做是可行的。 Wordpress 在 page_for_posts 选项下跟踪 blog posts page 。它还在 page_on_frontshow_on_front 选项下存储 front page 的信息。因此,要将您的页面分配给 blogfront 页面,您需要更新这些选项。

因此,当自定义函数在 after_switch_theme 操作挂钩中触发时,在 foreach 循环之后,您可以添加以下代码来分配您的页面:

$blog_page = get_page_by_title('news', 'OBJECT', 'page');

if ($blog_page) {

    update_option('page_for_posts', $blog_page->ID);

}

$front_home_page = get_page_by_title('home', 'OBJECT', 'page');

if ($front_home_page) {

    update_option('page_on_front', $front_home_page->ID);

    update_option('show_on_front', 'page');

}

get_page_by_titleDocs

所以 after_switch_theme 动作挂钩的整个自定义函数应该是这样的:

add_action('after_switch_theme', 'my_custom_pages_on_theme_activation');

function my_custom_pages_on_theme_activation()
{

    $pages_array = array(

        'products page' => '',

        'policy page'   => '',

        'services page' => ''

    );

    foreach ($pages_array as $page_title => $page_content) {

        $current_page = your_theme_create_page($page_title, $page_content);

        if (false != $current_page) {

            add_action('admin_notices', function () use ($page_title) {

?>

                <div class="notice notice-success is-dismissible">

                    <p><?php echo "Done! {$page_title} has been created"; ?></p>

                </div>

            <?php

            });

        } else {

            add_action('admin_notices', function () use ($page_title) {

            ?>

                <div class="notice notice-warning is-dismissible">

                    <p><?php echo "{$page_title} was not created! Check whether it already exists"; ?></p>

                </div>

<?php

            });

        }

    }

    $blog_page = get_page_by_title('news', 'OBJECT', 'page');

    if ($blog_page) {

        update_option('page_for_posts', $blog_page->ID);

    }

    $front_home_page = get_page_by_title('home', 'OBJECT', 'page');

    if ($front_home_page) {

        update_option('page_on_front', $front_home_page->ID);

        update_option('show_on_front', 'page');

    }

}