WordPress中设置Post Type自定义文章类型的实例教程

什么是自定义post?
不要想当然的以为这里的post就是就是指博客中的文章,它只不过是一个文章类的代理词而已,甚至你还能够以为它是内容。
自定义模型是没有一个很规范的什么规则的,文章模型能够是你想的任何一个内容模型,就拿wordpress自身来说就内置了以下几个内容文章模型:

  • 博客文章
  • 页面
  • 附件
  • 修改
  • 导航等

你能够这样去了解:它只需是想咱们应用博客文章那样用来创立、编辑和贮存数据的一种很灵敏的内容方式。

不过在这里我还是需求提示下,博客内置的post还是有点点不同的,你能够利用它含有分类、标签等去标识内容的!
为什么要自定义文章模型?
Wordpress曾经提供一些欠缺的默许文章模型,并实用于大少数站点,但咱们还是需求更多的抉择。我罗列了一些我想到的一些可能有用内容模型,并链接到**应的例子。

  • 房产清单
  • 流动日历(我晓得很多人对这个感兴味)
  • 影视材料库
  • 书籍材料库
  • 没有很多集成成绩的论坛零碎
  • 相似WordPress Trac的票务零碎
  • 设计相册或作品集

你还能够想到我罗列之外的更多内容模型。而且我也想在当前学习更多对于论坛和票务零碎的想法。这两个零碎我曾经完成并心愿的失去一些反馈。

创立一个 post type
创立一个新的 Post Type 需求应用 register_post_type 函数来注册一下。需求在你主题的 functions.php 文件下调用该函数:

register_post_type( $post_type, $args );

$post_type 参数就是你自定义 Post Type 的称号,Post Type 能够自定义的性能十分多,所以这个函数外面的 $args 参数会很多。所以通常会用上面这种格局来注册:

function my_custom_post_product() {
  $args = array();
  register_post_type( 'product', $args ); 
}
add_action( 'init', 'my_custom_post_product' );

包裹在一个函数中,定义一个数组,而后挂靠到 init 这个 action 上。这样 WordPress 在初始化的时分,就会执行这个函数注册一个自定义 Post Type,由于调用 register_post_type() 的时分,必需要在 admin_menu action 之前,在 after_setup_theme action 之后,所以这里最好挂靠到 init action 上。
参数很多,为了写教程不便,只列出比拟罕用的参数,大体构造如下:

function my_custom_post_movie() {
 $labels = array(
  'name'        => _x( 'Movies', 'post type 称号' ),
  'singular_name'   => _x( 'Movie', 'post type 单个 item 时的称号,由于英文有单数' ),
  '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'     => 'Movies'
 );
 $args = array(
  'labels'    => $labels,
  'description'  => '咱们网站的电影信息',
  'public'    => true,
  'menu_position' => 5,
  'supports'   => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
  'has_archive'  => true
 );
 register_post_type( 'movie', $args );
}
add_action( 'init', 'my_custom_post_movie' );

这里为了直观不便,我间接应用了中文,更好的应该是应用英文而后经过本地化函数来翻译成中文。
参数有点多,也能够应用 generatewp 工具自定义参数,而后改改,会略微不便一点。
从下面代码能够看到 $args 数组外面有一个 labels 配置项,用来配置显示文案无关的内容,为了明晰所以独自拿进去创立了一个数组。其余配置项看下英文也能猜出大体意思,假如想要具体理解,能够看下民间文档:register_post_type 。
将下面代码加到主题 functions.php 的最上面,进入后盾你会发现多出了 Movies 选项,这样示意注册胜利:

这时分咱们能够新建 Movie 宣布一篇电影类型的文章了。然而这样与文章类型根本相反,咱们需求更多的自定义来欠缺咱们的 Movie 类型。
为 Post Type 增加分类性能
就电影来说,能够分为科幻、举措、和平等类别,那么咱们就为自定义的 Movie 增加分类性能,这样就能够编辑新分类以及归类咱们的电影了。这个分类跟文章外面的分类性质是一样的。
增加分类性能需求应用函数 register_taxonomy,应用办法也很简略,跟注册 Post Type 函数相似,只不过多了一个参数用来指定对应的 Post Type :

register_taxonomy( $taxonomy, $object_type, $args );

就本例而言,能够配置如下罕用参数:

function my_taxonomies_movie() {
 $labels = array(
  'name'       => _x( '电影分类', 'taxonomy 称号' ),
  'singular_name'   => _x( '电影分类', 'taxonomy 复数称号' ),
  '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,
  'hierarchical' => true,
 );
 register_taxonomy( 'movie_category', 'movie', $args );
}
add_action( 'init', 'my_taxonomies_movie', 0 );

增加到主题之后,咱们看到呈现了相熟的文章分类性能,只不过下面的文案全副变成咱们自定义的内容了:

这里咱们增加两个分类作为演示。
为 Post Type 增加自定义 Meta Box
咱们想要增加的电影类型不能仅仅只有注释内容,咱们还需求额定增加一些 导演 之类的无关内容。那么就需求增加自定义 Meta Box,Meta Box 能够在文章宣布页面中增加自定义的表单,编写文章的时分能够填写额定的信息而后在前端调用进去。
自定义 Meta Box 需求用到 add_meta_box 函数:

add_meta_box( $id, $title, $callback, $post_type, $context,$priority, $callback_args );

老规矩,详细参数内容查看民间文档,这里只引见罕用用法。咱们注册一个 Meta Box :

add_action( 'add_meta_boxes', 'movie_director' );
function movie_director() {
  add_meta_box(
    'movie_director',
    '电影导演',
    'movie_director_meta_box',
    'movie',
    'side',
    'low'
  );
}

而后在配置参数外面指定了回调函数 movie_director_meta_box,咱们需求在这个函数外面创立表单:

function 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 );
  ?>
  <label for="movie_director"></label>
  <input type="text" id="movie_director" name="movie_director" value="<?php echo esc_attr( $value ); ?>" placeholder="输出导演称号" >
  <?php
}

这样就能够在文章界面边栏显示进去刚刚创立的表单了:

然而这时分,你的表单是没法用的,由于你提交文章之后并没有保留这个 Meta Box 的内容,上面是验证保留内容的代码:

add_action( 'save_post', 'movie_director_save_meta_box' );
function movie_director_save_meta_box($post_id){
  // 平安反省
  // 反省能否发送了一次性暗藏表单内容(判别能否为第三者模仿提交)
  if ( ! isset( $_POST['movie_director_meta_box_nonce'] ) ) {
    return;
  }
  // 判别暗藏表单的值与之前能否相反
  if ( ! wp_verify_nonce( $_POST['movie_director_meta_box_nonce'], 'movie_director_meta_box' ) ) {
    return;
  }
  // 判别该用户能否有权限
  if ( ! current_user_can( 'edit_post', $post_id ) ) {
    return;
  }
  // 判别 Meta Box 能否为空
  if ( ! isset( $_POST['movie_director'] ) ) {
    return;
  }
  $movie_director = sanitize_text_field( $_POST['movie_director'] );
  update_post_meta( $post_id, '_movie_director', $movie_director );
}

尽管最要害的函数就在最初一句,然而肯定要留意平安的校验。把这些代码增加进 functions.php 文件之后,你的 Meta Box 就能够失常工作了。假如你需求更多表单,依照这个模式自定义表单构造,而后增加保留函数即可。
上面,咱们刻不容缓的增加两部电影《鱼与锅之战:宿命对决》 和 《鱼与锅之战:我爱水煮鱼》 内容如下:

增加完之后,咱们能够看下一切电影:

列表空荡荡的,好好看,我可不能够加上导演字段?当然能够,应用 [manage $post type posts custom column](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");
function movie_custom_columns($column){
  global $post;
  switch ($column) {
    case "movie_director":
      echo get_post_meta( $post->ID, '_movie_director', true );
      break;
  }
}
function movie_edit_columns($columns){
  $columns['movie_director'] = '导演';
  return $columns;
}

即增加了列导演字段,并从每篇文章中读取进去。这样咱们的列表就变成了:

OK,咱们的后端局部就这样欢快的实现了。关上生成好的链接看下,咦,Not Found?是这样的,假如你的网站设置了固定衔接,当你新建了 Post Type 之后,你必需要在后盾更新一下固定衔接设置才行。找到后盾固定衔接,再点击一下上面的“保留设置”,之后就能够失常拜访了。
展现 Post Type 的内容
单纯创立 Post Type 只是能够让你输出内容,没有什么意义,咱们还需求在前台输入自定义 Post Type 的内容。
自定义 Post Type 的模板和款式
依据 WordPress 的模板调用规定 咱们能够得知,咱们只要要创立 archive-[post_type].php 和 single-[post_type].php 就能够完成该 Post Type 的列表自定义和文章自定义。当拜访 Post Type,WordPress 会优先调用这些模板来渲染。
需求留意的是,你需求在注册 Post Type 的时分设置 'has_archive' => true 才会有列表。
如今咱们就把主题里自带的 archive.php 和 single.php 文件复制一份命名为 archive-movie.php 和 single-movie.php,为了演示,这里我不做很多自定义,只是输入导演信息示意一下。
咱们辨别在 L.56 和 L.23 左近的合适地位输入 Meta Box 信息:

echo '导演:'.get_post_meta( get_the_ID(), '_movie_director', true );

而后刷新拜访电影列表和详细的电影就能够看到输入的导演信息了。
这里只是举个例子,实际中往往会自定义构造和输入的信息格局等,这里不再进一步修正。这里不再费事演示了。
调用 WP_Query 高度自定义调用 Post Type 的内容
下面操作依赖模板,假如需求高度自定义或许在页面的某个模块中调用列表,就需求用到 WP_Query 类来调用:

$args = array( 'post_type' => 'product', 'posts_per_page' => 10 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
 the_title();
 echo '<p class="entry-content">';
 the_content();
 echo '</p>';
endwhile;

查问进去之后就跟惯例的主循环一样了,自定输入构造即可。
在首页列表中显示自定义 Post Type 的内容
尽管咱们自定义好了 Post Type 同时也编写了一些内容,然而在首页的列表外面并没有显示进去。自定义的 Post Type 的内容不会主动混入主循环外面。那如何让自定义 Post Type 的内容显示进去?
你需求应用 pre_get_posts 这个 action 来做一些解决:

add_action( 'pre_get_posts', 'add_my_post_types_to_query' );
function 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 数组就是要在主循环外面展现的内容,将你的自定义 Post Type 填写出来就能够在首页中显示进去了。
设置自定义 Post Type 的固定衔接
创立一个新的 Post Type 有时分也是为了更不便做 SEO,所以设置它的固定衔接也十分重要。这里次要用到注册 Post Type 的参数数组外面的 rewrite 参数,罕用以下几两项:
slug =》自定义固定衔接构造别名,默许是应用 Post Type 名(例如本例的 movie),能够被翻译。普通来说 Post Type 名可能与实际需求的 URL 不一样( Post Type 为 movie,但 URL 可能需求 movies),就可应用该项自定义。
with_front =》 固定衔接能否以根目录为根底门路。假如你在固定衔接设置页面设置你的构造为 /archives/,那么你的 Post Type 生成的衔接默许为 /archives/movie 假如设置该项为 false 即可去掉后面的 /archives/ 间接基于根门路生成固定衔接。
半途而废,但这只是 Post Type 最根底的用法,Post Type 还有其余更初级的用法,更具体的参数配置还需求你去进一步发掘来顺应你网站的性能需要。

以上就是安达网络工作室关于《WordPress中设置Post Type自定义文章类型的实例教程》的一些看法。更多内容请查看本栏目更多内容!

本文相关话题: WordPress Post Type 文章类型 PHP PHP编程
版权声明:本文为 安达网络工作室 转载文章,如有侵权请联系我们及时删除。
相关文章
优化WordPress的Google字体以减速国际效劳器上的运转

因为Google被彻底墙掉,不翻墙就无奈加载谷歌字体。很多老手冤家常常埋怨本人买的主机如何如何慢,给的示例...

WordPress提醒require_once() Failed opening required的处理办法

本文实例讲述了WordPress提醒require_once() Failed opening required的处理办法。 一、成绩: 明天进我的w...

WordPress后盾的内容治理性能

要害字形容:性能 治理 内容 后盾 文章 分类 页面 文件 能够 删除 上一次教程咱们解说了应用Wordpress来撰...

Crayon Syntaxer代码高亮插件与fancybox图片暗箱抵触的处理办法

其实,这是一个历史遗留成绩,在最开端建站的时分就曾经呈现了,在知更鸟主题和Crayon Syntaxer这个插件之间...

多个WordPress站点应用同一数据库的办法

尚未装置WordPress 在初始配置WordPress之前,将wp-config.php中的$table_prefix值(默许为wp_)修正为所需求...

更改WordPress主动生成摘要的形式

首先列表会变得很臃肿,得到了列表的自身作用&mdash;&mdash;不便用户寻觅真正想要看的帖子,其次,在搜寻引...

需求提交

客服服务