use*_*132 1 php ajax wordpress jquery transient
我有一个看起来像这样的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');
});
});
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
我知道ajax请求正在链接ok到php文件,因为当我清除php文件并单击我的按钮时,请求就完成了.我觉得我的PHP文件有问题,比如函数设置不正确或者我的请求类型错误.然而,当我在与我的按钮所在的文件相同的文件中测试出这个PHP代码时,它工作正常(但这是使用查询字符串方法).非常感谢您的帮助.
我在这里看到了一些错误.如果你在WordPress上使用ajax,你应该通过admin ajax url运行它.
你没有do_action正确使用.第一个参数是动作的名称,第二个参数应该是动作的参数.我想你混淆了do_action用add_action.
当你完成ajax处理程序时,最好的做法是使用die()或更好wp_die().或者,如果您要返回一些输出,则可以使用wp_send_json()
你ajaxurl应该始终指向admin-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' ) ) );
}
Run Code Online (Sandbox Code Playgroud)
然后ajax_object.ajaxurl,您可以在javascript中使用以获取正确的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');
});
});
Run Code Online (Sandbox Code Playgroud)
如果你在管理员中运行它只需替换ajax_object.ajaxurl为ajaxurl.注意添加data变量.这将告诉WordPress它应该运行哪个动作.
对于您的操作,您应该使用wp_ajax_(action)for admin端或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();
}
Run Code Online (Sandbox Code Playgroud)
您的ajax处理程序也可以放在functions.php中.
我没有提到的一件事是nonces.你应该使用nonce来保证安全.Nonce与check_ajax_referer一起使用以确保ajax请求来自正确的源.