为什么我不能从已注册的AJAX函数内部调用函数?

时间:2018-06-08 作者:coolpasta

Big discovery, check edit 3, way down.

What I\'m trying to do, in short: 基于一个AJAX调用(与用户单击相关),我正在安装一个插件。这个告诉我的PHP“安装这个插件”的按钮位于我使用的自定义页面上add_theme_page.

我在类中注册了这个函数,它可以帮助我处理AJAX请求:

public function __construct()
{
    add_action( \'wp_ajax_parse_plugin_request\', array( $this, \'parsePluginInstallRequest\' ) );
}
其功能是:

public function parsePluginInstallRequest()
{
    check_ajax_referer( \'plugin_routines\', \'security\' );
    $data = json_decode( stripslashes( $_POST[\'plugin_install_request_data\'] ), true );
    //$data is what comes when an user clicks a button, just a handle for the plugin that needs to be installed.
    $this->installPlugin( $data[\'plugin-slug\'] );
}
因此,它调用installPlugin 这只是一个快速而肮脏的“安装插件”的包装。问题是,这一行代码:

$this->installPlugin( $data[\'plugin-slug\'] );
即使使用wp_send_json 的内部installPlugin 看看它是否被调用,它是否被调用。

我的JS脚本调用了everything://这是在后端的自定义页面上调用的。函数requestPluginAction(plugin\\u数据){

    var ajaxsecurity = setup_page_params.plugins_routines_nonce

    jQuery.ajax(
        {
            url: ajaxurl,
            type: \'POST\',
            dataType: \'json\',
            data: {
                action: \'parse_plugin_request\',
                security: ajaxsecurity,
                plugin_install_request_data: plugin_data
            },

            success: function (response) {
                console.log(response);
            },

            error: function (error) {
                console.log(error);
            }
        }
    );
}
我已经检查了多次,事实上,数据传递是正确的,因此PHP可以看到它需要看到什么才能工作。

但无济于事。

注意:我正在扩展WP_Upgrader 最起码,只是WP_Upgrader_Skin 不输出任何内容,而是返回数据。

我在这些类、输出缓冲区、断点等等的所有地方都放了调试消息,但我仍然不明白它为什么会这样做。

在后端,我可以快速安装插件,一次安装3-4个,但是当调用installPlugin 来自AJAX,它什么都不做。完全

My one and only idea 当我在我的wp_ajax 挂钩功能,parsePluginInstallRequest, 现在调用install还为时过早,可以这样说:

我试图在插件没有加载/其他东西没有加载的情况下安装插件,基本上是这样parsePluginInstallRequest 连接到:wp_ajax_parse_plugin_request, 所以我在这个钩子上调用插件的安装。

这可能太早了,我的安装程序失败得很厉害,因为WordPress还没有完成。

但是,当安装在该时间点不起作用时,如何在用户单击时启动此事件进行安装?这是一个矛盾。

Edit 1:

似乎如果我在自定义页面的主要内容之前输出任何内容(使用var\\u dump),AJAX调用将不再工作,因此echowp_send_json 在我的parsePluginInstallRequest 不再工作,它会返回各种东西。

Edit 2:

我正在使用TGMPA获取插件列表,我刚刚检查过,当从AJAX上下文调用时,100%填充的插件数组是空的。

所以,如果我打电话installPlugins 从外部wp_ajax-$hook_here 上下文中,它注册了数组,并且一切正常,但是如果我从内部执行,它就看不到来自TGMPA的数组。

这让我觉得我启动AJAX的方式太早了,它没有捕获TGMA对我需要使用的数组的填充。

Edit 3: Big stuff.经过8个小时的精疲力竭,我终于到达了核心。我正在从TGMPA中提取阵列。事情是TGMPA开火了init, 现在,记住,我在一个由add_theme_page 我在这个页面上启动了我的AJAX。我的呼叫installPlugins 当用户单击我的按钮时,注册也会关闭,以此类推wp_ajax_parse_plugin_request.

事情是-我的installPlugins 它解析TGMPA的数组,如下所示:

    foreach( $plugins[\'install\'] as $plugin_key => $plugin_data ) {
        $this->upgrader->install( $plugin_data[\'source\'] );
将始终具有$plugins 空,因为TGMPA还没有填充插件,因为我们没有init 到目前为止。

所以我所做的是,继续,复制TGMPA的数组,并将该数组硬编码到installPlugins 功能和瞧,它起作用了。

所以,真正的问题是:在init, 因此$plugins 是否可以填充?

1 个回复
SO网友:Bjorn

我唯一的想法是,当我在wp\\u ajax hook\'d函数parsePluginInstallRequest中时,调用安装还为时过早,可以这样说:

我不这么认为,当调用wp\\u ajax钩子时,您的类和方法将被加载。不可能是这样的。

您的ajax看起来不错,但我总是使用这种方法:(设置nonce更容易)

<?php
add_action( \'admin_footer\', \'my_action_javascript\' );
function my_action_javascript() {
  //Set Your Nonce
  $ajax_nonce = wp_create_nonce( "my-special-string" );
  ?>
  <script>
  jQuery( document ).ready( function( $ ) {
    var data = {
      action: \'my_action\',
      security: \'<?php echo $ajax_nonce; ?>\',
      whatever: 1234
    };
    // Since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
    $.post( ajaxurl, data, function( response ) {
      alert( \'Got this from the server: \' + response );
    });
  });
  </script>
<?php } ?>
调试日志告诉你什么了吗?

<小时>

$data = json_decode( stripslashes( $_POST[\'plugin_install_request_data\'] ), true );
我猜是你调试的,但为了确定,你确定$data 之后数组正确json_decode()?

如果找不到数组键,将导致错误,函数将不会运行,但这将在调试日志中可见。。。

编辑:

好的,你提到:

TGMPA在初始化时开火。

我对TGMPA源代码不太熟悉(我知道它是做什么的),但如果它有以下内容(或类似的内容),它将永远不会工作:

if( ! wp_doing_ajax() ) {}
你查过了吗?

我从wp\\u ajax调用了许多函数,这些函数仅在init

p、 在(快速)搜索之后,我找不到任何确凿的信息wp_ajax 吊钩运行:S。。

结束