WordPress中设置Post Type自定义文章类型的实例教程
|
什么是自定义post#63;
你可以这样去理解:它只要是想我们使用博客文章那样用来创建、编辑和储存数据的一种很灵活的内容形式。 不过在这里我还是需要提醒下,博客内置的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' =gt; _x( 'Movies', 'post type 名称' ),
'singular_name' =gt; _x( 'Movie', 'post type 单个 item 时的名称,因为英文有复数' ),
'add_new' =gt; _x( '新建电影', '添加新内容的链接名称' ),
'add_new_item' =gt; __( '新建一个电影' ),
'edit_item' =gt; __( '编辑电影' ),
'new_item' =gt; __( '新电影' ),
'all_items' =gt; __( '所有电影' ),
'view_item' =gt; __( '查看电影' ),
'search_items' =gt; __( '搜索电影' ),
'not_found' =gt; __( '没有找到有关电影' ),
'not_found_in_trash' =gt; __( '回收站里面没有相关电影' ),
'parent_item_colon' =gt; '',
'menu_name' =gt; 'Movies'
);
$args = array(
'labels' =gt; $labels,
'description' =gt; '我们网站的电影信息',
'public' =gt; true,
'menu_position' =gt; 5,
'supports' =gt; array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
'has_archive' =gt; 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' =gt; _x( '电影分类', 'taxonomy 名称' ),
'singular_name' =gt; _x( '电影分类', 'taxonomy 单数名称' ),
'search_items' =gt; __( '搜索电影分类' ),
'all_items' =gt; __( '所有电影分类' ),
'parent_item' =gt; __( '该电影分类的上级分类' ),
'parent_item_colon' =gt; __( '该电影分类的上级分类:' ),
'edit_item' =gt; __( '编辑电影分类' ),
'update_item' =gt; __( '更新电影分类' ),
'add_new_item' =gt; __( '添加新的电影分类' ),
'new_item_name' =gt; __( '新电影分类' ),
'menu_name' =gt; __( '电影分类' ),
);
$args = array(
'labels' =gt; $labels,
'hierarchical' =gt; true,
);
register_taxonomy( 'movie_category', 'movie', $args );
}
add_action( 'init', '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',
'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-gt;ID, '_movie_director', true );
#63;gt;
lt;label for="movie_director"gt;lt;/labelgt;
lt;input type="text" id="movie_director" name="movie_director" value="lt;#63;php echo esc_attr( $value ); #63;gt;" placeholder="输入导演名称" gt;
lt;#63;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 就可以正常工作了。如果你需要更多表单,按照这个模式自定义表单结构,然后添加保存函数即可。
添加完之后,我们可以看下所有电影:
(编辑:PHP编程网 - 金华站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |






