从另一个管理页面访问管理页面的环境

时间:2013-12-11 作者:tfrommen

我一直在忙着思考一个问题,到目前为止,我还没有找到解决它的办法。

在管理页面A的抽象场景中,我想打印一个(全局)变量的值—不过,在管理页面B的上下文中。

在自定义用户选项页面上,我想列出为每个帖子类型注册的所有元数据库。

插件和主题都可以相对于当前页面上下文添加/删除元盒($pagenow). 因此$wp_meta_boxes global就是在这种背景下建立的


到目前为止,我已经阅读了几乎所有的钩子,阅读了很多关于AJAX的内容(正确和错误的方法),并尝试了许多我想到的不同方法。不幸的是,没有运气。

问题是,是否可以检索$wp_meta_boxes 在管理页面上post-new.php?post_type=my_super_duper_post_type, 例如,从另一个管理页面?

如果是的话,我会怎么做?

这可以通过AJAX实现吗<或者我可以欺骗插件/主题,使其认为当前页面post-new.php?post_type=my_super_duper_post_type, 例如,当我们实际上在我的选项页上时?

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

多亏了@Shazzad和@G.M.,我找到了正确的方向。

以下是我所做工作的简要概述:

JavaScript/AJAX操作

jQuery(function($) {
    for (var i = 0; i < localizedData.postTypes.length; ++i) {
        $.ajax({
            type: \'post\',
            url: \'post-new.php?post_type=\'+localizedData.postTypes[i],
            data: {
                action: \'my-plugin-action\',
                _ajax_nonce: localizedData.nonce
            },
            success: function(data) {
                if (data) {
                    doSomethingWithTheBoxes(data.metaBoxes);
                }
            }
        });
    }
});
将JavaScript文件排入“我的自定义用户选项”页面的队列
$post_types = array(
    \'post\',
    \'page\',
    \'my_custom_post_type\',
);

if (\'users\' === basename($pagenow, \'.php\'))
    add_action(\'admin_print_scripts-users_page_my-plugin-page\', \'MyPlugin_enqueue_scripts\');

function MyPlugin_enqueue_scripts() {
    $data = array(
        \'nonce\' => wp_create_nonce(\'my_plugin_nonce\'),
        \'postTypes\' => $post_types,
    );
    $handle = \'my-plugin-js\';
    wp_enqueue_script(
        $handle,
        plugin_dir_url(__FILE__).\'my-plugin.js\',
        array(\'jquery\'),
        filemtime(plugin_dir_path(__FILE__).\'my-plugin.js\'),
        true
    );
    wp_localize_script($handle, \'localizedData\', $data);
} // function MyPlugin_enqueue_scripts
设置正确的钩子来处理AJAX请求
global $pagenow;

if (\'post-new\' === basename($pagenow, \'.php\'))
    add_action(\'do_meta_boxes\', \'MyPlugin_get_meta_boxes\', PHP_INT_MAX);

function MyPlugin_get_meta_boxes($post_type) {
    if (
        \'my-plugin-action\' == filter_input(INPUT_POST, \'action\')
        && in_array($post_type, $post_types)
    ) {
        check_ajax_referer(\'my_plugin_nonce\');

        wp_send_json(array(
            \'metaBoxes\' => $GLOBALS[\'wp_meta_boxes\']
        ));
    }
} // function MyPlugin_get_meta_boxes
现在我可以得到所有actually registered 我喜欢的任何帖子类型的元框&mdash;在其他管理页面上。

SO网友:Shazzad

好吧,这可能是通过这种方式实现的。

add_action(\'add_meta_boxes_my_super_duper_post_type\', \'get_metabox_global_ajax\', 9999 );
function get_metabox_global_ajax(){
    if( isset($_GET[\'mgv\']) && $_GET[\'mgv\'] == \'1\' ){
        global $wp_meta_boxes;
        @error_reporting( 0 );
        header( \'Content-type: application/json\' );
        die( json_encode( $wp_meta_boxes ));
    }
}
现在,您可以从插件页面向post-new.php?post_type=my_super_duper_post_type&mgv=1 通过ajax,并使用wp\\u meta\\u boxesses变量返回的json响应。

结束

相关推荐

Custom ajax call returns 0

我还在搜索为什么在wordpress上进行ajax调用时得到0。我知道,当ajax调用成功时,它会返回0。我正在从ajax调用返回一些值,它返回0。这是我的代码JavaScript$.ajax({ url: \"/wp-admin/admin-ajax.php\", type: \'POST\', data:{ action: \'registerform\', name: \'John\',