【问题标题】:Function not executing properly when being called by button click通过按钮单击调用时函数未正确执行
【发布时间】:2016-09-24 15:10:39
【问题描述】:

我有一个如下所示的 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 代码时,它可以正常工作(但这是使用查询字符串方法)。非常感谢您的帮助。

【问题讨论】:

  • clearcache.php 如何访问 WordPress 功能?
  • 你在 clearcache.php 中加载过 wordpress 吗?
  • 您真的应该考虑摆脱 PHP 文件,并改用 wp_ajax_(action) 操作。

标签: php jquery ajax wordpress transient


【解决方案1】:

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

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

当您完成 ajax 处理程序时,最好使用 die() 或更好的 wp_die()。或者,如果您要返回一些输出,您可以使用 wp_send_json()

您的ajaxurl 应始终指向 admin-ajax.php。如果您在管理员端执行此操作,ajaxurl 已经为您设置好了。如果你在前端这样做,你应该在你的functions.php中有一个如下所示的sn-p

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 请求来自正确的来源。

【讨论】:

  • 感谢 Jrod,我在问题中所做的是简化了一些事情以尝试找到问题的根本原因,但我意识到我应该提供更多详细信息,以便您可以针对您的更好地回答。例如,这是用于管理区域中的 Wordpress 插件。我实际上是在为 jQuery 使用 'wp_enqueue_scripts' 方法。尽管如此,您已经指出了我需要查看的一系列错误。您的回复非常详细,非常感谢您不知道。
【解决方案2】:

看起来您正在使用 Wordpress,但 Ajax 调用直接转到 php 文件,而之前没有引导所需的 Wordpress 文件。

在此处查看有关将 Ajax 与 Wordpress 结合使用的说明: https://codex.wordpress.org/AJAX_in_Plugins

【讨论】:

  • 嗨 Rudi,我只想感谢大家分享该链接。在阅读完所有内容后,这给了我一些示例代码,我可以测试并启动并运行。我能够重新调整它的用途以使一切正常运行哇哦!所以我很兴奋也很感谢你的帮助。我看到的主要问题是我试图将该 PHP 代码放入一个单独的文件中,并且没有在我的插件的其余部分中正确引用它。将 php 和 jQuery 操作添加到我的主插件文件夹解决了我所有的问题。
猜你喜欢
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 2019-10-03
  • 2020-12-22
  • 1970-01-01
相关资源
最近更新 更多