LINUX教程:WordPress中设置Post Type自定义文章类型的实例教程
《LINUX教程:WordPress中设置Post Type自定义文章类型的实例教程》要点: 什么是自定义post?
你可以这样去理解:它只要是想我们使用博客文章那样用来创建、编辑和储存数据的一种很灵活的内容形式. 不过在这里我还是必要提醒下,博客内置的post还是有点点不同的,你可以利用它含有分类、标签等去标识内容的!
你还可以想到我列举之外的更多内容模型.而且我也想在以后学习更多关于论坛和票务系统的想法.这两个系统我已经实现并希望的得到一些反馈. 创建一个 post type 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' ); 这里为了直观方便,我直接使用了中文,更好的应该是使用英文然后通过当地化函数来翻译成中文. 这时候我们可以新建 Movie 颁发一篇电影类型的文章了.但是这样与文章类型基本相同,我们需要更多的自定义来完善我们的 Movie 类型. 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','my_taxonomies_movie',0 ); 添加到主题之后,我们看到出现了熟悉的文章分类功能,只不过上面的文案全部变成我们自定义的内容了: 这里我们添加两个分类作为演示. 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','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 ); } 虽然最关键的函数就在最后一句,但是一定要注意平安的校验.把这些代码添加进 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,true ); break; } } function movie_edit_columns($columns){ $columns['movie_director'] = '导演'; return $columns; } 即添加了列导演字段,并从每篇文章中读取出来.这样我们的列表就变成了: OK,我们的后端部分就这样愉快的完成了.打开生成好的链接看下,咦,Not Found?是这样的,如果你的网站设置了固定连接,当你新建了 Post Type 之后,你必须要在后台更新一下固定连接设置才行.找到后台固定连接,再点击一下下面的“保存设置”,之后就可以正常拜访了. echo '导演:'.get_post_meta( get_the_ID(),true ); 然后刷新拜访电影列表和具体的电影就可以看到输出的导演信息了. $args = array( 'post_type' => 'product','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; 查询出来之后就跟常规的主循环一样了,自定输出结构即可. 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 填写进去就可以在首页中显示出来了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |