我最近写了一个WordPress插件,名为Organize Drafts, 它创建了一个称为草稿类型的自定义分类法(使用slug lswdrafttype)。此分类法用于组织页面和帖子的草稿,以及(可选)自定义帖子类型。
我的插件使用一个自定义元框,该框显示可供选择的草稿类型下拉列表。我只希望此元框出现在草稿上,而不希望出现在已发布、计划或任何其他类型的帖子/页面上。
下面是现在的情况-对于一个选秀帖子
下面是它现在的样子-对于已发布的帖子
当前代码
当前,我的插件在呈现元框的函数中检查post\\u状态,然后显示一条消息而不是下拉列表,如下所示:
public static function update_meta_boxes() {
$post_types = apply_filters(\'lsw_default_post_types\', LSW_Organize_Drafts::$post_types);
remove_meta_box( \'tagsdiv-lswdrafttype\', $post_types, \'side\' );
add_meta_box(\'lswdrafttype_custom\', __(\'Draft Type\', \'lsw_organize_drafts\'), array(\'LSW_Organize_Drafts\',
\'render_meta_box\'), $post_types, \'side\', \'core\');
}
public static function render_meta_box($post) {
if($post->post_status!==\'draft\') {
printf( esc_html__( \'Not a draft\' ));
return;
} else {
//create dropdown form
}
}
这不太理想,原因有二:
这个框仍然显示在已发布的帖子上,这太难看了创建新帖子时,最初它没有post\\u状态(我想在第一次自动保存之前),因此不会出现下拉菜单我知道我可以用Javascript删除元框,但我不知道这是否是最好的选择,我也不知道我是否应该使用Ajax来完成这项任务?
我认为,当加载edit post页面时,ajax请求将发送post\\u ID,然后ajax回调函数将检查post\\u状态。如果post\\u状态为空或草稿,则会显示该框,否则,我会将其删除。
这样做有什么陷阱吗?有更好的解决方案吗?
最合适的回答,由SO网友:Sumit 整理而成
我建议检查一下$post
对象,然后再添加元框。如果状态为,则添加元框draft
或auto-draft
.
考虑此代码
function update_meta_boxes($current_post_type, $post) {
$post_types = apply_filters(\'lsw_default_post_types\', LSW_Organize_Drafts::$post_types);
remove_meta_box( \'tagsdiv-lswdrafttype\', $post_types, \'side\' );
if (isset($post->post_status) && ($post->post_status == \'draft\' || $post->post_status == \'auto-draft\')) {
add_meta_box(\'lswdrafttype_custom\', __(\'Draft Type\', \'lsw_organize_drafts\'), array(\'LSW_Organize_Drafts\',\'render_meta_box\'), $post_types, \'side\', \'core\');
}
}
add_action( \'add_meta_boxes\', \'update_meta_boxes\', 10, 2);