Не срабатывает действие wp_ajax в WordPress | Решение проблемы
Я пишу плагин. Хочу, чтобы метод get_my_option выполнялся при нажатии кнопки на странице настроек моего WordPress плагина. AJAX запрос отправляется, но метод никогда не выполняется.
На странице у меня следующий код:
<div class="wrap">
<input type="button" value="test" onclick="my_js_function();"/>
</div>
<?php
wp_enqueue_script( 'function', plugins_url( '/js/synchandler.js',__FILE__), array('jquery'));
wp_localize_script( 'function', 'my_ajax_script', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) );
function get_my_option()
{
//делаем что-то
die();
}
add_action("wp_ajax_nopriv_get_my_option", "get_my_option");
add_action("wp_ajax_get_my_option", "get_my_option");
?>
Добавленный файл synchandler.js:
function my_js_function()
{
jQuery.ajax({
url: my_ajax_script.ajaxurl,
type: 'POST',
data: ({ action: 'get_my_option', affiliate: 'daisycon' }),
success: function (response) {
console.log("got this: " + response);
}
});
}
Есть ответ, но это 0, так что JavaScript добавлен правильно, но на этом всё. В логах нет ошибок при выполнении этого кода. AjaxURL добавлен на страницу (это распространённая ошибка).
/* <![CDATA[ */
var my_ajax_script = {"ajaxurl":"http:\/\/mywebsite.net\/wp-admin\/admin-ajax.php"};
/* ]]> */
Кнопка для запуска использует onclick="my_js_function();
в HTML-теге button
.
Несмотря на простоту, метод get_my_option
не запускается при AJAX вызове. Что я делаю не так?
Где вы вызываете add_action()? Если это происходит в месте, где уже начался вывод HTML, то уже слишком поздно, и, скорее всего, это место даже не будет задействовано во время AJAX-запроса.
Вам следует добавить этот код в файл functions.php вашей темы или как можно раньше в плагине.

Как я только что увидел, что автор вопроса, кажется, добавляет код в середине страницы, я должен поддержать это. +1

Действительно. Добавление действий в functions.php сработало. Проблема, с которой я столкнулся при добавлении этого в functions.php в папке моей темы, заключается в том, что я не могу получить доступ к необходимым классам в папке плагина. Решение — перенести весь код в тему, но это делает плагин бесполезным.

Тогда просто поместите его в начало вашего плагина, вне любых других функций или классов и до начала вывода чего-либо.

Вам нужно поместить ваш функциональный код в плагин в виде функции (это зависит от вашего способа разработки плагина).
Я предпочитаю добавлять вызовы add_action
в admin_init - он также вызывается через admin-ajax.php.
wp_enqueue_script( 'function', plugins_url( '/js/synchandler.js',__FILE__), array('jquery'));
wp_localize_script( 'function', 'my_ajax_script', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
function get_my_option()
{
//сделать что-то
die();
}
function add_ajax_actions() {
add_action("wp_ajax_nopriv_get_my_option", "get_my_option");
add_action("wp_ajax_get_my_option", "get_my_option");
}
add_action( 'admin_init', 'add_ajax_actions' );
Не знаю, является ли это лучшей практикой - это чисто личное предпочтение, чтобы избежать добавления хуков на каждую загружаемую страницу - только на админ-страницы.
