【问题标题】:Yet another WordPress Ajax 400 Bad Request problem又一个 WordPress Ajax 400 错误请求问题
【发布时间】:2021-03-14 13:33:35
【问题描述】:

我确定我在这里犯了一个基本错误。当我尝试进行 Ajax 调用时,我收到了来自 WordPress 的可爱的 400 Bad Request 响应。我有一个有效的 Ajax 调用,而这个无效。我已经在这里和其他地方查看了几篇帖子,但对于我犯错的地方仍然感到困惑。

好的,相关代码。首先,这是我如何进行 add_action 和脚本注册:

if ($_GET["page"] == "krudkat_data_structures") {
    add_action("wp_ajax_krud_save_new_connection", "krud_save_new_connection");
}

// Other Stuff, for the Ajax call that works.

if ($_GET["page"] == "krudkat_data_structures") {
    wp_register_script("krud_data_structures", plugin_dir_url( __DIR__ ) . "/js/dataStructures.js", array("jquery"));
    wp_localize_script("krud_data_structures", "krudAjax", array( "ajaxurl" => admin_url("admin-ajax.php")));
    wp_enqueue_script("krud_data_structures");
}

这位于类之外的函数中。我的JS调用是这样的:

var krudNewConnect = { action:"krud_save_new_connection",
    dbname:$("#krud_new_dbname").val().trim(),
    dbhost:$("#krud_new_dbhost").val().trim(),
    dbconnect:$("#krud_new_dbconnect").val().trim(),
    dbusername:$("#krud_new_dbusername").val().trim(),
    dbpassword:$("#krud_new_dbpassword").val() };
$.post(krudAjax.ajaxurl, krudNewConnect, function(newConnectData) {
    console.log(newConnectData);
});

最后,到目前为止,我的 PHP 方法非常简单:

function krud_save_new_connection() {
    $dbname = $_POST["dbname"];
    $dbhost = $_POST["dbhost"];
    $dbconnect = $_POST["dbconnect"];
    $dbusername = $_POST["dbusername"];
    $dbpassword = $_POST["dbpassword"];
    $dbport = 0;
    $dbsocket = '';
    if (!empty($dbconnect)) {
        if (is_numeric($dbconnect)) {
            $dbport = $dbconnect * 1;
        } else {
            $dbsocket = $dbconnect;
        }
    }
    echo "Port: " . $dbport . "\nSocket: " . $dbsocket;
    wp_die();
}

当有人没有以管理员身份登录时,这不会起作用,所以我省略了 no_priv add_action。我确定这不是问题;我确实将它添加到我的代码中,但没有任何影响。

我犯了什么新手错误? :)

【问题讨论】:

  • 也许这回答了你的问题? stackoverflow.com/questions/64933027/…
  • 虽然我很容易出现错别字,但我在这里找不到。如果我有,请指出,但我认为我在函数名称上一直保持一致。在那篇文章的前面看,我不确定的一件事是我最关心的事情是 add_action 钩子的放置。它看起来在我看来是;带有钩子的 PHP 包含在带有 Ajax 函数的 PHP 之前。
  • 这不是执行顺序的问题。您需要在 javascript 事件发生之前添加您的钩子。最快的测试是将它移动到你的主题functions.php
  • add_action 在 register/localize/enqueue 之前。哪一部分应该移到functions.php?最终,我不想这样做;这是我正在设计的自定义插件,因此不涉及 functions.php(至少目前还没有)。
  • 我的意思是,如果您的 add_action("wp_ajax_krud_save_new_connection" 位于另一个函数中,该函数被在 admin-ajax.php 之后触发的某个钩子调用,那么您将永远不会得到成功的响应。如果您是设计一个插件,它仍然很好。将 add_action("wp_ajax_krud_save_new_connection" 移动到任何类声明之外的主插件文件(具有 WP 的特殊 cmets 标头的那个)。就像文件中的第一行或最后一行,看看是否工作:)

标签: wordpress


【解决方案1】:

首先,将脚本排入队列,然后为 ajax 本地化脚本。它将解决问题。查看法典:https://codex.wordpress.org/AJAX_in_Plugins

【讨论】:

  • 我试过了,不高兴。我颠倒了 enqueue 和 localize 行,但我仍然收到 400 Bad Request。工作的 Ajax 首先进行本地化。
猜你喜欢
  • 2019-01-12
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多