Поддержка Проблемы и решения Не создаются посты без перезагрузки

  • Добрый день! Уже который день не могу понять, почему не работает.
    На главной странице сайта создал форму добавления поста:

    <form  action="#" method="post" enctype="multipart/form-data">
                <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 ">
                  <fieldset>
                    <input type="text" class="form-control" name="titleObject" id="titleQ" placeholder="Наименование"  autocomplete="off">
                  </fieldset>
                </div>
                
    
                <button type="button" id="custom_button" class="btn btn-primary col-12">Добавить</button>
    
              </form>

    В function.php поместил такой код:

    if(!function_exists('my_custom_script')):
        function my_custom_script(){
    
            wp_enqueue_script( 'jquery' );
            wp_enqueue_script('customajax', get_stylesheet_directory_uri() . '/js/custom.js', array(), 1.0,false
          );
    
           wp_localize_script('customajax', 'ajjax', array(
                    'url'   => admin_url( 'admin-ajax.php' ),));
    }
    endif;
    add_action('wp_enqueue_scripts','my_custom_script');
    if(!function_exists('ret')) {
        function ret()
        {
            $asd = $_POST["titleObject"];
    
            $my_post = array(
                'post_title' => $asd,
                'post_content'  => 'test',
                'post_type' => 'post',
                'post_status'  => 'publish',
                'post_author'  => '1'
            );
    
            $post_ID = wp_insert_post( $my_post );
            echo $post_ID;
    
           wp_die();
        };
    
    }
    
    if( defined('DOING_AJAX') ) {
        add_action('wp_ajax_qwas', 'ret');
        add_action('wp_ajax_nopriv_qwas', 'ret');
    
    }

    В файл js:

    jQuery(function(jQuery) {
        jQuery('#custom_button').click(function () {
            var titleObject = jQuery("#titleQ").val();
            jQuery.ajax({
                    type: "POST",
                            data: {
                       action: 'qwas',
                        titleObject: titleObject,
                    },
                    url: ajjax.url,
                cache: false,
                    success: function ( response ) {
                        console.log(response);
                        }
                    });
        });
    });

    Когда ввожу данное в поле и нажимаю button в консоли вижу сообщение которое выводит id поста, но в адмике и базе данных пост сразу не создается, а только после обновления данных страниц. Но ведь должно же с помощью ajax создавать посты без перезагрузки. Не могу понять в чем причина. Буду благодарен за помощь.

Просмотр 13 ответов — с 1 по 13 (всего 13)
  • anonymized-14765447

    (@anonymized-14765447)

    bazilvazz, привет.

    Скорее всего, какой-то конфликт есть с плагином/темой/скриптом, т.к. сам по себе код работает.

    Автор bazilvazz

    (@bazilvazz)

    Спасибо за ответ. А может это быть из-за того, что тема дочерняя и как можно отыскать этот конфликт? У меня даже напрямую в базу данных($wpdb->insert) без перезагрузки не вставляются данные.

    • Ответ изменён 4 года назад пользователем bazilvazz.
    Автор bazilvazz

    (@bazilvazz)

    Создал на основе этого кода плагин. Пробовал подключать его в разные темы, все равно не работает без перезагрузки(

    anonymized-14765447

    (@anonymized-14765447)

    bazilvazz, с дочерней тоже работает.

    но в адмике и базе данных пост сразу не создается, а только после обновления данных страниц

    Чуть подробнее можете раскрыть вопрос? Что подразумевается под «обновлением страниц»?

    не работает без перезагрузки(

    Вам перезагрузка конкретно чего нужна?

    Автор bazilvazz

    (@bazilvazz)

    Мне нужно, чтобы при нажатии на button данные с формы записывались сразу в базу данных и создавался пост в админке, без перезагрузки этих страниц, на лету, асинхронно. Сейчас же при нажатии в console.log сразу появляется id поста (это делает success), но пост в админке появляется только после того как жму кнопку «обновить страницу» в браузере, то же самое и в базе данных (phpMyadmin).

    Модератор Yuri

    (@yube)

    то же самое и в базе данных (phpMyadmin).

    PMA — веб-интерфейс к БД, а не сама БД. PMA показывает юзеру то, что было в базе в момент запроса. И сам по себе, слава богам, PMA не обновляется каждую микросекунду. То же относится и к админке вордпресс.

    Автор bazilvazz

    (@bazilvazz)

    У меня просто на главной странице эти посты циклом вытягиваются и вот новый пост после нажатии button тоже сразу не появляется, а только после нажатии обновить страницу. Зачем тогда ajax, если это можно просто submit сделать с той же самой перезагрузкой? Или это как-то по другому реализовывается?

    • Ответ изменён 4 года назад пользователем bazilvazz.
    Модератор Yuri

    (@yube)

    Зачем тогда ajax, если это можно просто submit сделать с той же самой перезагрузкой?

    Хороший вопрос. Спросите того, кто заставил Вас использовать аякс 🙂

    Или это как-то по другому реализовывается?

    Вообще-то, да. Аяксное добавление записи может возвращать не бесполезный id, а обработанный контент записи, который тем же скриптом добавляется в DOM страницы. Так работают так называемые быстрые ответы на форумах. Правда, возникает путаница, когда несколько человек одновременно что-то постят. Лечится полной перезагрузкой контентной части страницы, т.е. аякс получает не один, только что добавленный юзером пост, а все посты, выводимые на странице. Это более затратно в плане ресурсов, но позволяет частично избежать коллизий. Частично потому, что у других юзеров, торчащих на той же странице, обновления контента не будет, пока они не обновят страницу принудительно или путем отправки ответа.

    Автор bazilvazz

    (@bazilvazz)

    Просто может я неправильно понимаю. Если я данные отправляю ajax в функцию php в которой содержится wp_insert_post(), то пост не должен ли сразу создаваться и циклом вордпресс выводится на странице? Или данные должны вернуться назад в ajax, а потом их выводить на страницу?

    Модератор Yuri

    (@yube)

    то пост не должен ли сразу создаваться и циклом вордпресс выводится на странице?

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

    Браузер запрашивает страницу — движок разбирает uri и делает выборку записей из БД — шаблоны формируют html страницы — сервер отдает этот html обратно браузеру — браузер формирует «картинку» (рендерит DOM) и выводит её на экран. Всё. До следующего запроса.

    AJAX запросы отличаются от обычных тем, что могут передать запрос серверу без (за|пере)грузки страницы и могут менять часть выводимой страницы, используя полученные от сервера данные. В любом случаем инициатором является браузер. Нет запроса — нет новых данных от сервера.

    Или данные должны вернуться назад в ajax, а потом их выводить на страницу?

    Не должны, а могут. Я в предыдущем посте именно это и написал.

    Автор bazilvazz

    (@bazilvazz)

    Спасибо за ответ. Получается мне эти вновь созданные посты нужно как-то «отрисовывать» в success ajax. А если в этой же функции php вместе с wp_insert_post прописать еще цикл вывода? Получится ли так — ajax передал запрос с данными — функция php создала пост и вывела на страницу этот пост. Наверное не получится, так как DOM формирует в конечном счете браузер, а используя ajax — все через него и идет.

    Модератор Yuri

    (@yube)

    Получается мне эти вновь созданные посты нужно как-то «отрисовывать» в success ajax.

    Да, получается.

    Автор bazilvazz

    (@bazilvazz)

    Спасибо за ответы, они помогли мне разобраться.

Просмотр 13 ответов — с 1 по 13 (всего 13)
  • Тема «Не создаются посты без перезагрузки» закрыта для новых ответов.