AJAX запрос возвращает 0: решение проблемы

28 апр. 2016 г., 18:25:48
Просмотры: 13.5K
Голосов: 4

Несмотря на множество похожих вопросов, предложенные решения не сработали в моем случае.

У меня есть следующий скрипт:

jQuery('#term').keyup(ajaxChange);

        function ajaxChange(){
            var newFormChange = jQuery("#term").val();
            alert (newFormChange);
            jQuery.ajax({
                type:"POST",
                action: "my_test_action",
                url: "/wp-admin/admin-ajax.php",
                data: newFormChange,
                success:function(data){
                    console.log(data);
                }
            });

        return false;
        }

И PHP-код выглядит так:

function my_test_action() {

    $var = "this is a test";
    wp_send_json($var);

    die();
}

add_action( 'wp_ajax_my_test_action', 'my_test_action' );
add_action( 'wp_ajax_nopriv_my_test_action', 'my_test_action' );

Я также пробовал: echo json_encode($var) или echo $var вместо wp_send_json(), но функция всегда возвращает 0 в консоли браузера!

Другие мои AJAX-запросы работают, например, есть другой запрос, который вызывает PHP-скрипт с WP Query для вывода постов - он работает нормально.

ОБНОВЛЕНИЕ: Вот как подключен мой скрипт:

 function add_js() {

         if (is_page_template()) {
            wp_enqueue_script( 'mycustomscript', get_stylesheet_directory_uri().'/js/mycustomscript.js', array('jquery'), '1.0', true );

            wp_localize_script('mycustomscript', 'ajaxurl', admin_url( 'admin-ajax.php' ) );
        }
    }
    add_action('wp_enqueue_scripts', 'add_js');

Я думаю, проблема в переменной newFormChange, потому что jQuery(this).serialize(); изначально не работал, так как форма не отправляется, а меняется только одно её поле. Я заменил его на var newFormChange = jQuery("#term").val();, но возможно есть проблема с url: "/wp-admin/admin-ajax.php"

Где я ошибся? Спасибо.

0
Все ответы на вопрос 3
9

Обратите внимание, что action должен находиться внутри ключа data. В вашем POST-запросе отсутствует ключ с именем action, поэтому функция обратного вызова никогда не вызывается.

Рассмотрим следующий пример:

jQuery.ajax({
    type:"POST",
    url: "/wp-admin/admin-ajax.php",
    data: { 
        action: "my_test_action",
        form_data : newFormChange
    },
    success: function (data) {
        console.log(data);
    }
});

Также обратите внимание: Никогда не используйте относительный URL для Ajax, такой как /wp-admin/admin-ajax.php. Вместо этого можно использовать wp_localize_script(). Смотрите примеры.

28 апр. 2016 г. 18:37:08
Комментарии

отлично, это работает! но странно, у меня есть другой скрипт, где action находится снаружи, и он тоже работает!

Fafanellu Fafanellu
28 апр. 2016 г. 18:44:41

Пожалуйста :) Нет, вам нужно перепроверить. action - это особенность WordPress, а остальные параметры принадлежат jQuery. Вы можете увидеть здесь jQuery Ajax, что action не является допустимым ключом.

Sumit Sumit
28 апр. 2016 г. 18:49:35

если я напишу alert(newFormChange), я увижу что-то вроде "term=anything&action=my_test_action". Значит, "особенность WP" action передается как еще одна POST переменная? У меня есть еще один дополнительный вопрос: если я использую $_POST['term'] в my_test_action(), он не распознается. Хотя это правильный способ получения POST переменных с этим методом. Где я ошибаюсь?

Fafanellu Fafanellu
28 апр. 2016 г. 18:56:06

Я не уверен, где именно вы разместили alert!, но если вы видите term=anything&action=my_test_action в alert, значит это GET запрос. Поэтому вы сможете получить доступ к переменной через $_GET вместо $_POST, но мне действительно интересно, почему вы видите строку запроса вместо js объекта.

Sumit Sumit
28 апр. 2016 г. 19:56:31

Я вызвал метод serialize() на newFormChange, затем разместил alert сразу после этого. Забавно, что он отображает то, что я написал выше, даже если action определен внутри данных. Я применил ваши рекомендации в других своих скриптах и теперь не могу получить данные через $_POST[]. Странно!

Fafanellu Fafanellu
28 апр. 2016 г. 20:15:18

Понял, это было скрытое паразитное поле. Мне очень жаль, это моя ошибка. Тем не менее, я больше не могу получить доступ к своим данным $_POST[]. Когда данные были только "newFormChange", я мог обращаться к ним "нормально". Теперь единственная переменная, к которой я могу получить доступ, это $_POST['newFormChange']. Нужно ли мне парсить ее, чтобы получить отдельные поля?

Fafanellu Fafanellu
28 апр. 2016 г. 20:31:14

Именно так! Вам нужно его распарсить. Чтобы увидеть структуру получаемых данных, просто выведите их. Например, print_r($_POST);, и вы увидите, как можно получить к ним доступ. Если это строка запроса, используйте parse_str(). Надеюсь, это поможет :)

Sumit Sumit
28 апр. 2016 г. 21:16:49

Это работает, еще раз спасибо! Я спрашивал о помощи в другом месте на SE по этой конкретной теме, и мне посоветовали использовать serializeArray(), чтобы правильно получить параметры $_POST[]. Однако у меня все равно не получается. Есть ли у вас какие-то советы по этому поводу? Большое спасибо! http://wordpress.stackexchange.com/questions/225111/retrieve-post-data-from-ajax-call

Fafanellu Fafanellu
29 апр. 2016 г. 20:31:10

О боже — я передавал action как отдельное свойство, а не внутри data. Огромное спасибо!

plushyObject plushyObject
28 апр. 2017 г. 20:28:37
Показать остальные 4 комментариев
2

Похоже, есть проблема с url: "/wp-admin/admin-ajax.php", вместо этого попробуйте указать полный путь:

function addajaxurl() {
    wp_localize_script( 'frontend-ajax', 'frontendajax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' )));
}
add_action( 'wp_enqueue_scripts', 'addajaxurl' );

и используйте переменную в вашей ajax-функции:

        jQuery.ajax({
            type:"POST",
            url: ajaxurl,
            data: newFormChange,
            success:function(data){
                console.log(data);
            }
        }); 
28 апр. 2016 г. 18:34:34
Комментарии

спасибо, я протестирую это! но другие мои AJAX-запросы работают, это странно...! смотрите мое редактирование выше, у меня почти то же самое, что и у вас. Кроме того, если URL .php не был найден, в консоли должна была вернуться ошибка, не так ли?

Fafanellu Fafanellu
28 апр. 2016 г. 18:40:04

Да, похоже, ошибка с action, попробуйте убрать его

tam tam
28 апр. 2016 г. 18:46:55
0

Проблема в параметре action. В вашей JavaScript-функции попробуйте:

var newFormChange = jQuery("#term").val();

    jQuery.ajax({
                    type: "POST",
                    url: "/wp-admin/admin-ajax.php",
                    data: {
                        action: "my_test_action", // Обратите внимание на правильное название экшена
                        newFormChange: newFormChange
                    },
                    success: function(data) {
                        console.log(data);
                        alert(data);
                    }
                });

Также вам следует убрать die(); из вашей PHP-функции. Он уже содержится в wp_send_json.

28 апр. 2016 г. 18:52:51