Вопрос или проблема
Итак, у меня есть сайт на 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 через всплывающее окно — это весьма эффективный подход, который улучшит пользовательский опыт для вашего клиента. Убедитесь, что используете все возможности платформы и встроенные функции для оптимизации работы вашего решения. Обратите внимание на аспекты безопасности и надёжности при обработке данных на сервере, включая валидацию и очистку.
Если у вас возникнут дополнительные вопросы или понадобится помощь, не стесняйтесь обращаться. Удачи с вашим проектом!