В современных проектах на WordPress часто возникает задача хранения нескольких вариантов одного поста или страницы — например, для A/B тестирования, временного сохранения изменений или создания черновиков с разными вариантами контента. В этой статье мы рассмотрим, как автоматизировать хранение вариантов постов в WordPress, используя возможности WPengine и кастомный код.
Почему важно хранить варианты постов в WordPress
Часто при работе с контентом возникают ситуации, когда нужно подготовить несколько версий одной и той же записи. Это может быть полезно для:
- Проведения A/B тестов разных заголовков и текстов.
- Сохранения нескольких черновиков для согласования с редакторами.
- Подготовки временных версий для сезонных акций или событий.
Стандартный функционал WordPress предлагает ревизии постов, но он не всегда удобен для управления разными вариантами с возможностью быстрого переключения. Поэтому мы создадим решение, которое будет работать как система хранения альтернативных версий постов.
Использование пользовательских типов записей и метаданных для вариантов
Для начала создадим отдельный пользовательский тип записей для вариантов постов. Это позволит нам отделить основные записи от альтернативных вариантов и обеспечит удобный интерфейс для управления.
Добавим следующий код в файл functions.php вашей темы или в плагин:
function wpengine_register_post_variants_cpt() {
$args = array(
'labels' => array(
'name' => 'Варианты постов',
'singular_name' => 'Вариант поста',
'add_new_item' => 'Добавить новый вариант поста'
),
'public' => false,
'show_ui' => true,
'supports' => array('title', 'editor', 'custom-fields'),
'capability_type' => 'post',
'hierarchical' => false,
);
register_post_type('post_variant', $args);
}
add_action('init', 'wpengine_register_post_variants_cpt');Этот код создаст новый тип записей post_variant, который не будет виден на публичной части сайта, но будет доступен в админке для управления вариантами.
Далее для связи варианта с основным постом используем метаполе _wpengine_variant_of, в котором будем хранить ID основного поста.
Создание интерфейса сохранения варианта поста
Чтобы ускорить работу редакторов, можно добавить метабокс на страницу редактирования поста, который позволит создавать и переключаться между вариантами.
function wpengine_add_variant_metabox() {
add_meta_box('wpengine_variant_box', 'Варианты постов', 'wpengine_render_variant_metabox', 'post', 'side', 'high');
}
add_action('add_meta_boxes', 'wpengine_add_variant_metabox');
function wpengine_render_variant_metabox($post) {
$variants = get_posts(array(
'post_type' => 'post_variant',
'meta_key' => '_wpengine_variant_of',
'meta_value' => $post->ID,
'posts_per_page' => -1
));
echo '<ul>';
foreach ($variants as $variant) {
echo '<li><a href="edit.php?post_type=post_variant&page=edit&post=' . $variant->ID . '">' . esc_html($variant->post_title) . '</a></li>';
}
echo '</ul>';
echo '<a href="#" id="wpengine-create-variant" class="button">Создать новый вариант</a>';
echo '<script>
jQuery(document).ready(function($) {
$("#wpengine-create-variant").on("click", function(e) {
e.preventDefault();
$.post(ajaxurl, {
action: "wpengine_create_variant",
post_id: ' . $post->ID . '
}, function(response) {
if(response.success) {
window.location.href = response.data.edit_link;
} else {
alert("Ошибка при создании варианта.");
}
});
});
});
</script>';
}
function wpengine_ajax_create_variant() {
if (!current_user_can('edit_posts')) {
wp_send_json_error();
}
$post_id = intval($_POST['post_id']);
$post = get_post($post_id);
if (!$post) {
wp_send_json_error();
}
$variant_post = array(
'post_title' => $post->post_title . ' (Вариант)',
'post_type' => 'post_variant',
'post_status' => 'draft',
'post_content' => $post->post_content
);
$new_variant_id = wp_insert_post($variant_post);
if (is_wp_error($new_variant_id)) {
wp_send_json_error();
}
update_post_meta($new_variant_id, '_wpengine_variant_of', $post_id);
$edit_link = get_edit_post_link($new_variant_id, '');
wp_send_json_success(array('edit_link' => $edit_link));
}
add_action('wp_ajax_wpengine_create_variant', 'wpengine_ajax_create_variant');Этот код добавит метабокс с возможностью создания новых вариантов поста. При клике создается черновик варианта с копией содержимого основного поста.
Автоматическая публикация выбранного варианта на сайте
Чтобы на сайте выводился не основной пост, а выбранный вариант, можно использовать фильтр the_content и функцию, которая будет подменять контент поста на контент варианта, если он задан.
function wpengine_filter_content_by_variant($content) {
if (is_singular('post')) {
global $post;
$variant_id = get_post_meta($post->ID, '_wpengine_active_variant', true);
if ($variant_id) {
$variant_post = get_post($variant_id);
if ($variant_post && $variant_post->post_status === 'publish') {
return apply_filters('the_content', $variant_post->post_content);
}
}
}
return $content;
}
add_filter('the_content', 'wpengine_filter_content_by_variant');Для управления активным вариантом можно добавить пользовательские поля или отдельный интерфейс в админке, где выбирается ID варианта для публикации.
Использование WPengine для расширенной автоматизации и безопасности
WPengine предоставляет мощные инструменты для автоматизации рабочих процессов, в том числе:
- Планировщик задач WP-Cron для автоматического переключения вариантов по расписанию.
- Мониторинг производительности и логирование, чтобы отслеживать использование вариантов и их влияние на сайт.
- Инструменты бэкапа и восстановления, чтобы безопасно экспериментировать с вариантами без потери данных.
Например, можно создать задачу, которая каждую ночь будет переключать активный вариант на следующий, предварительно проверяя его статус и качество. Это позволит автоматически проводить A/B тестирование.
Пример планировщика переключения варианта
function wpengine_schedule_variant_switch() {
if (!wp_next_scheduled('wpengine_variant_switch_event')) {
wp_schedule_event(time(), 'daily', 'wpengine_variant_switch_event');
}
}
add_action('wp', 'wpengine_schedule_variant_switch');
function wpengine_handle_variant_switch() {
// Здесь логика выбора следующего варианта и обновления метаполя _wpengine_active_variant
}
add_action('wpengine_variant_switch_event', 'wpengine_handle_variant_switch');Этот пример показывает, как создать ежедневное событие для переключения вариантов. Логику выбора следующего варианта можно адаптировать под ваши задачи.
Интеграция с плагином Clearfy Pro для оптимизации работы с вариантами
Плагин Clearfy Pro поможет оптимизировать работу WordPress при хранении множества вариантов, отключая ненужные функции и снижая нагрузку на базу данных. Это особенно актуально для сайтов с большим количеством вариантов и сложной логикой.
Выводы и рекомендации
Автоматизация хранения и управления вариантами постов в WordPress с помощью WPengine позволяет значительно расширить стандартный функционал и повысить эффективность работы с контентом. Используйте кастомные типы записей, метаполя и Ajax-запросы для удобного интерфейса редактора, а также планировщик WP-Cron для автоматизации задач. Интегрируйте решения с инструментами оптимизации, такими как Clearfy Pro, чтобы сохранить производительность сайта на высоком уровне.
Такое решение подойдет для крупных проектов, агентств и маркетологов, которым требуется гибкое управление контентом и возможность быстро тестировать разные варианты публикаций.