Ajax создаёт и редактирует форму поста в лайтбоксе и получает результаты.

Вопрос или проблема

Итак, у меня есть сайт на WordPress, который я построил с пользовательскими типами записей и ссылками на эти типы записей внутри других.

Пример:

  • Пользовательский тип записи 1
  • Пользовательский тип записи 2 – Ссылается на тип 1 в двух полях
  • Пользовательский тип записи 3 – Ссылается на тип 2 в нескольких полях

Я настроил отображение и все работает прекрасно. Проблема в том, что мне нужно сделать так, чтобы моему клиенту было легче редактировать ссылки. Я создал ссылки для создания новых записей или редактирования выбранных в новых вкладках, но мой клиент хочет, чтобы все отображалось на одном экране, чтобы помочь ему управлять многочисленными полями типа записи. Я подумал создать страницу с ajax, чтобы возвращать форму в лайтбоксе, когда ссылка нажата. Затем, после отправки из лайтбокса, получить идентификатор для новых записей и изменить текущий выбранный элемент на новый (если создается новая запись для ссылки).

Обычно я работаю с Drupal, и это было бы элементарно с помощью drupal_get_form(), а затем делать с этим то, что я хочу, но я не могу найти документацию о том, как это сделать в WordPress. (Да, я знаю, что это не сильная сторона WordPress, но мне нужно сделать это в WordPress.) Я рассматривал возможность переписывания файла post-new.php, но я получаю экран обновления базы данных, который говорит, что в моей базе данных нет обновлений, и это очень хакерский способ делать вещи, поэтому я предпочел бы не делать этого, если это возможно.

Я нашел этот пост, который близок к тому, что мне нужно: AJAX post into pop-up div

Проблема в том, что он не создает новую запись, когда отправляется форма ajax. Я предполагаю, что это потому, что мне нужно выполнить отправку через ajax вызов WordPress, но даже это, похоже, не работает и возвращает ответ 0.

JavaScript: Форма #new-post – это та, которая загружена в лайтбоксе:

$('#new-post').submit(function (e) {
    e.preventDefault();
    var data = $(this).serializeArray();
    data['action'] = 'post_form_ajax'
    jQuery.post(ajaxurl, data, function(response) {
        alert('Получено от сервера: ' + response);
    });
});

Плагин WordPress:

add_action( 'wp_ajax_post_form_ajax', 'MYPLUGIN_post_form_ajax' );

function MYPLUGIN_post_form_ajax () {
    echo 'работает';
    wp_die();
}

Любая помощь будет очень признательна, спасибо.

Обновление

Получил форму для отправки AJAX. Мне понадобились данные в другой форме (в виде объекта), и я пропустил точку с запятой после строки data[‘action’].

Для переформатирования данных я использовал эту функцию (@см. https://stackoverflow.com/questions/1184624/convert-form-data-to-javascript-object-with-jquery)

$.fn.serializeObject = function() {
    var o = {};
    var a = this.serializeArray();
    $.each(a, function() {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
                o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
    });
    return o;
};

Затем измененная функция отправки:

$('#new-post').submit(function (e) {
    e.preventDefault();
    var data = $(this).serializeObject();
    data['action'] = 'post_form_ajax';
    jQuery.post(ajaxurl, data, function(response) {
        alert('Получено от сервера: ' + response);
    });
});

Последний шаг – выяснить, как сохранить или обновить данные пользовательской записи динамически из моей ajax функции MYPLUGIN_post_form_ajax(). Спасибо еще раз.

Вы рассматривали возможность использования плагина ACF?

С этим замечательным плагином (без связей, я просто не могу представить WP без него) у вас есть функция acf_form, чтобы отобразить любую форму контента на фронтенде, всё с обновлениями и сохранением через ajax (работает также в всплывающем окне через IFrame)

Хотя элементы боковой панели, такие как теги и категории, отсутствуют, вы можете легко заменить их пользовательскими полями ACF.

Следующий пример взят с их страницы и отлично сработал для меня:

<?php acf_form_head(); ?>
<?php get_header(); ?>

    <div id="primary">
        <div id="content" role="main">

            <?php /* Цикл */ ?>
            <?php while ( have_posts() ) : the_post(); ?>

                <h1><?php the_title(); ?></h1>

                <?php the_content(); ?>

                <?php acf_form(); ?>

            <?php endwhile; ?>

        </div><!-- #content -->
    </div><!-- #primary -->

<?php get_footer(); ?>

Не забудьте прочитать документацию, чтобы узнать, как активировать редактирование стандартных полей заголовка и текста, а не только ваших пользовательских полей, этот пример позволит вам редактировать только поля ACF

Ответ или решение

На вашем сайте на WordPress, где создаются пользовательские типы записей и ссылки на эти типы, задача упрощения процесса редактирования для вашего клиента вполне оправдана. Применение AJAX для создания и редактирования форм в всплывающем окне (lightbox) действительно является удобным решением. В этом ответе я буду пошагово объяснять, как можно реализовать данную функциональность.

1. Подготовка AJAX запроса

Первым этапом необходимо настроить AJAX-запрос, который будет отправляться при отправке формы из всплывающего окна. Вы уже начали это делать, и это хорошее начало. Помним, что необходимо указать action для вызова нужного обработчика:

$('#new-post').submit(function (e) {
    e.preventDefault();
    var data = $(this).serializeObject(); // Используйте вашу функцию для сериализации
    data['action'] = 'post_form_ajax'; // Указываем действие

    jQuery.post(ajaxurl, data, function(response) {
        alert('Получено от сервера: ' + response);
        // Здесь можно добавить логику для обновления интерфейса после успешного сохранения
    });
});

2. Реализация серверной части

Теперь нужно реализовать обработчик AJAX-запроса в вашей плагине. Ваш итоговый код может выглядеть так:

add_action( 'wp_ajax_post_form_ajax', 'MYPLUGIN_post_form_ajax' );

function MYPLUGIN_post_form_ajax() {
    // Проверяем, получен ли необходимый тип данных
    if (isset($_POST['custom_field'])) {
        // Здесь вы можете добавить логику для создания или обновления поста
        $post_data = array(
            'post_title'    => sanitize_text_field($_POST['post_title']),
            'post_content'  => sanitize_textarea_field($_POST['post_content']),
            'post_type'     => 'your_custom_post_type', // Укажите ваш пользовательский тип записи
            'post_status'   => 'publish', // Или 'draft' в зависимости от вашей логики
        );

        // Создаем или обновляем запись
        $post_id = wp_insert_post($post_data);

        if ($post_id) {
            // Дополнительно можно сохранить пользовательские поля
            update_post_meta($post_id, 'custom_field_key', sanitize_text_field($_POST['custom_field']));

            echo 'Запись успешно сохранена. ID: ' . $post_id;
        } else {
            echo 'Ошибка при сохранении записи.';
        }
    }

    wp_die(); // Обязательно вызываем эту функцию
}

3. Улучшение работы с пользовательскими полями

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

4. Подключение скриптов и стилей

Убедитесь, что скрипты и стили для вашего всплывающего окна загружаются корректно:

function my_enqueue_scripts() {
    wp_enqueue_script('jquery');
    wp_enqueue_script('my-ajax-script', plugin_dir_url(__FILE__) . 'js/my-ajax-script.js', array('jquery'), null, true);
    // Если у вас есть CSS для лайтбокса
    wp_enqueue_style('my-lightbox-style', plugin_dir_url(__FILE__) . 'css/lightbox.css');
}
add_action('wp_enqueue_scripts', 'my_enqueue_scripts');

5. Дополнительные советы

Если ваша задача выходит за рамки базового редактирования, рассмотрите возможности использования популярного плагина, такого как Advanced Custom Fields (ACF), который значительно упрощает создание форм для работы с пользовательскими полями. ACF позволяет использовать AJAX для динамического обновления данных без необходимости ручного кода.

Заключение

Реализация AJAX для создания и редактирования постов в WordPress через всплывающее окно — это весьма эффективный подход, который улучшит пользовательский опыт для вашего клиента. Убедитесь, что используете все возможности платформы и встроенные функции для оптимизации работы вашего решения. Обратите внимание на аспекты безопасности и надёжности при обработке данных на сервере, включая валидацию и очистку.

Если у вас возникнут дополнительные вопросы или понадобится помощь, не стесняйтесь обращаться. Удачи с вашим проектом!

Оцените материал
Добавить комментарий

Капча загружается...