创建一个新的 Post Type 需要使用 register_post_type 函数注,在你主题的 functions.php 文件下调用该函数:
register_post_type( $post_type, $args ); //$post_type 参数就是你自定义 Post Type 的名称。 function my_custom_post_product() { $args = array(); register_post_type( 'product', $args ); } add_action( 'init', 'my_custom_post_product' );
参数很多,为了写教程方便,只列出比较常用的参数,大体结构如下:
function my_custom_post_site() { $labels = array( 'name' => _x( '网址导航', 'post type 名称' ), 'singular_name' => _x( '网址', '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' => '网址' ); $args = array( 'labels' => $labels, 'description' => '网址信息', 'public' => true, 'menu_position' => 5, 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ), 'has_archive' => true ); register_post_type( 'site', $args ); } add_action( 'init', 'my_custom_post_site' );
将上面代码加到主题 functions.php 的最下面,进入后台你会发现多出了 site 选项,这样表示注册成功:

这时候我们可以新建 site发表一篇电影类型的文章了。但是这样与文章类型基本相同,我们需要更多的自定义来完善我们的 site类型。
添加分类功能需要使用函数 register_taxonomy,使用方法也很简单,跟注册 Post Type 函数类似,只不过多了一个参数用来指定对应的 Post Type :
register_taxonomy( $taxonomy, $object_type, $args );
就本例而言,可以配置如下常用参数:
function my_taxonomies_site() { $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( 'sitecat', 'site', $args ); } add_action( 'init', 'my_taxonomies_site', 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', 'site_director' ); function site_director() { add_meta_box( 'site_director', '网址链接', 'site_director_meta_box', 'site', 'side', 'low' ); }
然后在配置参数里面指定了回调函数 site_director_meta_box,我们需要在这个函数里面创建表单:
function site_director_meta_box($post) { // 创建临时隐藏表单,为了安全 wp_nonce_field( 'site_director_meta_box', 'site_director_meta_box_nonce' ); // 获取之前存储的值 $value = get_post_meta( $post->ID, '_site_director', true ); ?> <label for="site_director"></label> <input type="text" id="site_director" name="site_director" value="<?php echo esc_attr( $value ); ?>" placeholder="输入网址链接" > <?php } add_action( 'save_post', 'site_director_save_meta_box' ); function site_director_save_meta_box($post_id){ // 安全检查 // 检查是否发送了一次性隐藏表单内容(判断是否为第三者模拟提交) if ( ! isset( $_POST['site_director_meta_box_nonce'] ) ) { return; } // 判断隐藏表单的值与之前是否相同 if ( ! wp_verify_nonce( $_POST['site_director_meta_box_nonce'], 'site_director_meta_box' ) ) { return; } // 判断该用户是否有权限 if ( ! current_user_can( 'edit_post', $post_id ) ) { return; } // 判断 Meta Box 是否为空 if ( ! isset( $_POST['site_director'] ) ) { return; } $site_director = sanitize_text_field( $_POST['site_director'] ); update_post_meta( $post_id, '_site_director', $site_director ); }
添加自定义字段:
add_action("manage_posts_custom_column", "site_custom_columns"); add_filter("manage_edit-site_columns", "site_edit_columns"); function site_custom_columns($column){ global $post; switch ($column) { case "site_director": echo get_post_meta( $post->ID, '_site_director', true ); break; } } function site_edit_columns($columns){ $columns['site_director'] = '网址'; return $columns; }
显示 Meta Box 内容
echo '网址:'.get_post_meta( get_the_ID(), '_site_director', true );
调用 WP_Query 高度自定义调用 Post Type 的内容
$args = array( 'post_type' => 'site', 'posts_per_page' => 10 ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); the_title(); echo ' <div class="entry-content">'; the_content(); echo '</div>'; endwhile;