php WordPress如何自动生成页面编程时,自定义WordPress主题安装,并将其分配到博客页面和首页

f4t66c6m  于 2023-03-11  发布在  PHP
关注(0)|答案(1)|浏览(156)

因此,我有一个自定义的WordPress主题,我正在开发和安装后,它在一个新的WordPress设置,我想一个菜单自动生成3页,即:

*产品
*政策
*服务

这是我的主题将严重依赖。
我将已经有3个模板页面为这些自定义主题文件,即:

*页面-产品.php
*页面-策略.php
*网页服务.php

因此,当主题安装这些是自动创建的,所以这是一个没有头脑的客户端。
我知道小枝,但很少PHP,如果有人能写出来,所以我可以把它放到我的functions.php文件。
我会非常非常感激,非常感谢!!

编辑
补充问题

此外,我将有一个主页和新闻页面自动创建以及。是否有一个快速的代码来自动设置这些作为默认主页和默认帖子页面?或者是比这更复杂?

busg9geu

busg9geu1#

您可以使用after_switch_theme操作钩子和wp_insert_post函数来实现您所寻找的内容。
after_switch_themeDocs
wp_insert_postDocs
1.为了生成这三个页面,首先,我们创建一个包含wp_insert_post函数的函数。我们的自定义函数将接受两个参数,首先检查您试图创建的页面是否存在。如果页面存在,它将返回false,否则,它将创建页面并返回该页面的id。
下面的代码转到活动主题的functions.php文件。

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循环将该数组提供给前面创建的函数。
下面的代码还转到活动主题的functions.php

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操作钩子为用户提供了可视消息。
如果成功生成这些页面,则用户将看到以下消息:

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

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

下面是页面内容示例:

现在,您可以更进一步,创建更复杂的模板并将它们提供给同配数组。
例如,你有page-products.phppage-policy.phppage-services.php文件在一个名为inc的文件夹中,那么你的文件夹结构应该是这样的:

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 action钩子的整个自定义函数将如下所示:

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');

    }

}

相关问题