本文主要介绍在WordPress中设置文章类型自定义文章类型的示例教程。设置背景文章类型是WordPress的一大特色,但是自带的文章类型往往不够,有需要的朋友可以参考一下。
什么是自定义帖子?
不要想当然地认为这里的帖子指的是博客里的文章。只是文章的代理词,你甚至可以把它当成内容。
定制模型没有标准规则。文章模型可以是您想要的任何内容模型。以wordpress本身为例,内置了以下内容文章模型:
博客文章
页,面,张,版
附件
校订
等待导航
你可以这样理解:它只是一种灵活的内容形式,我们用来创建、编辑和存储像博客帖子这样的数据。
不过还是要提醒一下,博客内置的帖子有点不一样。您可以使用它来包含类别、标签等。要识别内容!
为什么要定制文章模型?
Wordpress已经提供了一些完美的默认文章模型,并且适用于大多数网站,但是我们仍然需要更多的选择。我列出了一些我认为可能有用的内容模型,并链接了相应的例子。
房地产列表
事件日历(我知道很多人对此感兴趣)
影视数据库
图书数据库
没有许多集成问题的论坛系统
类似WordPress Trac的票务系统
设计相册或作品集
您还可以想到比我列出的更多的内容模型。而且我也想在以后学习更多关于论坛和票务系统的想法。我已经实现了这两个系统,希望得到一些反馈。
创建文章类型
要创建一个新的Post类型,需要用register_post_type函数注册它。在需要你的主题的functions.php文件下调用这个函数:
register_post_type( $post_type,$ args);
$post_type参数是您的自定义帖子类型的名称。Post Type可以自定义的函数有很多,所以这个函数中会有很多$args参数。所以它通常以下列格式注册:
函数my_custom_post_product() {
$ args=array();
register_post_type( product ,$ args);
}
add_action( init , my _ custom _ post _ product );
包装一个函数,定义一个数组,然后调用init操作。这样,当WordPress被初始化时,它将执行这个函数来注册一个自定义的文章类型。因为调用register_post_type()时,必须在admin_menu动作之前,在_setup_theme动作之后,所以这里最好调用init动作。
有很多参数。为方便编写教程,只列出常用参数。大致结构如下:
函数my_custom_post_movie() {
$labels=array(
Name=_x(电影,帖子类型名称),
Singular _ name=_ x (movie ,发布单品时的名称,因为英语中有复数),
Add_new=_x(新电影,添加新内容的链接名),
Add_new_item=__(创建新电影),
Edit_item=__(编辑电影),
New_item=__(新电影),
All_items=__(所有电影),
View_item=__(查看电影),
Search_items=__(搜索电影),
Not_found=__(未找到电影),
Not_found_in_trash=__(回收站里没有相关电影),
parent_item_colon= ,
menu_name=电影
);
$args=array(
labels=$labels,
Description=我们网站的电影信息,
public=true,
menu_position=5,
支持“=数组(标题,编辑器,缩略图,摘录,注释 ),
has_archive=true
);
register_post_type( movie ,$ args);
}
add_action( init , my _ custom _ post _ movie );
这里为了直观方便,我直接用中文,最好用英文,然后通过本地化功能翻译成中文。
有几个参数。也可以用generatewp工具自定义参数,然后修改,这样会方便一点。
从上面的代码中,可以看到$args数组中有一个labels配置项,用于配置与显示副本相关的内容。为了清楚起见,它被单独取出来创建一个数组。其他配置项的大概意思可以通过看英文来猜测。想了解更多,可以看官方文档:register_post_type。
将上面的代码添加到主题functions.php的底部,当你进入后台时,你会发现有更多的电影选项,这意味着注册成功:
这时候我们可以新建一部电影,发表一篇电影类型的文章。但这和文章类型基本相同,我们需要更多的定制来完善我们的电影类型。
为岗位类型增加分类功能
就电影而言,可以分为科幻、动作、战争等类别。然后,我们将在我们的自定义电影中添加分类功能,以便我们可以编辑新的分类并对我们的电影进行分类。这个分类和文章中的分类是一样的。
需要使用register_taxonomy函数来添加分类函数,这也非常简单。它类似于注册Post类型函数,只是使用了一个附加参数来指定相应的Post类型:
register_taxonomy( $taxonomy,$object_type,$ args);
对于此示例,可以配置以下通用参数:
函数my_taxonomies_movie() {
$labels=array(
Name=_x(电影分类,分类名称),
Singular_name=_x(电影分类,分类法单数),
Search_items=__(搜索电影分类),
All_items=__(所有电影类别),
Parent_item=__(此电影分类的上级分类),
Parent_item_colon=__(此电影分类的上级分类:),
Edit_item=__(编辑电影分类),
Update_item=__(更新电影分类),
Add_new_item=__(添加新的电影类别),
New_item_name=__(新电影分类),
Menu_name=__(电影分类),
);
$args=array(
labels=$labels,
分级=真,
);
register _ taxonomy( movie _ category , movie ,$ args);
}
add_action( init , my_taxonomies_movie ,0);
加入主题后,我们看到熟悉的文章分类功能出现了,只不过上面的文案都变成了我们自定义的内容:
这里我们添加两个分类作为演示。
为文章类型添加自定义元框
我们要添加的电影类型不能只是主体内容,还需要添加一些相关的内容比如导演。然后,您需要添加一个自定义元框。Meta Box可以在文章发布页面添加自定义表单,在写文章的时候可以填写附加信息,在前端调出。
需要Add_meta_box函数来定制元框:
add_meta_box( $id,$title,$callback,$post_type,$context,$priority,$ callback _ args);
具体参数照例请参考官方文档,这里只介绍常用用法。我们注册了一个元盒:
add_action( add_meta_boxes , movie _ director );
函数movie_director() {
添加元框(
电影_导演,
电影导演,
电影_导演_元_盒子,
电影,
侧面,
低
);
}
然后在配置参数中指定回调函数movie_director_meta_box。我们需要在这个函数中创建一个表单:
函数movie _ director _ meta _ box($ post){
//为了安全起见,创建一个临时的隐藏窗体
WP _ nonce _ field( movie _ director _ meta _ box , movie _ director _ meta _ box _ nonce );
//获取先前存储的值
$value=get_post_meta( $post-ID, _movie_director ,true);
?
=movie_director/label的标签
input type= text id= movie _ director name= movie _ director value=?PHP echo ESC _ attr($ value);Placeholder=输入导演的姓名
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
}
这样,刚刚创建的表单可以显示在文章界面的侧边栏中:
但是这个时候你的表单就不能用了,因为你提交文章后没有保存这个元框的内容。下面是验证保存内容的代码:
add_action( save_post , movie _ director _ save _ meta _ box );
函数movie _ director _ save _ meta _ box($ post _ id){
//安全检查
//检查是否发送了一次性隐藏表单内容(判断是否是第三方模拟提交)
如果(!isset($ _ POST[ movie _ director _ meta _ box _ nonce ]){
返回;
}
//确定隐藏窗体的值是否和以前一样。
如果(!WP _ verify _ nonce($ _ POST[ movie _ director _ meta _ box _ nonce ], movie _ director _ meta _ box ){
返回;
}
//确定用户是否有权限。
如果(!current_user_can( edit_post ,$post_id ) ) {
返回;
}
//确定元框是否为空。
如果(!isset($ _ POST[ movie _ director ]){
返回;
}
$ movie _ director=sanitize _ text _ field($ _ POST[ movie _ director ]);
update_post_meta( $post_id, _movie_director ,$ movie _ director);
}
虽然最关键的功能在最后一句,但是一定要注意安全检查。将这些代码添加到functions.php文件后,你的元盒就可以正常工作了。如果需要更多的表单,根据这个模式自定义表单结构,然后添加保存功能。
下面,我们迫不及待地补充两部电影《鱼与锅之战:宿命对决》和《鱼与锅之战:我爱水煮鱼》,内容如下:
添加后,我们可以观看所有电影:
名单又空又丑。可以加导演字段吗?当然,可以通过使用【管理$ post类型帖子自定义列】(http://codex.wordpress.org/plugin _ API/action _ reference/manage _ $ post _ type _ posts _ custom _ column)来实现。我们补充:
add _ action( manage _ posts _ custom _ column , movie _ custom _ columns );
add _ filter( manage _ edit-movie _ columns , movie _ edit _ columns );
函数movie_custom_columns($column){
全球$邮政;
开关($列){
案例“电影_导演”:
echo get_post_meta( $post-ID, _movie_director ,true);
打破;
}
}
函数movie_edit_columns($columns){
$ columns[ movie _ director ]= director ;
return $ columns
}
也就是说,从每篇文章中添加并读出列director字段。所以我们的列表变成了:
好了,我们的后端部分愉快地完成了。打开生成的链接看一看,呃,没找到?好吧,如果你的网站有固定连接,你必须在创建一个新的帖子类型后,在后台更新固定连接设置。找到后台固定连接,然后点击下方的“保存设置”,即可正常访问。
显示文章类型的内容
简单的创建一个帖子类型只是让你输入内容,没有任何意义。我们还需要在前台输出自定义帖子类型的内容。
自定义帖子类型的模板和样式
根据WordPress的模板调用规则,我们可以知道只需要创建archive-[post_type]。php和single-[post_type]。php实现该帖子类型的列表定制和文章定制。在访问帖子类型时,WordPress会优先调用这些模板进行渲染。
需要注意的是,在注册Post Type要有列表时,需要设置 has_archive=true。
现在,让我们在主题中复制archive.php和single.php的文件,并将其命名为archive-movie.php和single-movie.php。为了演示,这里不做很多定制,只是输出导演信息来展示。
我们分别在L.56和L.23附近的适当位置输出元盒信息:
回声导演:。get _ post _ meta (get _ the _ id(), _ movie _ director ,true);
然后刷新电影和特定电影列表,查看输出导演信息。
这里只是一个例子。实际操作中,结构和输出信息格式往往是自定义的,这里就不做进一步修改了。不要在这里演示了。
调用WP_Query高度定制调用帖子类型的内容
以上操作依赖于模板。如果需要高度定制或者在页面的某个模块中调用列表,需要使用WP_Query类来调用:
$ args=array( post _ type = product , posts _ per _ page =10);
$ loop=new WP _ Query($ args);
while($ loop-have _ post()):$ loop-the _ post();
_ title();
echo“div class=”entry-content“”;
_ content();
echo /div ;
endwhile
查询出来后,就和常规主循环一样了。您可以自定义输出结构。
在主页列表中显示自定义帖子类型的内容。
虽然我们自定义了帖子类型,写了一些内容,但是并没有显示在首页的列表中。自定义帖子类型的内容不会自动混合到主循环中。那么如何让自定义帖子类型的内容显示出来呢?
您需要使用pre_get_posts的动作来做一些处理:
add_action( pre_get_posts , add _ my _ post _ types _ to _ query );
函数add _ my _ post _ types _ to _ query($ query){
if(is _ home()$ query-is _ main _ query())
$query-set( post_type ,array( post , page , movie );
return $ query
}
上面$query变量中设置的post_type数组就是主循环中要显示的内容。填写您的自定义帖子类型,它将显示在主页上。
设置自定义帖子类型的固定连接。
有时候创建一个新的帖子类型也是为了更容易做SEO,所以设置它的固定连接也是很重要的。这里主要使用注册帖子类型的参数数组中的重写参数,常用的有以下几项:
Slug=》自定义固定连接结构别名,默认是使用帖子类型名称(比如本例中的movie),可以翻译。一般来说,帖子类型名称可能与实际URL不同(帖子类型是电影,但URL可能需要电影),因此您可以使用此自定义。
With_front="固定连接是否基于根目录。如果在“固定连接设置”页面上将您的结构设置为/archives/如果将此项设置为false,可以去掉之前的/archives/,直接生成基于根路径的固定连接。
大功告成,但这只是Post Type最基本的用法。Post类型还有其他更高级的用法,更详细的参数配置需要你进一步挖掘,才能满足你网站的功能需求。