全局变量与局部变量

时间:2014-12-19 作者:lime

// MOVE REVISIONS METABOX TO BOTTOM OF EDIT-FORM.PHP
$post_types = get_post_types();
add_action(\'do_meta_boxes\', \'batteryboys_reorder_meta_boxes\');
function batteryboys_reorder_meta_boxes(){
    remove_meta_box( \'revisionsdiv\', $post_types, \'normal\' );
    add_meta_box(\'revisionsdiv\', __(\'Revisions\'), \'post_revisions_meta_box\', $post_types, \'normal\', \'low\');
}
但是,当您移动$post_types = get_post_types(); 在函数内部,它不工作。

这是因为get\\u post\\u types()函数必须是全局函数才能执行,并且通过将其包含在函数中,我将其限制在函数内部吗?换言之,它无法查询数据库,对吗?

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

正如@Milo指出的,当您在OP中使用代码时$post_types 在函数中未定义,因此WordPress将像根本不存在一样运行。

但是,这意味着您使用的是一个未定义的变量,如果turn WP_DEBUG on 你会看到一个警告,这样你就可以注意到你做错了什么。

这就是你always 应在启用调试的情况下进行开发。

关于您的问题,确实运行foreach可以是一个解决方案,但在您的情况下不需要,原因是\'do_meta_boxes\' hook pass screen id (即post类型名称)作为参数,因此您可以使用它删除和添加元数据库。

add_action(\'do_meta_boxes\', \'batteryboys_reorder_meta_boxes\', 1);

function batteryboys_reorder_meta_boxes($screen){
    if ($screen === \'dashboard\') return;
    remove_meta_box( \'revisionsdiv\', $screen, \'normal\' );
    add_meta_box(
      \'revisionsdiv\', __(\'Revisions\'), \'post_revisions_meta_box\', $screen, \'normal\', \'low\'
    );
}

SO网友:Milo

$post_types 在函数中未定义,add_meta_box 检查该值是否为null,并在操作运行时默认为当前的post类型。这就是为什么当$post_types = get_post_types(); 在外面,而实际上它什么都没做。

添加时不起作用$post_types = get_post_types(); 在函数内部,因为该函数返回一个数组和add_meta_box 必须是字符串。它不再为null,但它无效,因此它会失败。

要使其正常工作,您需要在post类型数组上循环并调用add_meta_box 对于每个:

function batteryboys_reorder_meta_boxes(){
    $post_types = get_post_types();
    foreach( $post_types as $post_type ){
        remove_meta_box( \'revisionsdiv\', $post_type, \'normal\' );
        add_meta_box(\'revisionsdiv\', __(\'Revisions\'), \'post_revisions_meta_box\', $post_type, \'normal\', \'low\');
    }
}

结束