WordPress Ajax всегда возвращает ошибку 404

19 авг. 2013 г., 06:36:08
Просмотры: 28.2K
Голосов: 3

Я только что взял этот код из обучающего материала. Не могу заставить его работать.

HTML (home.php)

    <form name="myform" id="myform" action="" method="POST">  
      <!-- Поле формы для имени -->
      <label for="name" id="name_label">Имя</label>  
      <input type="text" name="name" id="name" size="30" value=""/>  
      <br>
      <!-- Поле формы для email -->
      <label for="email" id="email_label">Email</label>  
      <input type="text" name="email" id="email" size="30" value=""/> 
      <br>
      <!-- Кнопка отправки -->
      <input type="submit" name="submit" value="Отправить"> 
   </form>
   <!-- Здесь мы выведем результаты из process.php -->
   <div id="results"><div>

PHP (function.php)

    function myform(){
       echo "Форма успешно отправлена: <br>Ваше имя <b>".$_POST['name']."</b> и ваш email <b>".$_POST['email']."</b><br>"; 
    }
    add_action('wp_ajax_myform', 'myform');
    add_action('wp_ajax_nopriv_myform', 'myform');

Javascript (header.php)

    <script type="text/javascript">
jQuery(document).ready(function(){
    jQuery("#myform").validate({
        debug: false,
        rules: {
            name: "required",
            email: {
                required: true,
                email: true
            }
        },
        messages: {
            name: "Пожалуйста, сообщите нам, кто вы.",
            email: "Действительный email поможет нам связаться с вами.",
        },
        submitHandler: function(form) {
            // выполнить другие действия для валидной формы
            jQuery.post('/wp-admin/admin-ajax.php', jQuery("#myform").serialize(), function(data) {
                jQuery('#results').html(data);
            });
        }
    });
});
</script>
2
Комментарии

В чем вопрос? "У меня не получается заставить это работать" — это не слишком информативный тикет.

s_ha_dum s_ha_dum
19 авг. 2013 г. 07:31:53

Ну, по сути, я спрашиваю, почему я получаю 404? Что я делаю не так?

sublimelaconic sublimelaconic
19 авг. 2013 г. 08:24:04
Все ответы на вопрос 4
3

Это было очень неприятно разобраться. Я потратил часы на эту проблему и обнаружил, что ваша ошибка находится в этом поле ввода:

<input type="text" name="name" id="name" size="30" value=""/> 

Попробуйте изменить имя поля ввода на любое другое, кроме "name", например:

<input type="text" name="user_name" id="name" size="30" value=""/> 
11 июл. 2015 г. 04:55:16
Комментарии

Да, существует список зарезервированных имен, и если вы используете одно из них в своих формах, WordPress может выдать ошибку, обычно без внятного объяснения.

Doug Cassidy Doug Cassidy
18 окт. 2015 г. 21:20:57

Невероятно. WordPress не принимает этот термин в качестве имени свойства тела POST и выдает 404?!?!?! Это просто глупо.

AJB AJB
31 дек. 2018 г. 23:42:27

Вот они: https://codex.wordpress.org/Reserved_Terms

kjones kjones
30 янв. 2019 г. 21:01:47
0

Если вы получаете ошибку 404 при AJAX-запросе, значит, указан неправильный путь. Вместо жесткого прописывания пути, используйте функцию admin_url для его формирования.

jQuery.post(<?php admin_url('admin-ajax.php') ?>, // ...

Лучше передать URL админки в JavaScript-переменную через wp_localize_script, чем выводить его напрямую в шаблоне. Например:

wp_enqueue_script('jquery');   
wp_localize_script( 'jquery', 'my_ajax_vars', array(
    'ajaxurl'       => admin_url( 'admin-ajax.php' )
);

Как правило, лучше регистрировать и подключать скрипты, а не прописывать их напрямую в шаблонах, особенно в header.php. В текущем виде ваш JavaScript загружается на каждой странице, а вряд ли он нужен везде.

19 авг. 2013 г. 16:42:47
1

В первую очередь, санируйте все ваши данные.

Во-вторых, я бы сделал так:

jQuery(function($){
    $("#myform").validate({
        debug: false,
        rules: {
            name: "required",
            email: {
                required: true,
                email: true
            }
        },
        messages: {
            name: "Пожалуйста, сообщите нам, кто вы.",
            email: "Действительный email поможет нам связаться с вами.",
        },
        submitHandler: function(form) {
            // выполните другие действия для валидной формы
            // если ваш скрипт не локализован и вы добавите его в header.php (не лучшая практика)
            $.post(
               '<?php echo admin_url('admin-ajax.php); ?>',
               form.serialize(),
               function(data){
                   // просто для проверки данных
                   console.log(data);
                   $('#results').html(data);
               }

            });
            jQuery.post('/wp-admin/admin-ajax.php', jQuery("#myform").serialize(), function(data) {
                jQuery('#results').html(data);
            });
        }
    });
});

И в вашем php-файле (functions.php):

Не забудьте добавить die(); в конце функций.

function myform(){
       echo "Форма успешно отправлена: <br>Ваше имя <b>".$_POST['name']."</b> и ваш email <b>".$_POST['email']."</b><br>"; 
       die();
    }
    add_action('wp_ajax_myform', 'myform');
    add_action('wp_ajax_nopriv_myform', 'myform');
19 авг. 2013 г. 07:23:44
Комментарии

Похоже, в этой строке есть ошибка '<?php echo admin_url('admin-ajax.php); ?>',, поэтому я изменил её на '<?php echo admin_url('admin-ajax.php'); ?>',, но всё равно получаю ошибку 404. Есть идеи, почему возникает ошибка 404?

sublimelaconic sublimelaconic
19 авг. 2013 г. 08:27:06
0

Вы забыли добавить (wp) action в форму или функцию jQuery ajax.

Добавьте <input type="hidden" name="action" value="myform"> в форму, и это подключится к вашим ajax-функциям.

23 дек. 2013 г. 14:58:02