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调用将不再工作,因此
echo 或
wp_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 是否可以填充?