Я пишу плагин WordPress (используя шаблон, рекомендованный в официальной документации), и мне нужно включить запрос AJAX для заполнения DataList.Я придерживаюсь соглашения WP о отправке моих запросов AJAX в «admin-ajax.php».
Моя проблема в том, что, выполнив все «по книге», я не могу заставить его работать: ответс сервера всегда 0 (по умолчанию).Серверный метод для обработки запроса не запускается.Я думаю, что это не «зацепило» вообще.И я знаю, что запрос входит в файл «admin-ajax».
Странная вещь в том, что когда я подключаю этот метод к «init» и обрабатываю все запросы AJAX в этой функции, он работает отлично.Итак, я почти уверен, что проблема в динамических хуках «wp_ajax _ {$ action}» и «wp_ajax_nopriv _ {$ action}».Есть идеи?
Заранее спасибо.
Вот выдержка из моего кода:
PHP
<?php
private function define_public_hooks() {
$plugin_public = new SR_Public($this->get_plugin_name(), $this->get_version());
$this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_scripts');
$this->loader->add_action('wp_ajax_sr_get_titles', $plugin_public, 'process_get_titles');
$this->loader->add_action('wp_ajax_nopriv_sr_get_titles', $plugin_public, 'process_get_titles');
}
public function enqueue_scripts() {
wp_enqueue_script(
$this->plugin_name,
PLUGIN_DIR_URL . 'public/js/sr-public.js',
array('jquery'),
$this->version
);
wp_localize_script(
$this->plugin_name,
'localizedData',
array(
'ajaxUrl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('sr_get_titles'),
)
);
}
public function process_get_titles() {
if ((!empty($_POST['action'])) && ($_POST['action'] === 'sr_get_titles')) {
check_ajax_referer('sr_get_titles');
// Load some data in $some_array...
wp_send_json($some_array);
}
}
JS
jQuery(document).ready(function($) {
"use strict";
var titleInput = $("#sr-title");
var titleDataList = $("#sr-requested-titles");
function ajaxRequest() {
var userInput = titleInput.val();
if (userInput.trim() !== "") {
$.ajax({
type: "POST",
dataType: "json",
url: localizedData.ajaxUrl,
data: {_ajax_nonce: localizedData.nonce, action: "sr_get_titles", user_input: userInput},
success: processSuccessResponse
});
}
}
function processSuccessResponse(data) {
if (data) {
titleDataList.empty();
data.forEach(function(item) {
titleDataList.append($("<option>").val(item));
});
}
}
titleInput.keyup(ajaxRequest);
});