В процессе администрирования сайта на WordPress часто возникает необходимость создавать дубликаты записей. Это бывает полезно, например, для быстрого создания похожих статей, тестирования изменений без риска для оригинала или резервного копирования контента. В этой статье мы подробно рассмотрим, как реализовать функционал автоматического копирования постов с помощью собственного кода и плагинов, а также разберём нюансы и лучшие практики.
Почему важно создавать копии постов автоматически
Ручное дублирование записей через стандартный интерфейс WordPress может быть неудобным и времязатратным, особенно когда нужно создавать большое количество похожих материалов. Автоматизация процесса позволяет:
- Экономить время при подготовке контента;
- Избегать ошибок, связанных с ручным копированием;
- Упрощать работу редакторов и авторов;
- Обеспечивать единообразие структуры копируемых записей.
Далее мы разберём, как можно реализовать такой функционал в коде темы или плагина, а также рассмотрим готовые решения.
Реализация функции копирования поста на PHP
Для создания копии записи нам необходимо программно получить все данные оригинального поста, включая метаданные и таксономии, и создать новый пост с этими данными. Ниже представлен пример функции wpcode_duplicate_post, которая это делает.
function wpcode_duplicate_post($post_id) {
// Получаем оригинальный пост
$post = get_post($post_id);
if (!$post) {
return new WP_Error('post_not_found', 'Пост не найден');
}
// Создаём массив для нового поста
$new_post = array(
'post_title' => $post->post_title . ' (копия)',
'post_content' => $post->post_content,
'post_excerpt' => $post->post_excerpt,
'post_status' => 'draft', // Создаём как черновик
'post_type' => $post->post_type,
'post_author' => get_current_user_id(),
'post_category' => wp_get_post_categories($post_id),
);
// Вставляем новый пост и получаем ID
$new_post_id = wp_insert_post($new_post);
if (is_wp_error($new_post_id)) {
return $new_post_id;
}
// Копируем метаполя
$post_meta = get_post_meta($post_id);
foreach ($post_meta as $meta_key => $meta_values) {
foreach ($meta_values as $meta_value) {
add_post_meta($new_post_id, $meta_key, maybe_unserialize($meta_value));
}
}
// Копируем таксономии (категории, теги и др.)
$taxonomies = get_object_taxonomies($post->post_type);
foreach ($taxonomies as $taxonomy) {
$terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'slugs'));
wp_set_object_terms($new_post_id, $terms, $taxonomy, false);
}
return $new_post_id;
}
Эта функция берёт ID исходного поста, создаёт новый с теми же данными, но в статусе черновика, копирует все метаполя и связанные таксономии. Новый пост получает в названии добавку «(копия)» для удобства.
Пример использования функции в админке
Чтобы вызвать дублирование поста при нажатии кнопки, можно добавить в административный интерфейс ссылку «Дублировать» рядом с каждым постом. Для этого используем фильтр post_row_actions:
add_filter('post_row_actions', 'wpcode_add_duplicate_link', 10, 2);
function wpcode_add_duplicate_link($actions, $post) {
if (current_user_can('edit_posts')) {
$url = wp_nonce_url(
admin_url('admin-post.php?action=wpcode_duplicate_post&post=' . $post->ID),
'wpcode_duplicate_post_' . $post->ID
);
$actions['duplicate'] = '<a href="' . esc_url($url) . '">Дублировать</a>';
}
return $actions;
}
add_action('admin_post_wpcode_duplicate_post', 'wpcode_handle_duplicate_post');
function wpcode_handle_duplicate_post() {
if (!isset($_GET['post']) || !wp_verify_nonce($_GET['_wpnonce'], 'wpcode_duplicate_post_' . $_GET['post'])) {
wp_die('Недостаточно прав');
}
$post_id = intval($_GET['post']);
$new_post_id = wpcode_duplicate_post($post_id);
if (is_wp_error($new_post_id)) {
wp_die('Ошибка при дублировании: ' . $new_post_id->get_error_message());
}
wp_redirect(admin_url('post.php?action=edit&post=' . $new_post_id));
exit;
}
Этот код добавляет ссылку «Дублировать» в строку действий у каждого поста в списке записей. При нажатии происходит проверка прав и nonce, затем вызывается функция дублирования и пользователя перенаправляет на страницу редактирования нового поста.
Использование готовых плагинов для дублирования постов
Если не хочется писать код, можно воспользоваться популярными плагинами, которые решают задачу дублирования постов:
- Duplicate Post — классический плагин, который добавляет кнопку дублирования в админке;
- Yoast Duplicate Post — плагин от разработчиков Yoast SEO, расширяет возможности копирования, позволяет копировать не только посты, но и страницы, пользовательские типы записей;
- Post Duplicator — простой и лёгкий плагин с минимальными настройками.
Для установки плагина зайдите в раздел «Плагины» > «Добавить новый» и найдите нужный по названию. После активации в списке постов появится кнопка для дублирования.
Если вы используете на сайте плагин Clearfy Pro — обратите внимание, что в нём есть модуль для оптимизации работы с контентом, который может помочь с управлением дубликатами и очисткой метаданных.
Советы по работе с дубликатами постов
При реализации или использовании функций дублирования учитывайте следующие моменты:
- Статус нового поста. Обычно дубликаты создают в статусе «черновик», чтобы не публиковать автоматически. Это позволяет проверить и отредактировать копию перед публикацией.
- Уникальные поля. Если у поста есть уникальные поля, например, артикулы товаров или SEO-заголовки, их стоит изменять в копии, чтобы не было конфликтов.
- Медиафайлы. Копирование поста не дублирует файлы из библиотеки медиа. Если нужно клонировать медиа, придётся реализовать дополнительный функционал.
- Пользовательские типы записей. Функция универсальна и работает с любыми типами записей, но убедитесь, что все связанные таксономии корректно копируются.
- Безопасность. Проверяйте права пользователя и используйте nonce для защиты от CSRF-атак.
Расширение функционала: автоматическое дублирование при сохранении
Иногда нужно, чтобы при сохранении поста автоматически создавалась его копия. Это можно сделать с помощью хука save_post. Ниже пример, который создаёт дубликат при обновлении поста, если у поста есть метаполе _wpcode_duplicate_on_save со значением 'yes'.
add_action('save_post', 'wpcode_duplicate_on_save_post', 10, 3);
function wpcode_duplicate_on_save_post($post_id, $post, $update) {
// Избегаем бесконечной рекурсии
remove_action('save_post', 'wpcode_duplicate_on_save_post');
// Проверяем, что это обновление, а не создание
if (!$update) {
add_action('save_post', 'wpcode_duplicate_on_save_post', 10, 3);
return;
}
// Проверяем метаполе
$duplicate_flag = get_post_meta($post_id, '_wpcode_duplicate_on_save', true);
if ($duplicate_flag === 'yes') {
wpcode_duplicate_post($post_id);
// Сбрасываем метаполе, чтобы не создавать копии каждый раз
delete_post_meta($post_id, '_wpcode_duplicate_on_save');
}
add_action('save_post', 'wpcode_duplicate_on_save_post', 10, 3);
}
Для активации дублирования достаточно установить метаполе _wpcode_duplicate_on_save в значение 'yes' для нужного поста. Такой подход удобно интегрировать с интерфейсом или другими плагинами.
Итог
Автоматическое создание копий постов — частая задача для разработчиков и администраторов WordPress сайтов. С помощью представленных в статье решений вы сможете быстро внедрить этот функционал самостоятельно или с минимальным использованием плагинов. Это повысит эффективность работы с контентом и упростит управление сайтом.
Рекомендуем также ознакомиться с плагинами на WPSHOP.ru — там есть инструменты, которые могут дополнительно помочь с оптимизацией и управлением контентом.