Не срабатывает действие wp_ajax в WordPress | Решение проблемы

22 апр. 2014 г., 13:31:53
Просмотры: 14K
Голосов: 2

Я пишу плагин. Хочу, чтобы метод 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 вызове. Что я делаю не так?

4
Комментарии

Эм... вам нужно закрыть PHP с помощью ?> перед добавлением JavaScript кода и снова открыть его после: <?php.

kaiser kaiser
22 апр. 2014 г. 13:51:51

Весь javascript находится в отдельном файле и добавляется с помощью wp_enqueue_script(), так что не думаю, что это проблема.

JennisDev JennisDev
22 апр. 2014 г. 15:05:21

"Добавленный файл synchandler.js:" - это часть, на которую я ссылаюсь. Если это содержимое JavaScript файла, тогда покажите нам, где вы вызываете эту функцию. Я не вижу, чтобы она где-то запускалась.

kaiser kaiser
22 апр. 2014 г. 15:20:49

Это внутри HTML-тега input, где я использую событие onclick. Попробую добавить его в вопрос (сейчас написано под последним фрагментом кода).

JennisDev JennisDev
22 апр. 2014 г. 15:29:51
Все ответы на вопрос 2
4

Где вы вызываете add_action()? Если это происходит в месте, где уже начался вывод HTML, то уже слишком поздно, и, скорее всего, это место даже не будет задействовано во время AJAX-запроса.

Вам следует добавить этот код в файл functions.php вашей темы или как можно раньше в плагине.

22 апр. 2014 г. 17:07:48
Комментарии

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

kaiser kaiser
22 апр. 2014 г. 18:52:05

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

JennisDev JennisDev
22 апр. 2014 г. 19:47:50

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

Dave Ross Dave Ross
23 апр. 2014 г. 05:26:48

Добавление этого в начало плагина исправило проблему. Спасибо!

JennisDev JennisDev
23 апр. 2014 г. 10:41:02
0

Вам нужно поместить ваш функциональный код в плагин в виде функции (это зависит от вашего способа разработки плагина).

Я предпочитаю добавлять вызовы 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' );

Не знаю, является ли это лучшей практикой - это чисто личное предпочтение, чтобы избежать добавления хуков на каждую загружаемую страницу - только на админ-страницы.

22 апр. 2014 г. 19:30:19