Javascript 使用admin-AJAX.php的AJAX请求
我正在尝试在WordPress插件中执行AJAX请求。该请求是在嵌入文章的首页上使用自定义短代码发起的 我尝试将来自和的信息结合起来 然而,在测试该方法时出现了一些问题。。。没有调用AJAX查询挂钩 以下是如何调用myJavascript 使用admin-AJAX.php的AJAX请求,javascript,php,ajax,wordpress,extjs,Javascript,Php,Ajax,Wordpress,Extjs,我正在尝试在WordPress插件中执行AJAX请求。该请求是在嵌入文章的首页上使用自定义短代码发起的 我尝试将来自和的信息结合起来 然而,在测试该方法时出现了一些问题。。。没有调用AJAX查询挂钩 以下是如何调用mypage.php脚本来进行短代码交付: add_shortcode('testshortcode', 'TestShortCodeFunction'); function TestShortCodeFunction($attributes) { ob_start();
page.php
脚本来进行短代码交付:
add_shortcode('testshortcode', 'TestShortCodeFunction');
function TestShortCodeFunction($attributes)
{
ob_start();
include(__DIR__.'/page.php');
return ob_get_clean();
}
这是我的压缩测试脚本page.php
:
<?php
add_action('wp_ajax_test', 'Test');
add_action('wp_ajax_nopriv_test', 'Test');
// do_action('wp_ajax_nopriv_test'); this calls Test()
function Test()
{
echo 'Hallo';
die();
}
?>
<script type='text/javascript'>
jQuery(document).ready(function() {
console.log("JS query started");
// The following does not call test()
jQuery.ajax({
type: "POST",
url: "http://127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=test",
success: function(data) {
console.log("Query returned: "+data);
}
});
});
</script>
根据PHP调试器,永远不会调用Test()
函数
根据网络监视器(URL)执行admin ajax.php
http://127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=test
)但返回0
根据php调试器调用Inside
admin ajax.php
do\u action('wp\u ajax\u test')
。如果您能够让这些ajax操作钩子在
好了,我们应该最后使用PHPob.*
函数
这是一个标准实现。一个JavaScript文件将在短代码回调函数中排队,并在其中触发一个document.ready
Ajax调用。使用wp\u localize\u脚本将admin ajax.php
URL传递给JS对象。查看代码注释以了解更多信息和每个WP功能的详细信息:
<?php
/**
* Plugin Name: (SO) Simple Ajax Shortcode
* Description: Fire an Ajax action when rendering a shortcode
* Author: brasofilo
* Plugin URL: https://stackoverflow.com/a/22585520/1287812
*/
add_shortcode( 'testshortcode', 'shortcode_so_22579460' );
add_action( 'wp_enqueue_scripts', 'enqueue_so_22579460' );
add_action( 'wp_ajax_Test_SO', 'Test_SO' );
add_action( 'wp_ajax_nopriv_Test_SO', 'Test_SO' );
/**
* Enqueue our script inside the shortcode
*/
function shortcode_so_22579460($attributes)
{
wp_enqueue_script( 'my-script' );
return '<h1>Check the broswer console.</h1>';
}
/**
* Register and localize our script
*/
function enqueue_so_22579460()
{
wp_register_script(
'my-script',
plugin_dir_url( __FILE__ ) . 'ajax.js',
array( 'jquery' ) // enqueue jQuery as dependency
);
// We can pass any number of PHP data to the JS 'wp_ajax' object
// Here, only the basics, Ajax URL and a security check
wp_localize_script(
'my-script',
'wp_ajax',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'ajaxnonce' => wp_create_nonce( 'ajax_post_validation' )
)
);
}
/**
* Ajax callback
*/
function Test_SO()
{
// Security check
check_ajax_referer( 'ajax_post_validation', 'security' );
// Demonstrative boolean value to return
$random = ( rand() % 2 != 0 );
if( $random )
wp_send_json_error( array( 'error' => 'Random is ODD' ) );
else
wp_send_json_success( 'Random is EVEN' );
}
下面是一个使用OOP和jQuery命令触发操作的示例。还有一个。如果您能够让这些Ajax动作挂钩在一个内部工作,我会非常惊讶。
好了,我们应该最后使用PHPob.*
函数
这是一个标准实现。一个JavaScript文件将在短代码回调函数中排队,并在其中触发一个document.ready
Ajax调用。使用wp\u localize\u脚本将admin ajax.php
URL传递给JS对象。查看代码注释以了解更多信息和每个WP功能的详细信息:
<?php
/**
* Plugin Name: (SO) Simple Ajax Shortcode
* Description: Fire an Ajax action when rendering a shortcode
* Author: brasofilo
* Plugin URL: https://stackoverflow.com/a/22585520/1287812
*/
add_shortcode( 'testshortcode', 'shortcode_so_22579460' );
add_action( 'wp_enqueue_scripts', 'enqueue_so_22579460' );
add_action( 'wp_ajax_Test_SO', 'Test_SO' );
add_action( 'wp_ajax_nopriv_Test_SO', 'Test_SO' );
/**
* Enqueue our script inside the shortcode
*/
function shortcode_so_22579460($attributes)
{
wp_enqueue_script( 'my-script' );
return '<h1>Check the broswer console.</h1>';
}
/**
* Register and localize our script
*/
function enqueue_so_22579460()
{
wp_register_script(
'my-script',
plugin_dir_url( __FILE__ ) . 'ajax.js',
array( 'jquery' ) // enqueue jQuery as dependency
);
// We can pass any number of PHP data to the JS 'wp_ajax' object
// Here, only the basics, Ajax URL and a security check
wp_localize_script(
'my-script',
'wp_ajax',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'ajaxnonce' => wp_create_nonce( 'ajax_post_validation' )
)
);
}
/**
* Ajax callback
*/
function Test_SO()
{
// Security check
check_ajax_referer( 'ajax_post_validation', 'security' );
// Demonstrative boolean value to return
$random = ( rand() % 2 != 0 );
if( $random )
wp_send_json_error( array( 'error' => 'Random is ODD' ) );
else
wp_send_json_success( 'Random is EVEN' );
}
下面是一个使用OOP和jQuery命令触发操作的示例。和一个。你能编辑这个问题以包括你的js吗?请看我更新的问题。但是,我不确定这是否重要,因为我的PHP调试器捕捉到了正确的admin-ajax.PHP调用。这就是为什么我认为JS是好的。你知道Do_action()的内部结构吗?如果它在发布的代码行返回,这意味着什么?如果您只是转到/wp admin/admin ajax.php中的任何内容,它会工作吗?action=querydata?这并不总是正确的道路。看看core是如何做到的,或者使用wp_本地化_脚本的流行插件和主题。获取路径的正确php函数是admin_url('admin ajax.php')。顺便说一句,如果这是在admin部分,那么您也只有可用的ajaxurl。log()并查看它是否是相同的输出。结果是。如果我直接调用它,则与重新编写插件页面时发生的情况相同。。。调用admin-ajax.php,使用'querydata'调用do_action(),但不调用连接的回调。这让我发疯。我所有的钩子以前都工作过:-(将js放在一个单独的文件中,使用jQuery(document).ready(function(){});而不是ext内容,并将其正确地包含在wp_enqueue_脚本中,然后应该可以工作。我在基本wordpress安装上这样做,并且工作正常。我不熟悉extjs,所以我不确定它实际上如何处理文档准备情况。你能编辑问题以包含你的js吗?请参阅我更新的问题。但是我不确定这是否正确这很重要,因为我的PHP调试器捕捉到了正确的admin-ajax.PHP调用。这就是为什么我认为JS是正确的。您知道Do_action()的内部结构吗?如果它在发布的代码行返回,这意味着什么?如果你只是转到/wp admin/admin ajax.php中的任何内容,它会起作用吗?action=querydata?这并不总是正确的路径。看看core是如何实现的,或者使用wp_本地化_脚本的流行插件和主题。获取路径的正确php函数是admin_url('admin ajax.php')顺便说一句,如果这是在管理部分,你也只需要有一个可用的ajaxurl.console.log()并查看它是否是相同的输出。结果是。如果我直接调用它,则与重新编辑插件页面时发生的情况相同…调用admin-ajax.php,do_action()使用'querydata'调用,但未调用连接的回调。这让我抓狂。我以前使用的所有挂钩:-(将js放在单独的文件中,使用jQuery(document).ready(function(){});而不是ext内容,并将其正确地包含在wp_enqueue_脚本中,然后应该可以工作。我在基本wordpress安装上这样做,并且工作正常。我不熟悉extjs,所以我不确定它实际上如何处理文档准备。很好的代码示例!谢谢!还有有用的链接!除了使用OO应用程序外,我以上面的方式实现了它roach将代码添加到我的短代码类中。首先,好的方面是:所有JS内容现在都像一个符咒一样工作,包括单独的文件、本地化和排队。现在,坏的方面是:Test_SO()仍然没有被调用。它和以前一样:一切都按预期调用(包括admin ajax.php中的do_操作('wp_ajax_Test_SO')),但没有Test_SO()。最后它说“AJAX错误:无响应”。我没有任何线索。我应该在单独的答案中发布我的类吗?很高兴知道:)在检查代码之前,让我看看要点/PasteBin:AJAX在管理端运行。如果您将回调封装在If(!is_admin()){}
,Ajax不起作用。我认为add\u shortcode
在后端是无害的。而wp\u enqueue\u脚本只在前端运行。我会将$this->shortCodeHandler=new MyShortCodeHandler;
从任何if/else
中移出。我知道,你正在尝试微管理它。太好了!我开始学习网络编程两周前。我以前从未使用过JS、PHP、JSON、AJAX、ExtJS、WP、jQuery、XAMPP或XDebug。如果没有你,我可能会迷失方向。感谢你的耐心!很棒的代码示例!谢谢!还有有用的链接!我用
jQuery(document).ready( function($)
{
var data = {
action: 'Test_SO',
security: wp_ajax.ajaxnonce
};
$.post(
wp_ajax.ajaxurl,
data,
function( response )
{
// Errors
if( !response.success )
{
// No data came back, maybe a security error
if( !response.data )
console.log( 'AJAX ERROR: no response' );
// Error from PHP
else
console.log( 'Response Error: ' + response.data.error );
}
// Success
else
console.log( 'Response Success: ' + response.data );
}
);
});