【发布时间】: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