根据帖子状态删除WordPress Meta Box的最佳方法

时间:2016-02-01 作者:Linnea Huxford

我最近写了一个WordPress插件,名为Organize Drafts, 它创建了一个称为草稿类型的自定义分类法(使用slug lswdrafttype)。此分类法用于组织页面和帖子的草稿,以及(可选)自定义帖子类型。

我的插件使用一个自定义元框,该框显示可供选择的草稿类型下拉列表。我只希望此元框出现在草稿上,而不希望出现在已发布、计划或任何其他类型的帖子/页面上。

下面是现在的情况-对于一个选秀帖子

enter image description here

下面是它现在的样子-对于已发布的帖子

enter image description here

当前代码

当前,我的插件在呈现元框的函数中检查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
    }
}
这不太理想,原因有二:

这个框仍然显示在已发布的帖子上,这太难看了

我认为,当加载edit post页面时,ajax请求将发送post\\u ID,然后ajax回调函数将检查post\\u状态。如果post\\u状态为空或草稿,则会显示该框,否则,我会将其删除。

这样做有什么陷阱吗?有更好的解决方案吗?

1 个回复
最合适的回答,由SO网友:Sumit 整理而成

我建议检查一下$post 对象,然后再添加元框。如果状态为,则添加元框draftauto-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);

相关推荐

自定义Metabox数据在Admin Init上的查询速度较慢

最近,我的数据库在Post和Posteta中都变得非常大,当访问WP admin时,它在init上加载了大约700mb的数据,这会减慢整个后端的速度。我发现大量数据是从自定义metabox init生成的。我使用以下方法加载带有WP\\U查询获取的数据的自定义Select元数据库:add_filter( \'rwmb_meta_boxes\', \'Theme2035_register_meta_boxes\' ); function Theme2035_register_meta_bo