В работе с WordPress часто возникает необходимость создавать копии существующих публикаций — для быстрой подготовки похожих материалов, тестирования изменений или работы с шаблонами. В этой статье мы подробно разберём, как автоматизировать процесс дублирования постов с помощью собственного PHP-кода и познакомимся с примерами, которые можно внедрить прямо в ваш сайт.
Почему важно уметь создавать копии публикаций в WordPress
Дублирование постов помогает экономить время, особенно если вы ведёте сложные проекты с большим объёмом контента. Полезно для:
- Быстрого создания новых материалов на основе готовой структуры.
- Тестирования изменений без риска повредить оригинальный контент.
- Упрощения работы с SEO — например, для подготовки вариантов материала.
При этом важно, чтобы копия включала не только основной текст, но и все метаданные, таксономии и настройки публикации.
Как реализовать функцию дублирования поста в WordPress через код
Для начала создадим функцию wptool_duplicate_post, которая будет принимать ID оригинального поста и создавать его копию, включая все данные.
function wptool_duplicate_post($post_id) {
$post = get_post($post_id);
if (null === $post) {
return new WP_Error('post_not_found', 'Пост с указанным ID не найден');
}
// Основные данные для нового поста
$new_post_args = array(
'post_title' => $post->post_title . ' (копия)',
'post_content' => $post->post_content,
'post_status' => 'draft',
'post_type' => $post->post_type,
'post_author' => get_current_user_id(),
);
// Вставляем новый пост и получаем его ID
$new_post_id = wp_insert_post($new_post_args);
if (is_wp_error($new_post_id)) {
return $new_post_id;
}
// Копируем таксономии
$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);
}
// Копируем метаданные
$post_meta = get_post_meta($post_id);
foreach ($post_meta as $key => $values) {
foreach ($values as $value) {
add_post_meta($new_post_id, $key, maybe_unserialize($value));
}
}
return $new_post_id;
}
Эта функция создаст черновик с заголовком оригинала с добавлением слова «(копия)», скопирует все таксономии и метаданные.
Как добавить кнопку «Дублировать» в админке WordPress
Чтобы удобнее было использовать дублирование, добавим ссылку с действием на странице списка записей. Вставьте следующий код в файл functions.php вашей темы или в плагин:
function wptool_duplicate_post_link($actions, $post) {
if (current_user_can('edit_posts')) {
$url = wp_nonce_url(
admin_url('admin-post.php?action=wptool_duplicate_post&post=' . $post->ID),
'wptool_duplicate_post_' . $post->ID
);
$actions['duplicate'] = '<a href="' . esc_url($url) . '" title="Дублировать">Дублировать</a>';
}
return $actions;
}
add_filter('post_row_actions', 'wptool_duplicate_post_link', 10, 2);
function wptool_handle_duplicate_post() {
if (!isset($_GET['post']) || !isset($_GET['_wpnonce'])) {
wp_die('Некорректный запрос');
}
$post_id = intval($_GET['post']);
if (!wp_verify_nonce($_GET['_wpnonce'], 'wptool_duplicate_post_' . $post_id)) {
wp_die('Ошибка проверки безопасности');
}
if (!current_user_can('edit_posts', $post_id)) {
wp_die('Нет прав для выполнения этого действия');
}
$new_post_id = wptool_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;
}
add_action('admin_post_wptool_duplicate_post', 'wptool_handle_duplicate_post');
После добавления этого кода в списке записей появится новая ссылка «Дублировать». При её нажатии создаётся копия публикации, и вы попадаете на её редактирование.
Использование плагинов для дублирования публикаций и их интеграция
Если вы предпочитаете готовые решения, в каталоге WordPress есть несколько плагинов для дублирования постов:
- Duplicate Post — классический и функциональный плагин с множеством настроек.
- Yoast Duplicate Post — официальный плагин от разработчиков Yoast SEO, который позволяет копировать записи, страницы и настраивать детали.
Если вам нужно интегрировать дублирование с другими плагинами, например, с WPGPT для генерации AI-контента, вы можете расширить функцию wptool_duplicate_post, добавив вызов генерации нового текста на базе скопированного. Это позволит быстро создавать уникальный контент на основе дубликатов.
Советы по безопасности и производительности при автоматическом дублировании
При использовании автоматического создания копий стоит учитывать несколько важных моментов:
- Проверка прав доступа. Всегда проверяйте, имеет ли пользователь нужные права для дублирования, чтобы избежать несанкционированного доступа.
- Оптимизация метаданных. Иногда некоторые метаданные не стоит копировать (например, счётчики просмотров или данные SEO-плагинов). Можно добавить фильтры для исключения таких ключей.
- Обработка больших объёмов. При массовом дублировании стоит использовать транзиенты или фоновые задачи, чтобы не нагружать сервер.
Также рекомендуем тестировать функцию на staging-сервере перед внедрением на живой сайт.
Как исключить определённые метаданные из копирования
Для исключения метаданных добавьте проверку в цикл копирования:
$exclude_meta_keys = array('_edit_lock', '_edit_last', '_yoast_wpseo_primary_category');
foreach ($post_meta as $key => $values) {
if (in_array($key, $exclude_meta_keys)) {
continue; // пропускаем этот мета-ключ
}
foreach ($values as $value) {
add_post_meta($new_post_id, $key, maybe_unserialize($value));
}
}
Это позволит избежать нежелательного дублирования служебных данных.