php - 通过单击按钮调用时函数无法正确执行

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

最佳答案

我发现这里有一些问题。如果您在 WordPress 中使用 ajax,您应该通过管理 ajax url 运行它。

您没有正确使用do_action。第一个参数是操作的名称,第二个参数应该是操作的参数。我认为您将 do_actionadd_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' ) ) );
}

然后您可以在 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 。为了安全起见,您应该使用随机数。随机数与 check_ajax_referer 一起使用确保 ajax 请求来自正确的来源。

关于php - 通过单击按钮调用时函数无法正确执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37463810/

相关文章:

php - 将一个父级和多个相同的子级转换为 xml

php - 在 Wordpress 模板 WP Clarion 上调整导航栏大小

php - 如何检查数据库中已有的空表

javascript - 使用表中的 jquery 填充选择选项按钮

javascript - AngularJS 在指令中添加 ng-click

javascript - 使用 InnerHTML 加载 html 页面时保持 CSS 样式

php - 在 zend 中编写更新查询

jquery动画: change span color not working

javascript - 按钮 JQuery 事件只工作一次,为什么?

php - Post 请求中未定义索引