За последние 24 часа нас посетили 22205 программистов и 1060 роботов. Сейчас ищут 628 программистов ...

Не передаются данные wordpress+ajax.

Тема в разделе "Wordpress", создана пользователем Борис-ka, 14 апр 2020.

  1. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    Добрый день!
    Пытаюсь разобраться с AJAX+wordpress. Создал форму, скрипт и тестовую функцию. Но в сообщении alert все данные выводятся, а вот функция ничего не выводит. Функция ret находится в файле function.php дочерней темы. И если хуком ее цеплять в custom-template во фронтенде, то echo $title - не выводит полученное значение, которое отображается в alert. Просто это тестовая функция, в дальнейшем будет использоваться wp_insert_post() и она тоже сразу не публикует пост, а только после перезагрузки страницы.
    PHP:
    1. if(!function_exists('my_custom_script')):
    2.     function my_custom_script(){
    3.  
    4.         wp_enqueue_script( 'jquery' );
    5.         wp_enqueue_script('customajax', get_stylesheet_directory_uri() . '/js/custom.js', array(), 1.0,false
    6.       );
    7.  
    8.        wp_localize_script('customajax', 'ajjax', array(
    9.                 'url'   => admin_url( 'admin-ajax.php' ),));
    10. }
    11. endif;
    12. add_action('wp_enqueue_scripts','my_custom_script');
    13.  
    14.  
    15. if(!function_exists('ret')):
    16. function ret(){
    17.  
    18.     $title = $_POST['titleObject'];
    19.     echo $title;
    20. }
    21. endif;
    22. add_action( 'My', 'ret' );
    23. if( defined('DOING_AJAX') ){
    24. add_action('wp_ajax_qwas', 'ret');
    25. add_action('wp_ajax_nopriv_qwas', 'ret');
    26. }
    Код (Javascript):
    1. jQuery(function(jQuery) {
    2.     jQuery('#custom_button').click(function () {
    3.         jQuery.ajax({
    4.                 type: "POST",
    5.             dataType: 'json',
    6.             data: {
    7.                     action: 'qwas',
    8.                     titleObject: 5,
    9.                 },
    10.                 url: ajjax.url,
    11.                 success: function (response) {
    12.                     alert(response);
    13.                 }
    14.         });
    15.  
    16.     });
    17. });
    Буду благодарен за помощь.
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    В ajjax.url что? admin-ajax.php? Должно быть так url: '/wp-admin/admin-ajax.php',

    в data можно так , в общем вот пример:
    PHP:
    1. $('#custom_button').on('click', function() {
    2.  
    3.         $.ajax({
    4.             url: '/wp-admin/admin-ajax.php',
    5.             type: 'POST',
    6.             data: 'action=qwas&titleObject=5',
    7.             success: function( data ) {
    8.                 alert(data)
    9.             }
    10.         });
    11.     });
    dataType:'json' у тебя еще, его убери, ты строку возвращаешь

    И return не забудь, условие и лишний action убери
    PHP:
    1. add_action('wp_ajax_qwas', 'ret');
    2. add_action('wp_ajax_nopriv_qwas', 'ret');
    3.  
    4. function ret(){
    5.     $title = 'нет пост данных';
    6.  
    7.     if(isset($_POST['titleObject']))
    8.     {
    9.          $title = $_POST['titleObject'];
    10.     }
    11.  
    12.      echo $title;
    13.  
    14.     return;
    15. }
     
    #2 Artur_hopf, 14 апр 2020
    Последнее редактирование: 14 апр 2020
  3. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    В консоли в admin-ajax.php - ответ сервера 200, Request URL: http://localhost/realty/wp-admin/admin-ajax.php.
    Все вышеперечисленное поменял, но в alert данные приходят. Лишний action - это хук который выводится в custom-template во фронте, поэтому я не могу его убрать, так как сама функция находится в файле function.php. Или как-то по-другому нужно выводить? На данный момент выводится "нет пост данных", но не выводится "5", хотя в сообщении alert - 50(0 добавляет вордпресс).
     
  4. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    0 он добавляет потому что ты функцию не заканчиваешь через return;, а лучше die;
     
  5. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    return уже есть, но все равно 0. Вот когда ставишь wp_die или exit - тогда нуля нет, но и во фронте ниже этого хука все исчезает.
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Создай отдельные для ajax
    --- Добавлено ---
    глянь что вернет
    PHP:
    1. function ret(){
    2.    
    3.    echo  json_encode($_POST);
    4.     die;
    5. }
     
  7. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    Не совсем понял, что создать.
    --- Добавлено ---
    В alert {"action":"qwas","titleObject":"5"}0, во фронте выводит [], но все что ниже die исчезает.
     
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Что значит во фронте, ajax запрос работает. Что значит ниже die.
     
  9. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    В alert {"action":"qwas","titleObject":"5"}0, во фронте выводит [], но все что ниже die исчезает.
    Есть custom-template, который является главной страницей в нее я вставляю <?php do_action('My')?> и выводится [], а то, что ниже этого
    <?php do_action('My')?> исчезает (контент).
     
  10. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    Получается ajax получает обработанные данные от сервера, но как их теперь вывести на страницах вордпресс?
     
  11. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
  12. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    Чего только функция php не получает данные из $_POST? Без ajax все работает и передает.
     
  13. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    ты же писал что в алерт
     
  14. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    Нужно, чтобы в функцию в переменную, которую я потом смогу выводить где хочу. А пока только в alert, но в переменной пусто.
     
  15. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Напишите логику что вы хотите, как вы это хотите. Зачем вам там ajax. Пока какая то хрень.
     
  16. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    На главной странице есть форма, куда передаются данные для публикации поста (пусть например там будет одно поле - "заголовок"). В function.php есть скрипт, который получает этот заголовок из $_POST и передает в функцию wp_insert_post, которая создает пост с переданным заголовком. И все это делается через ajax без перезагрузки страницы. Но сейчас, выше я написал упрощенный пример без формы и взял одно данное "5", которое по факту в функцию не передается, хотя пишет ответ 200.
     
  17. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Борис-ka как не передается если вы пишите что ответ с этой функции возвращается в alert. То есть ваши данные передаются в этот скрипт.
    PHP:
    1. function ret(){
    2.    echo  json_encode($_POST); //{"action":"qwas","titleObject":"5"}
    3.    wp_die();
    4. }
    если до вас не доходит, сделайте инсерт в этой функции $_POST['titleObject'] ;
     
  18. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    В том то все и дело, что если попробовать вывести $_POST['titleObject'] (например echo $_POST['titleObject']) то ничего не выводится. Какой-то полтергейст(
     
  19. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    А это что по вашему делает echo json_encode($_POST); ?
    --- Добавлено ---
    @Борис-ka Я кажись понял что вы тупите. Вы думаете что ajax отправили данные, и типо они там лежат, пока вам не понадобятся? Нет, php так не работает.
    Вы отправляете туда данные ajax они там делают то что вам надо, и возвращают вам результат. Все, они там не хранятся.
    --- Добавлено ---
    Вы отправили пост запрос в функцию ret, она делает там что то с ними и возвращает результат. В вашем случае в ваш алерт.
    Хотите делайте там INSER хотите UPDATE , что угодно, но это выполнится здесь и сейчас, и ничего там хранится не будет.
     
  20. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    К примеру. Вот я отправил значение поля формы средствами ajax методом post в функцию ret, функция получила эти данные в $asd = $_POST['titleObject']. Могу я сейчас в этой функции php вывести их в echo $asd? Даже если я делаю вот так
    PHP:
    1. function ret()
    2.     {
    3.  
    4.         $asd = $_POST["titleObject"];
    5.         $my_post = array(
    6.             'post_title' => $asd,
    7.             'post_type' => 'post',
    8.         );
    9.          wp_insert_post( $my_post );
    10.  
    11.     };
    , то пост публикуется, но заголовок поста пустой. Т.е. как-будто в этой переменной $asd ничего нет. Но в alert(response) значение $asd почему то есть.
     
  21. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Если так вернуть, что будет?
    PHP:
    1. function ret()
    2. {
    3.         $asd = $_POST["titleObject"];
    4.         $my_post = array(
    5.             'post_title' => $asd,
    6.             'post_content'  => 'test',
    7.             'post_type' => 'post',
    8.             'post_status'  => 'publish',
    9.             'post_author'  => '1'
    10.         );
    11.      
    12.       $post_ID = wp_insert_post( $my_post );
    13.       echo $post_ID;
    14.       exit();
    15. };
     
  22. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    Если функцию подключать так
    add_action('init','ret'); - то белый экран и выводится id поста.
    Если не добавлять action то в админке в записях ничего не происходит, а если перезагрузить страницу, то появляется новый пост, как если бы без ajax.
     
  23. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    Т.е. по факту пост публикуется, но только с перезагрузкой.
     
  24. Борис-ka

    Борис-ka Новичок

    С нами с:
    22 окт 2019
    Сообщения:
    29
    Симпатии:
    0
    Попробовал без вордпресса. На сервере создал папку test в нее поместил файлы index.php в котором такой код
    PHP:
    1. <html>
    2. <head>
    3.     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    4.     <title>Document</title>
    5.     <script src="jquery-3.3.1min.js"></script>
    6.     <script src="js.js"></script>
    7. </head>
    8. <body>
    9. <h1>Нажать</h1>
    10.  
    11. <?php
    12. echo 'Данные приняты - '.$_POST['text'];
    13.  
    14. ?>
    15.  
    16. </body>
    17. </html>
    и файл js.js в котором такой код:
    Код (Javascript):
    1. $(function() {
    2.     $('h1').click(function () {
    3.         $.ajax({
    4.             url: 'index.php',         /* Куда пойдет запрос */
    5.             method: 'post',             /* Метод передачи (post или get) */
    6.                      /* Тип данных в ответе (xml, json, script, html). */
    7.             data: {text: 5},     /* Параметры передаваемые в запросе. */
    8.             success: function(data){   /* функция которая будет выполнена после успешного запроса.  */
    9.                 console.log(data);            /* В переменной data содержится ответ от index.php. */
    10.             }
    11.         });
    12. });
    13. });
    Когда нажимают "Нажать" в консоли появляется такое сообщение
    HTML:
    1.     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    2.     <title>Document</title>
    3.     <script src="jquery-3.3.1min.js"></script>
    4.     <script src="js.js"></script>
    5. </head>
    6. <h1>Нажать</h1>
    7.  
    8. Данные приняты - 5
    9. </body>
    10. </html>
    11.  
    12.  
    13.  
    , т.е. ajax вроде работает. Но вот в браузере появляется ошибка: Notice: Undefined index: text in D:\Wamp\www\tost\index.php on line 12Call Stack#TimeMemoryFunctionLocation10.0008356792{main}( )...\index.php:0. Цифра 5 не выводится.

    Может у меня WAMP как-то неправильно работает?
    Я уже начинаю сходить с ума)
     
  25. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Ща дойдет до тебя
    Напиши так
    PHP:
    1. <?php
    2.  if(isset($_POST['text']))
    3. {
    4.     echo 'Данные приняты - '.$_POST['text'];
    5.     die();
    6. }
    7. <html>
    8. <head>
    9.     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    10.     <title>Document</title>
    11.     <script src="jquery-3.3.1min.js"></script>
    12.     <script src="js.js"></script>
    13. </head>
    14. <body>
    15. <h1>Нажать</h1>
    16. </body>
    17. </html>