沃梦达 / 编程问答 / php问题 / 正文

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主题时以编程方式自动生成页面,并将它们分配到博客页面和首页)

本文介绍了WordPress如何在安装自定义WordPress主题时以编程方式自动生成页面,并将它们分配到博客页面和首页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有一个正在开发的自定义WordPress主题,在新的WordPress安装程序中安装它时,我希望自动生成一个带有3个页面的菜单,即:

  • 产品
  • 政策
  • 服务

这是我的主题将在很大程度上依赖于此。

我将在自定义主题文件中为这些文件创建3个模板页面,即:

  • page-products ts.php
  • page-policy.php
  • page-services.php

因此,在安装主题时,这些都是自动创建的,因此客户端无需动脑筋。

我了解Twig,但对PHP知之甚少,如果有人能把它写出来,我就可以把它放到我的functions.php文件中。

我将非常非常感谢!!


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

推荐答案

您可以使用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操作挂钩向用户提供可视消息。

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

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

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

下面是页面内容,例如:


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

例如,在名为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__ . 'incpage-products.php');

    $policy_page_content   = file_get_contents(__DIR__ . 'incpage-policy.php');

    $services_page_content = file_get_contents(__DIR__ . 'incpage-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。它还将front page的信息存储在page_on_frontshow_on_front选项下。因此,若要将页面分配给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');

    }

}

这篇关于WordPress如何在安装自定义WordPress主题时以编程方式自动生成页面,并将它们分配到博客页面和首页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:WordPress如何在安装自定义WordPress主题时以编程方式自动生成页面,并将它们分配到博客页面和首页

基础教程推荐