自定义帖子类型,只有我的元框

时间:2017-03-16 作者:AncientRo

我正在开发一个插件,我为它创建了一个自定义的帖子类型,并在帖子页面上创建了几个元框。

然而,我的主题似乎是在所有自定义帖子类型的页面上添加一个广告元框(升级到我们的高级主题等)。

我认为这是一种滥用,我不想在我的帖子类型页面上使用那个元框或任何其他外部元框,只想添加那些元框。

如何清除除我自己的元框之外的所有元框?

Edit: 我正在寻找一种解决这一问题的一般方法。如果我向公众部署插件,我想确保在我的帖子页面上没有来自其他主题和插件的其他元框,如果可能的话。

2 个回复
SO网友:Paul \'Sparrow Hawk\' Biron

您可以使用remove_meta_box() 要做到这一点。

使用remove_meta_box() 您需要3条信息:

id 要删除的元框的screen (或屏幕)要将其从context 它被添加到(例如,“side”、“normal”等)要获取这3条信息,请通过源代码搜索主题add_meta_box() 用于添加元框的调用。

如果不明显,一定要打电话remove_meta_box() 在被触发的动作中after 添加元框的任何操作。

例如,如果主题看起来像:

add_action (\'after_theme_setup\', \'add_theme_meta_boxes\') ;

function
add_theme_meta_boxes ()
{
    add_meta_box (\'ad-to-upgrade-to-pro\', \'Upgrade to Pro\', \'render_upgrade_ad\', \'post\', \'normal\', \'high\') ;

    return ;
}
your插件应包含以下内容:

// make sure you hook to an action that is fired *after* the meta box was added
add_action (\'init\', \'remove_theme_ad_meta_box\') ;

function
remove_theme_ad_meta_box ()
{
    remove_meta_box (\'ad-to-upgrade-to-pro\', \'post\', \'normal\') ;

    return ;
}
编辑以回答评论中提出的问题:不可能absolutely 确保没有其他主题/插件添加元框。

此外,像WP这样的开放系统not 做你想做的事是个好主意(IMHO)。在野外有一大堆“通用”插件,它们有合法的理由向您的CPT中添加元框post{,-new}.php 屏幕。

例如WordPress SEO 插件为任何“可查看”的帖子类型添加了一个元框,允许将与SEO相关的元数据添加到帖子的公共页面(注:提及WordPress SEO是not 这只是我第一次想到的背书)。

SO网友:Jory Hogeveen

除了上述答案。现有元框有全局变量可用。您还可以在您的CPT上找到最新的操作/过滤器挂钩(可能是do_meta_boxes) 把所有东西都拿走。

全球:global $wp_meta_boxes;

看看remove_meta_box 其工作原理函数:https://developer.wordpress.org/reference/functions/remove_meta_box/

所以会是这样的:

add_action( \'do_meta_boxes\', \'my_metabox_hack\', 99, 3 );

function my_metabox_hack( $post_type, $cur_context, $post ) {
    global $wp_meta_boxes;

    $screen_id = \'YOUR_SCREEN_ID\';
    // Remove anything there
    foreach ( $wp_meta_boxes[$screen_id] as $context => $priorities ) {
        if ( $context !== $cur_context ) {
            continue;
        }
        if ( empty( $priorities ) ) {
            $wp_meta_boxes[$screen_id][$context] = array();
            continue;
        }
        foreach ( $priorities as $priority => $metabox_id ) {
            $wp_meta_boxes[$screen_id][$context][$priority] = array();
        }
    }

    // Now add your own metaboxes bases on the $cur_context parameter.
    // add_meta_box( $id, $title, $callback, $screen, etc.... )
}

Keep in mind that this clobal contains ALL meta boxes, not just for CPT\'s!

我认为这是一种黑客行为,所以在使用这种方法时请非常小心。这不是WP代码标准,如果使用不当,可能会破坏其他插件/功能。

EDIT: 我还添加了行动优先级。您可以将其设置得更高,以确保此操作像上次一样完成。

EDIT2 还请记住,此操作可以多次激发,每个操作有3个参数$context. 修改了代码以反映这一点。

相关推荐

仅为主页显示Metabox

我将尝试使用设置字段将metabox添加到主页,但出现问题,请帮助我。删除时,metabox不会显示在页面编辑器中if statement 它显示在所有页面上。add_action(\'add_meta_boxes\', \'metabox_homepage_videos\'); function metabox_homepage_videos($post) { if (is_front_page()): add_meta_box(\'metabox