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" 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 就可以正常工作了。如果你需要更多表单,按照这个模式自定义表单结构,然后添加保存函数即可。
下面,我们迫不及待的添加两部电影《鱼与锅之战:宿命对决》 和 《鱼与锅之战:我爱水煮鱼》 内容如下:
添加完之后,我们可以看下所有电影: