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

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

    <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)
  • bazilvazz, привет.

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

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

    • Ответ изменён 3 месяца, 3 недели назад пользователем bazilvazz.

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

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

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

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

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

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

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

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

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

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

    • Ответ изменён 3 месяца, 3 недели назад пользователем bazilvazz.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Просмотр 13 ответов — с 1 по 13 (всего 13)