WordPress中设置Post Type自定义文章类型的实例教程
<p><strong>什么是自定义post?</strong><br>
不要想当然的认为这里的post就是就是指博客中的文章,它只不过是一个文章类的代理词而已,甚至你还可以认为它是内容。<br>
自定义模型是没有一个很标准的什么规定的,文章模型可以是你想的任何一个内容模型,就拿wordpress本身来说就内置了以下几个内容文章模型:</p>
<ul>
<li>
博客文章</li>
<li>
页面</li>
<li>
附件</li>
<li>
修正</li>
<li>
导航等</li>
</ul>
<p>
你可以这样去理解:它只要是想我们使用博客文章那样用来创建、编辑和储存数据的一种很灵活的内容形式。</p>
<p>
不过在这里我还是需要提醒下,博客内置的post还是有点点不同的,你可以利用它含有分类、标签等去标识内容的!<br>
为什么要自定义文章模型?<br>
wordpress已经提供一些完善的默认文章模型,并适用于大多数站点,但我们还是需要更多的选择。我列举了一些我想到的一些可能有用内容模型,并链接到相对应的例子。</p>
<ul>
<li>
房产清单</li>
<li>
活动日历(我知道很多人对这个感兴趣)</li>
<li>
影视资料库</li>
<li>
书籍资料库</li>
<li>
没有很多集成问题的论坛系统</li>
<li>
类似wordpress trac的票务系统</li>
<li>
设计相册或作品集</li>
</ul>
<p>
你还可以想到我列举之外的更多内容模型。而且我也想在以后学习更多关于论坛和票务系统的想法。这两个系统我已经实现并希望的得到一些反馈。</p>
<p>
<strong>创建一个 post type</strong><br>
创建一个新的 post type 需要使用 register_post_type 函数来注册一下。需要在你主题的 functions.php 文件下调用该函数:</p>
<div>
<div>
<div id="highlighter_631858">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>register_post_type( </code><code>$post_type</code><code>, </code><code>$args</code> <code>);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
$post_type 参数就是你自定义 post type 的名称,post type 可以自定义的功能非常多,所以这个函数里面的 $args 参数会很多。所以通常会用下面这种格式来注册:</p>
<div>
<div>
<div id="highlighter_435053">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
</td>
<td>
<div>
<div>
<code>function</code> <code>my_custom_post_product() {</code>
</div>
<div>
<code> </code><code>$args</code> <code>= </code><code>array</code><code>();</code>
</div>
<div>
<code> </code><code>register_post_type( </code><code>'product'</code><code>, </code><code>$args</code> <code>); </code>
</div>
<div>
<code>}</code>
</div>
<div>
<code>add_action( </code><code>'init'</code><code>, </code><code>'my_custom_post_product'</code> <code>);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
包裹在一个函数中,定义一个数组,然后挂靠到 init 这个 action 上。这样 wordpress 在初始化的时候,就会执行这个函数注册一个自定义 post type,因为调用 register_post_type() 的时候,必须要在 admin_menu action 之前,在 after_setup_theme action 之后,所以这里最好挂靠到 init action 上。<br>
参数很多,为了写教程方便,只列出比较常用的参数,大体结构如下:</p>
<div>
<div>
<div id="highlighter_901325">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
<div>
11</div>
<div>
12</div>
<div>
13</div>
<div>
14</div>
<div>
15</div>
<div>
16</div>
<div>
17</div>
<div>
18</div>
<div>
19</div>
<div>
20</div>
<div>
21</div>
<div>
22</div>
<div>
23</div>
<div>
24</div>
<div>
25</div>
<div>
26</div>
<div>
27</div>
</td>
<td>
<div>
<div>
<code>function</code> <code>my_custom_post_movie() {</code>
</div>
<div>
<code> </code><code>$labels</code> <code>= </code><code>array</code><code>(</code>
</div>
<div>
<code> </code><code>'name'</code> <code>=> _x( </code><code>'movies'</code><code>, </code><code>'post type 名称'</code> <code>),</code>
</div>
<div>
<code> </code><code>'singular_name'</code> <code>=> _x( </code><code>'movie'</code><code>, </code><code>'post type 单个 item 时的名称,因为英文有复数'</code> <code>),</code>
</div>
<div>
<code> </code><code>'add_new'</code> <code>=> _x( </code><code>'新建电影'</code><code>, </code><code>'添加新内容的链接名称'</code> <code>),</code>
</div>
<div>
<code> </code><code>'add_new_item'</code> <code>=> __( </code><code>'新建一个电影'</code> <code>),</code>
</div>
<div>
<code> </code><code>'edit_item'</code> <code>=> __( </code><code>'编辑电影'</code> <code>),</code>
</div>
<div>
<code> </code><code>'new_item'</code> <code>=> __( </code><code>'新电影'</code> <code>),</code>
</div>
<div>
<code> </code><code>'all_items'</code> <code>=> __( </code><code>'所有电影'</code> <code>),</code>
</div>
<div>
<code> </code><code>'view_item'</code> <code>=> __( </code><code>'查看电影'</code> <code>),</code>
</div>
<div>
<code> </code><code>'search_items'</code> <code>=> __( </code><code>'搜索电影'</code> <code>),</code>
</div>
<div>
<code> </code><code>'not_found'</code> <code>=> __( </code><code>'没有找到有关电影'</code> <code>),</code>
</div>
<div>
<code> </code><code>'not_found_in_trash'</code> <code>=> __( </code><code>'回收站里面没有相关电影'</code> <code>),</code>
</div>
<div>
<code> </code><code>'parent_item_colon'</code> <code>=> </code><code>''</code><code>,</code>
</div>
<div>
<code> </code><code>'menu_name'</code> <code>=> </code><code>'movies'</code>
</div>
<div>
<code> </code><code>);</code>
</div>
<div>
<code> </code><code>$args</code> <code>= </code><code>array</code><code>(</code>
</div>
<div>
<code> </code><code>'labels'</code> <code>=> </code><code>$labels</code><code>,</code>
</div>
<div>
<code> </code><code>'description'</code> <code>=> </code><code>'我们网站的电影信息'</code><code>,</code>
</div>
<div>
<code> </code><code>'public'</code> <code>=> true,</code>
</div>
<div>
<code> </code><code>'menu_position'</code> <code>=> 5,</code>
</div>
<div>
<code> </code><code>'supports'</code> <code>=> </code><code>array</code><code>( </code><code>'title'</code><code>, </code><code>'editor'</code><code>, </code><code>'thumbnail'</code><code>, </code><code>'excerpt'</code><code>, </code><code>'comments'</code> <code>),</code>
</div>
<div>
<code> </code><code>'has_archive'</code> <code>=> true</code>
</div>
<div>
<code> </code><code>);</code>
</div>
<div>
<code> </code><code>register_post_type( </code><code>'movie'</code><code>, </code><code>$args</code> <code>);</code>
</div>
<div>
<code>}</code>
</div>
<div>
<code>add_action( </code><code>'init'</code><code>, </code><code>'my_custom_post_movie'</code> <code>);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
这里为了直观方便,我直接使用了中文,更好的应该是使用英文然后通过本地化函数来翻译成中文。<br>
参数有点多,也可以使用 generatewp 工具自定义参数,然后改改,会稍微方便一点。<br>
从上面代码可以看到 $args 数组里面有一个 labels 配置项,用来配置显示文案有关的内容,为了清晰所以单独拿出来创建了一个数组。其他配置项看下英文也能猜出大体意思,如果想要详细了解,可以看下官方文档:register_post_type 。<br>
将上面代码加到主题 functions.php 的最下面,进入后台你会发现多出了 movies 选项,这样表示注册成功:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress中设置Post Type自定义文章类型的实例教程" alt="WordPress中设置Post Type自定义文章类型的实例教程" src="https://zhuji.jb51.net/uploads/img/202305/5c9fae039597d961f4df69d8f646dc6e.jpg"></p>
<p>
这时候我们可以新建 movie 发表一篇电影类型的文章了。但是这样与文章类型基本相同,我们需要更多的自定义来完善我们的 movie 类型。<br><strong>为 post type 添加分类功能</strong><br>
就电影来说,可以分为科幻、动作、战争等类别,那么我们就为自定义的 movie 添加分类功能,这样就可以编辑新分类以及归类我们的电影了。这个分类跟文章里面的分类性质是一样的。<br>
添加分类功能需要使用函数 register_taxonomy,使用方法也很简单,跟注册 post type 函数类似,只不过多了一个参数用来指定对应的 post type :</p>
<div>
<div>
<div id="highlighter_209044">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>register_taxonomy( </code><code>$taxonomy</code><code>, </code><code>$object_type</code><code>, </code><code>$args</code> <code>);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
就本例而言,可以配置如下常用参数:</p>
<div>
<div>
<div id="highlighter_530521">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
<div>
11</div>
<div>
12</div>
<div>
13</div>
<div>
14</div>
<div>
15</div>
<div>
16</div>
<div>
17</div>
<div>
18</div>
<div>
19</div>
<div>
20</div>
<div>
21</div>
</td>
<td>
<div>
<div>
<code>function</code> <code>my_taxonomies_movie() {</code>
</div>
<div>
<code> </code><code>$labels</code> <code>= </code><code>array</code><code>(</code>
</div>
<div>
<code> </code><code>'name'</code> <code>=> _x( </code><code>'电影分类'</code><code>, </code><code>'taxonomy 名称'</code> <code>),</code>
</div>
<div>
<code> </code><code>'singular_name'</code> <code>=> _x( </code><code>'电影分类'</code><code>, </code><code>'taxonomy 单数名称'</code> <code>),</code>
</div>
<div>
<code> </code><code>'search_items'</code> <code>=> __( </code><code>'搜索电影分类'</code> <code>),</code>
</div>
<div>
<code> </code><code>'all_items'</code> <code>=> __( </code><code>'所有电影分类'</code> <code>),</code>
</div>
<div>
<code> </code><code>'parent_item'</code> <code>=> __( </code><code>'该电影分类的上级分类'</code> <code>),</code>
</div>
<div>
<code> </code><code>'parent_item_colon'</code> <code>=> __( </code><code>'该电影分类的上级分类:'</code> <code>),</code>
</div>
<div>
<code> </code><code>'edit_item'</code> <code>=> __( </code><code>'编辑电影分类'</code> <code>),</code>
</div>
<div>
<code> </code><code>'update_item'</code> <code>=> __( </code><code>'更新电影分类'</code> <code>),</code>
</div>
<div>
<code> </code><code>'add_new_item'</code> <code>=> __( </code><code>'添加新的电影分类'</code> <code>),</code>
</div>
<div>
<code> </code><code>'new_item_name'</code> <code>=> __( </code><code>'新电影分类'</code> <code>),</code>
</div>
<div>
<code> </code><code>'menu_name'</code> <code>=> __( </code><code>'电影分类'</code> <code>),</code>
</div>
<div>
<code> </code><code>);</code>
</div>
<div>
<code> </code><code>$args</code> <code>= </code><code>array</code><code>(</code>
</div>
<div>
<code> </code><code>'labels'</code> <code>=> </code><code>$labels</code><code>,</code>
</div>
<div>
<code> </code><code>'hierarchical'</code> <code>=> true,</code>
</div>
<div>
<code> </code><code>);</code>
</div>
<div>
<code> </code><code>register_taxonomy( </code><code>'movie_category'</code><code>, </code><code>'movie'</code><code>, </code><code>$args</code> <code>);</code>
</div>
<div>
<code>}</code>
</div>
<div>
<code>add_action( </code><code>'init'</code><code>, </code><code>'my_taxonomies_movie'</code><code>, 0 );</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
添加到主题之后,我们看到出现了熟悉的文章分类功能,只不过上面的文案全部变成我们自定义的内容了:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress中设置Post Type自定义文章类型的实例教程" alt="WordPress中设置Post Type自定义文章类型的实例教程" src="https://zhuji.jb51.net/uploads/img/202305/44be694008d58f3a6a4eac39169f00de.jpg"></p>
<p>
这里我们添加两个分类作为演示。<br><strong>为 post type 添加自定义 meta box</strong><br>
我们想要添加的电影类型不能仅仅只有正文内容,我们还需要额外添加一些 导演 之类的有关内容。那么就需要添加自定义 meta box,meta box 可以在文章发表页面中添加自定义的表单,编写文章的时候可以填写额外的信息然后在前端调用出来。<br>
自定义 meta box 需要用到 add_meta_box 函数:</p>
<div>
<div>
<div id="highlighter_804464">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>add_meta_box( </code><code>$id</code><code>, </code><code>$title</code><code>, </code><code>$callback</code><code>, </code><code>$post_type</code><code>, </code><code>$context</code><code>,</code><code>$priority</code><code>, </code><code>$callback_args</code> <code>);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
老规矩,具体参数内容查看官方文档,这里只介绍常用用法。我们注册一个 meta box :</p>
<div>
<div>
<div id="highlighter_918680">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
<div>
11</div>
</td>
<td>
<div>
<div>
<code>add_action( </code><code>'add_meta_boxes'</code><code>, </code><code>'movie_director'</code> <code>);</code>
</div>
<div>
<code>function</code> <code>movie_director() {</code>
</div>
<div>
<code> </code><code>add_meta_box(</code>
</div>
<div>
<code> </code><code>'movie_director'</code><code>,</code>
</div>
<div>
<code> </code><code>'电影导演'</code><code>,</code>
</div>
<div>
<code> </code><code>'movie_director_meta_box'</code><code>,</code>
</div>
<div>
<code> </code><code>'movie'</code><code>,</code>
</div>
<div>
<code> </code><code>'side'</code><code>,</code>
</div>
<div>
<code> </code><code>'low'</code>
</div>
<div>
<code> </code><code>);</code>
</div>
<div>
<code>}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
然后在配置参数里面指定了回调函数 movie_director_meta_box,我们需要在这个函数里面创建表单:</p>
<div>
<div>
<div id="highlighter_480649">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
</td>
<td>
<div>
<div>
<code>function</code> <code>movie_director_meta_box(</code><code>$post</code><code>) {</code>
</div>
<div>
<code> </code><code>// 创建临时隐藏表单,为了安全</code>
</div>
<div>
<code> </code><code>wp_nonce_field( </code><code>'movie_director_meta_box'</code><code>, </code><code>'movie_director_meta_box_nonce'</code> <code>);</code>
</div>
<div>
<code> </code><code>// 获取之前存储的值</code>
</div>
<div>
<code> </code><code>$value</code> <code>= get_post_meta( </code><code>$post</code><code>->id, </code><code>'_movie_director'</code><code>, true );</code>
</div>
<div>
<code> </code><code>?></code>
</div>
<div>
<code> </code><code><label </code><code>for</code><code>=</code><code>"movie_director"</code><code>></label></code>
</div>
<div>
<code> </code><code><input type=</code><code>"text"</code> <code>id=</code><code>"movie_director"</code> <code>name=</code><code>"movie_director"</code> <code>value=</code><code>"<?php echo esc_attr( $value ); ?>"</code> <code>placeholder=</code><code>"输入导演名称"</code> <code>></code>
</div>
<div>
<code> </code><code><?php</code>
</div>
<div>
<code>}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
这样就可以在文章界面边栏显示出来刚刚创建的表单了:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress中设置Post Type自定义文章类型的实例教程" alt="WordPress中设置Post Type自定义文章类型的实例教程" src="https://zhuji.jb51.net/uploads/img/202305/0788c6306abcd16e8afa1d044cb84d33.jpg"></p>
<p>
但是这时候,你的表单是没法用的,因为你提交文章之后并没有保存这个 meta box 的内容,下面是验证保存内容的代码:</p>
<div>
<div>
<div id="highlighter_562932">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
<div>
11</div>
<div>
12</div>
<div>
13</div>
<div>
14</div>
<div>
15</div>
<div>
16</div>
<div>
17</div>
<div>
18</div>
<div>
19</div>
<div>
20</div>
<div>
21</div>
<div>
22</div>
</td>
<td>
<div>
<div>
<code>add_action( </code><code>'save_post'</code><code>, </code><code>'movie_director_save_meta_box'</code> <code>);</code>
</div>
<div>
<code>function</code> <code>movie_director_save_meta_box(</code><code>$post_id</code><code>){</code>
</div>
<div>
<code> </code><code>// 安全检查</code>
</div>
<div>
<code> </code><code>// 检查是否发送了一次性隐藏表单内容(判断是否为第三者模拟提交)</code>
</div>
<div>
<code> </code><code>if</code> <code>( ! isset( </code><code>$_post</code><code>[</code><code>'movie_director_meta_box_nonce'</code><code>] ) ) {</code>
</div>
<div>
<code> </code><code>return</code><code>;</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code><code>// 判断隐藏表单的值与之前是否相同</code>
</div>
<div>
<code> </code><code>if</code> <code>( ! wp_verify_nonce( </code><code>$_post</code><code>[</code><code>'movie_director_meta_box_nonce'</code><code>], </code><code>'movie_director_meta_box'</code> <code>) ) {</code>
</div>
<div>
<code> </code><code>return</code><code>;</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code><code>// 判断该用户是否有权限</code>
</div>
<div>
<code> </code><code>if</code> <code>( ! current_user_can( </code><code>'edit_post'</code><code>, </code><code>$post_id</code> <code>) ) {</code>
</div>
<div>
<code> </code><code>return</code><code>;</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code><code>// 判断 meta box 是否为空</code>
</div>
<div>
<code> </code><code>if</code> <code>( ! isset( </code><code>$_post</code><code>[</code><code>'movie_director'</code><code>] ) ) {</code>
</div>
<div>
<code> </code><code>return</code><code>;</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code><code>$movie_director</code> <code>= sanitize_text_field( </code><code>$_post</code><code>[</code><code>'movie_director'</code><code>] );</code>
</div>
<div>
<code> </code><code>update_post_meta( </code><code>$post_id</code><code>, </code><code>'_movie_director'</code><code>, </code><code>$movie_director</code> <code>);</code>
</div>
<div>
<code>}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
虽然最关键的函数就在最后一句,但是一定要注意安全的校验。把这些代码添加进 functions.php 文件之后,你的 meta box 就可以正常工作了。如果你需要更多表单,按照这个模式自定义表单结构,然后添加保存函数即可。<br>
下面,我们迫不及待的添加两部电影《鱼与锅之战:宿命对决》 和 《鱼与锅之战:我爱水煮鱼》 内容如下:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress中设置Post Type自定义文章类型的实例教程" alt="WordPress中设置Post Type自定义文章类型的实例教程" src="https://zhuji.jb51.net/uploads/img/202305/0f49569063d8ccc0c65aa3d5162bd135.jpg"></p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress中设置Post Type自定义文章类型的实例教程" alt="WordPress中设置Post Type自定义文章类型的实例教程" src="https://zhuji.jb51.net/uploads/img/202305/dbd475230e9004ed617efb6cd55d1d4d.jpg"></p>
<p>
添加完之后,我们可以看下所有电影:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress中设置Post Type自定义文章类型的实例教程" alt="WordPress中设置Post Type自定义文章类型的实例教程" src="https://zhuji.jb51.net/uploads/img/202305/405b7c75df29ac3ac7680f0ccb5ea780.jpg"></p>
<p>
列表空荡荡的,好难看,我可不可以加上导演字段?当然可以,使用 (http://codex.wordpress.org/plugin_api/action_reference/manage_$post_type_posts_custom_column) 即可实现,我们添加:</p>
<div>
<div>
<div id="highlighter_679428">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
<div>
11</div>
<div>
12</div>
<div>
13</div>
<div>
14</div>
</td>
<td>
<div>
<div>
<code>add_action(</code><code>"manage_posts_custom_column"</code><code>, </code><code>"movie_custom_columns"</code><code>);</code>
</div>
<div>
<code>add_filter(</code><code>"manage_edit-movie_columns"</code><code>, </code><code>"movie_edit_columns"</code><code>);</code>
</div>
<div>
<code>function</code> <code>movie_custom_columns(</code><code>$column</code><code>){</code>
</div>
<div>
<code> </code><code>global</code> <code>$post</code><code>;</code>
</div>
<div>
<code> </code><code>switch</code> <code>(</code><code>$column</code><code>) {</code>
</div>
<div>
<code> </code><code>case</code> <code>"movie_director"</code><code>:</code>
</div>
<div>
<code> </code><code>echo</code> <code>get_post_meta( </code><code>$post</code><code>->id, </code><code>'_movie_director'</code><code>, true );</code>
</div>
<div>
<code> </code><code>break</code><code>;</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code>}</code>
</div>
<div>
<code>function</code> <code>movie_edit_columns(</code><code>$columns</code><code>){</code>
</div>
<div>
<code> </code><code>$columns</code><code>[</code><code>'movie_director'</code><code>] = </code><code>'导演'</code><code>;</code>
</div>
<div>
<code> </code><code>return</code> <code>$columns</code><code>;</code>
</div>
<div>
<code>}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
即添加了列导演字段,并从每篇文章中读取出来。这样我们的列表就变成了:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress中设置Post Type自定义文章类型的实例教程" alt="WordPress中设置Post Type自定义文章类型的实例教程" src="https://zhuji.jb51.net/uploads/img/202305/265db248153bf57759deba57d2a08c79.jpg"></p>
<p>
ok,我们的后端部分就这样愉快的完成了。打开生成好的链接看下,咦,not found?是这样的,如果你的网站设置了固定连接,当你新建了 post type 之后,你必须要在后台更新一下固定连接设置才行。找到后台固定连接,再点击一下下面的“保存设置”,之后就可以正常访问了。<br><strong>展示 post type 的内容</strong><br>
单纯创建 post type 只是可以让你输入内容,没有什么意义,我们还需要在前台输出自定义 post type 的内容。<br>
自定义 post type 的模板和样式<br>
根据 wordpress 的模板调用规则 我们可以得知,我们只需要创建 archive-.php 和 single-.php 就可以实现该 post type 的列表自定义和文章自定义。当访问 post type,wordpress 会优先调用这些模板来渲染。<br>
需要注意的是,你需要在注册 post type 的时候设置 'has_archive' => true 才会有列表。<br>
现在我们就把主题里自带的 archive.php 和 single.php 文件复制一份命名为 archive-movie.php 和 single-movie.php,为了演示,这里我不做很多自定义,只是输出导演信息表示一下。<br>
我们分别在 l.56 和 l.23 附近的合适位置输出 meta box 信息:</p>
<div>
<div>
<div id="highlighter_493631">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>echo</code> <code>'导演:'</code><code>.get_post_meta( get_the_id(), </code><code>'_movie_director'</code><code>, true );</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
然后刷新访问电影列表和具体的电影就可以看到输出的导演信息了。<br>
这里只是举个例子,实际中往往会自定义结构和输出的信息格式等,这里不再进一步修改。这里不再麻烦演示了。<br>
调用 wp_query 高度自定义调用 post type 的内容<br>
上面操作依赖模板,如果需要高度自定义或者在页面的某个模块中调用列表,就需要用到 wp_query 类来调用:</p>
<div>
<div>
<div id="highlighter_18404">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
</td>
<td>
<div>
<div>
<code>$args</code> <code>= </code><code>array</code><code>( </code><code>'post_type'</code> <code>=> </code><code>'product'</code><code>, </code><code>'posts_per_page'</code> <code>=> 10 );</code>
</div>
<div>
<code>$loop</code> <code>= </code><code>new</code> <code>wp_query( </code><code>$args</code> <code>);</code>
</div>
<div>
<code>while</code> <code>( </code><code>$loop</code><code>->have_posts() ) : </code><code>$loop</code><code>->the_post();</code>
</div>
<div>
<code> </code><code>the_title();</code>
</div>
<div>
<code> </code><code>echo</code> <code>'<div>'</code><code>;</code>
</div>
<div>
<code> </code><code>the_content();</code>
</div>
<div>
<code> </code><code>echo</code> <code>'</div>'</code><code>;</code>
</div>
<div>
<code>endwhile</code><code>;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
查询出来之后就跟常规的主循环一样了,自定输出结构即可。<br><strong>在首页列表中显示自定义 post type 的内容</strong><br>
虽然我们自定义好了 post type 同时也编写了一些内容,但是在首页的列表里面并没有显示出来。自定义的 post type 的内容不会自动混入主循环里面。那如何让自定义 post type 的内容显示出来?<br>
你需要使用 pre_get_posts 这个 action 来做一些处理:</p>
<div>
<div>
<div id="highlighter_382873">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
</td>
<td>
<div>
<div>
<code>add_action( </code><code>'pre_get_posts'</code><code>, </code><code>'add_my_post_types_to_query'</code> <code>);</code>
</div>
<div>
<code>function</code> <code>add_my_post_types_to_query( </code><code>$query</code> <code>) {</code>
</div>
<div>
<code> </code><code>if</code> <code>( is_home() && </code><code>$query</code><code>->is_main_query() )</code>
</div>
<div>
<code> </code><code>$query</code><code>->set( </code><code>'post_type'</code><code>, </code><code>array</code><code>( </code><code>'post'</code><code>, </code><code>'page'</code><code>, </code><code>'movie'</code> <code>) );</code>
</div>
<div>
<code> </code><code>return</code> <code>$query</code><code>;</code>
</div>
<div>
<code>}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
在上面的 $query 变量里面设置的 post_type 数组就是要在主循环里面展示的内容,将你的自定义 post type 填写进去就可以在首页中显示出来了。<br><strong>设置自定义 post type 的固定连接</strong><br>
创建一个新的 post type 有时候也是为了更方便做 seo,所以设置它的固定连接也非常重要。这里主要用到注册 post type 的参数数组里面的 rewrite 参数,常用以下几两项:<br>
slug =》自定义固定连接结构别名,默认是使用 post type 名(例如本例的 movie),可以被翻译。一般来说 post type 名可能与实际需要的 url 不一样( post type 为 movie,但 url 可能需要 movies),就可使用该项自定义。<br>
with_front =》 固定连接是否以根目录为基础路径。如果你在固定连接设置页面设置你的结构为 /archives/,那么你的 post type 生成的连接默认为 /archives/movie 如果设置该项为 false 即可去掉前面的 /archives/ 直接基于根路径生成固定连接。<br>
大功告成,但这只是 post type 最基础的用法,post type 还有其他更高级的用法,更详细的参数配置还需要你去进一步挖掘来适应你网站的功能需求。</p>
頁:
[1]