通过单击按钮调用时功能无法正常执行
Function not executing properly when being called by button click
我有一个 ajax 请求,如下所示:
$('#clear_cache').click(function (event) {
event.preventDefault();
var ajaxurl = "clearcache.php";
$.post(ajaxurl, function () {
$('<p>The cache was cleared successfully.</p>').insertAfter('#clear_cache');
});
});
clearcache.php 文件如下所示:
do_action( 'clear_terms', 'clear_transients' );
function clear_transients() {
global $wpdb;
$sql = "delete from {$wpdb->options}
where option_name like '_transient_cc%'";
return $wpdb->query($sql);
}
我知道 ajax 请求可以正常链接到 php 文件,因为当我清除 php 文件并单击我的按钮时,就会发出请求。我觉得我的 PHP 文件有问题,比如功能设置不正确或者我发出了错误的请求类型。但是,当我在与我的按钮所在的同一文件中测试此 php 代码时,它工作正常(但这是使用查询字符串方法)。非常感谢您的帮助。
看起来您正在使用 Wordpress,但 Ajax 调用直接转到 php 文件,之前没有引导所需的 Wordpress 文件。
在此处查看有关在 Wordpress 中使用 Ajax 的说明:
https://codex.wordpress.org/AJAX_in_Plugins
我发现这里有几处不对劲。如果您在 WordPress 中使用 ajax,您应该通过管理员 运行 ajax url.
您没有正确使用 do_action
。第一个参数是动作的名称,第二个参数应该是动作的参数。我认为您混淆了 do_action
和 add_action
。
最好在完成 ajax 处理程序后使用 die()
或更好的 wp_die()
。或者,如果您要返回一些输出,您可以使用 wp_send_json()
您的 ajaxurl
应始终指向管理员-ajax.php。如果您在管理员端执行此操作,ajaxurl
已经为您设置好了。如果您在前端执行此操作,您的 functions.php
中应该有如下片段
add_action( 'wp_enqueue_scripts', 'my_scripts' );
function my_scripts() {
// the file where your javascript is located
wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/script.js', array('jquery') );
// this makes the admin url available to your javascript
wp_localize_script( 'ajax-script', 'ajax_object',
array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
}
然后您可以在 javascript 中使用 ajax_object.ajaxurl
以获得正确的 URL。
您的 javascript 现在可能看起来像这样:
$('#clear_cache').click(function (event) {
event.preventDefault();
var data = { action: 'clear_transients' }
$.post( ajax_object.ajaxurl, data, function () {
$('<p>The cache was cleared successfully.</p>').insertAfter('#clear_cache');
});
});
如果您是 运行,请在管理员中将 ajax_object.ajaxurl
替换为 ajaxurl
。注意添加了 data
变量。这将告诉 WordPress 它应该是哪个操作 运行。
对于您的操作,您应该使用 wp_ajax_(action)
作为管理端或 wp_ajax_nopriv_(action)
作为前端。
这会将您的 ajax 处理函数更改为如下内容:
// run on the admin side
add_action( 'wp_ajax_clear_transients', 'clear_transients' );
// or run on the frontend
add_action( 'wp_ajax_nopriv_clear_transients', 'clear_transients' );
function clear_transients() {
global $wpdb;
$sql = "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_cc%'";
$wpdb->query($sql);
wp_die();
}
您的 ajax 处理程序也可以放在 functions.php.
我没有提到的一件事是 nonces. You should be using nonces for security. Nonces are used with check_ajax_referer 以确保 ajax 请求来自正确的来源。
我有一个 ajax 请求,如下所示:
$('#clear_cache').click(function (event) {
event.preventDefault();
var ajaxurl = "clearcache.php";
$.post(ajaxurl, function () {
$('<p>The cache was cleared successfully.</p>').insertAfter('#clear_cache');
});
});
clearcache.php 文件如下所示:
do_action( 'clear_terms', 'clear_transients' );
function clear_transients() {
global $wpdb;
$sql = "delete from {$wpdb->options}
where option_name like '_transient_cc%'";
return $wpdb->query($sql);
}
我知道 ajax 请求可以正常链接到 php 文件,因为当我清除 php 文件并单击我的按钮时,就会发出请求。我觉得我的 PHP 文件有问题,比如功能设置不正确或者我发出了错误的请求类型。但是,当我在与我的按钮所在的同一文件中测试此 php 代码时,它工作正常(但这是使用查询字符串方法)。非常感谢您的帮助。
看起来您正在使用 Wordpress,但 Ajax 调用直接转到 php 文件,之前没有引导所需的 Wordpress 文件。
在此处查看有关在 Wordpress 中使用 Ajax 的说明: https://codex.wordpress.org/AJAX_in_Plugins
我发现这里有几处不对劲。如果您在 WordPress 中使用 ajax,您应该通过管理员 运行 ajax url.
您没有正确使用 do_action
。第一个参数是动作的名称,第二个参数应该是动作的参数。我认为您混淆了 do_action
和 add_action
。
最好在完成 ajax 处理程序后使用 die()
或更好的 wp_die()
。或者,如果您要返回一些输出,您可以使用 wp_send_json()
您的 ajaxurl
应始终指向管理员-ajax.php。如果您在管理员端执行此操作,ajaxurl
已经为您设置好了。如果您在前端执行此操作,您的 functions.php
add_action( 'wp_enqueue_scripts', 'my_scripts' );
function my_scripts() {
// the file where your javascript is located
wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/script.js', array('jquery') );
// this makes the admin url available to your javascript
wp_localize_script( 'ajax-script', 'ajax_object',
array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
}
然后您可以在 javascript 中使用 ajax_object.ajaxurl
以获得正确的 URL。
您的 javascript 现在可能看起来像这样:
$('#clear_cache').click(function (event) {
event.preventDefault();
var data = { action: 'clear_transients' }
$.post( ajax_object.ajaxurl, data, function () {
$('<p>The cache was cleared successfully.</p>').insertAfter('#clear_cache');
});
});
如果您是 运行,请在管理员中将 ajax_object.ajaxurl
替换为 ajaxurl
。注意添加了 data
变量。这将告诉 WordPress 它应该是哪个操作 运行。
对于您的操作,您应该使用 wp_ajax_(action)
作为管理端或 wp_ajax_nopriv_(action)
作为前端。
这会将您的 ajax 处理函数更改为如下内容:
// run on the admin side
add_action( 'wp_ajax_clear_transients', 'clear_transients' );
// or run on the frontend
add_action( 'wp_ajax_nopriv_clear_transients', 'clear_transients' );
function clear_transients() {
global $wpdb;
$sql = "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_cc%'";
$wpdb->query($sql);
wp_die();
}
您的 ajax 处理程序也可以放在 functions.php.
我没有提到的一件事是 nonces. You should be using nonces for security. Nonces are used with check_ajax_referer 以确保 ajax 请求来自正确的来源。