wordpress启用主题时自动创建单页面

制作比较复杂的wordpress主题时,因为不同的需求可能需要配合多个单页面才可以完成工作,而主题发布后为了让用户顺利使用,往往要针对该部分页面编写相关的使用教程说明,既浪费开发者的时间也浪费用户的时间,因此让主题在用户启用时自动创建相关的单页面不仅节省很多设置步骤,更重要的是节省很多时间,下面是转自阿树工作室分享的相关教程。

相关函数

创建文章使用的函数为

1
wp_insert_post();

参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php   
$post = array(   
	'ID'             => [ <post id> ] //文章ID,设置后更新现有文章  
	'menu_order'     => [ <order> ] //如果新建的post类型是page(页面),那么它会出现在对应的标签顺序中   
	'comment_status' => [ 'closed' | 'open' ] // 评论状态,'closed' 表示禁止评论 
	'ping_status'    => [ 'closed' | 'open' ] // ping状态,'closed' 表示关闭pingbacks或trackbacks  
	'pinged'         => [ ? ] //?   
	'post_author'    => [ <user ID> ] //页面或文章作者id   
	'post_category'  => [ array(<category id>, <...>) ] //如果分类不存在,会偿试通过wp_set_post_terms()函数创建分类
	'post_content'   => [ <the text of the post> ] //页面或文章内容   
	'post_date'      => [ Y-m-d H:i:s ] //页面或文章创建时间
	'post_date_gmt'  => [ Y-m-d H:i:s ] //页面或文章创建时间,格林威治标准时间
	'post_excerpt'   => [ <an excerpt> ] //页面或文章摘要 
	'post_name'      => [ <the name> ] // 页面或文章标题别名
	'post_parent'    => [ <post ID> ] //设置新页面的父级页面 
	'post_password'  => [ ? ] //是否设置密码查看 
	'post_status'    => [ 'draft' | 'publish' | 'pending'| 'future' | 'private' | 'custom_registered_status' ] //设置页面或文章的状态 
	'post_title'     => [ <the title> ] //页面或文章标题  
	'post_type'      => [ 'post' | 'page' | 'link' | 'nav_menu_item' | 'custom_post_type' ] //选择类型   
	'tags_input'     => [ '<tag>, <tag>, <...>' ] //标签   
	'to_ping'        => [ ? ] //?   
	'tax_input'      => [ array( 'taxonomy_name' => array( 'term', 'term2', 'term3' ) ) ] // 支持的自定义分类法   
);     
wp_insert_post( $post, $wp_error );   
/*
$wp_error参数 布尔值 如果出错允许返回一个类。  
如果插入文章成功,函数将会返回插入的文章ID,如果出错,$wp_error设置为true 则返回一个类,否则返回0  
*/  
?>
操作步骤:

提示:以下代码保存在主题的functions.php文件中。

1、添加页面的函数

需要注意:页面的模板信息保存在_postmeta表中,以字段形式保存,字段名为_wp_page_template,所以要保存页面模板信息,使用update_post_meta函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**  
*参数$title 字符串 页面标题  
*参数$slug  字符串 页面别名  
*参数$page_template 字符串  模板名  
*无返回值  
**/  
function ashu_add_page($title,$slug,$page_template=''){   
    $allPages = get_pages();//获取所有页面   
    $exists = false;   
    foreach( $allPages as $page ){   
        //通过页面别名来判断页面是否已经存在   
        if( strtolower( $page->post_name ) == strtolower( $slug ) ){   
            $exists = true;   
        }   
    }   
    if( $exists == false ) {   
        $new_page_id = wp_insert_post(   
            array(   
                'post_title' => $title,   
                'post_type'     => 'page',   
                'post_name'  => $slug,   
                'comment_status' => 'closed',   
                'ping_status' => 'closed',   
                'post_content' => '',   
                'post_status' => 'publish',   
                'post_author' => 1,   
                'menu_order' => 0   
            )   
        );   
        //如果插入成功 且设置了模板   
        if($new_page_id && $page_template!=''){   
            //保存页面模板信息   
            update_post_meta($new_page_id, '_wp_page_template',  $page_template);   
        }   
    }   
}

2、通过hook执行创建页面函数。

有了上面的创建页面函数,则只需要通过钩子调用上面的函数即可创建页面。

注意,有的人可能使用init钩子,个人认为这不是很好,init钩子是每次wordpress初始化时都要执行的,但是我们不需要每次执行程序的时候都来一遍这个函数,我们只需要在主题使用者点击激活主题的那一刻,执行一次,以后再也不需要再执行了。所以使用load-themes.php钩子,load-themes.php钩子是后台在设置主题的页面时启用。

1
2
3
4
5
6
7
8
9
10
function ashu_add_pages() {   
	global $pagenow;   
	//判断是否为激活主题页面   
	if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) ){   
		ashu_add_page('ASHU_PAGE','ashu-page','page-ashu.php'); //页面标题ASHU_PAGE 别名ashu-page  页面模板page-ashu.php   
		ashu_add_page('PAGE_ASHU','page-ashu','ashu-page.php');   
	}   
}   
add_action( 'load-themes.php', 'ashu_add_pages' );  
//需要注意的是模板名称是php文件的文件名哦

添加上面的代码后,当用户启用主题后,就会创建相应的文章或页面,当然要修改代码中的参数为自己要创建的页面参数。

代码来自阿树工作室

发表留言