按下按钮

时间:2016-05-26 14:30:46

标签: php jquery ajax wordpress 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');
      });
  });

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请求正在链接ok到php文件,因为当我清除php文件并单击我的按钮时,请求就完成了。我觉得我的PHP文件有问题,比如函数设置不正确或者我的请求类型错误。然而,当我在与我的按钮所在的文件相同的文件中测试出这个PHP代码时,它工作正常(但这是使用查询字符串方法)。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

我在这里看到了一些错误。如果你在WordPress上使用ajax,你应该通过admin ajax url运行它。

您没有正确使用do_action。第一个参数是动作的名称,第二个参数应该是动作的参数。我认为您将do_actionadd_action混为一谈。

完成ajax处理程序后,使用die()或更好wp_die()的最佳做法。或者,如果您要返回某些输出,则可以使用wp_send_json()

您的ajaxurl应始终指向admin-ajax.php。如果您在管理员端执行此操作ajaxurl已经为您设置。如果您在前端执行此操作,则应在函数中添加如下所示的代码段.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来获取正确的网址。

您的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。你应该使用nonce来保证安全。 Nonce与check_ajax_referer一起使用,以确保ajax请求来自正确的源。

答案 1 :(得分:0)

看起来你正在使用Wordpress,但是Ajax调用直接转到php文件而不需要引导所需的Wordpress文件。

在这里查看有关在Wordpress中使用Ajax的说明: https://codex.wordpress.org/AJAX_in_Plugins