В процессе управления контентом на сайте WordPress часто возникает необходимость создавать копии уже опубликованных или черновых постов. Это удобно, когда нужно быстро сделать похожую запись, не заполняя все поля заново. В этой статье мы подробно рассмотрим, как реализовать автоматическое создание копий постов с помощью пользовательского кода и плагинов. Также покажем, как добавить кнопку для дублирования поста в админке WordPress.
Зачем нужно автоматическое дублирование постов в WordPress
Создание копий постов вручную — рутинная и часто утомительная задача, особенно если у вас большой объем контента. Автоматизация этого процесса позволяет:
- Экономить время при создании похожих материалов.
- Избегать ошибок при повторном заполнении метаданных и настроек.
- Ускорить работу редакторов и контент-менеджеров.
При этом дублирование должно сохранять все важные параметры: содержимое, метаданные, категории, теги, изображения и даже пользовательские поля.
Как добавить кнопку «Дублировать» в список записей WordPress
Для удобства пользователей можно добавить ссылку "Дублировать" прямо в таблицу постов в админке. Чтобы реализовать это, используем фильтры и действия WordPress.
Добавьте в файл functions.php вашей темы или в отдельный плагин следующий код:
function wpstuff_add_duplicate_post_link( $actions, $post ) {
if (current_user_can('edit_posts')) {
$url = wp_nonce_url(
admin_url('admin.php?action=wpstuff_duplicate_post&post=' . $post->ID),
basename(__FILE__),
'duplicate_nonce'
);
$actions['duplicate'] = '<a href="' . $url . '" title="Дублировать этот пост">Дублировать</a>';
}
return $actions;
}
add_filter('post_row_actions', 'wpstuff_add_duplicate_post_link', 10, 2);Этот код добавляет ссылку с проверкой прав пользователя и nonce для безопасности.
Обработка дублирования поста на сервере
Теперь нужно реализовать обработчик, который создаст копию записи при клике на ссылку. Добавим функцию, которая выполнит дублирование:
function wpstuff_duplicate_post() {
if (! (isset($_GET['post']) || isset($_POST['post']) )) {
wp_die('Не указан ID поста для дублирования.');
}
// Проверка nonce для безопасности
if (!isset($_GET['duplicate_nonce']) || !wp_verify_nonce($_GET['duplicate_nonce'], basename(__FILE__))) {
wp_die('Ошибка безопасности.');
}
$post_id = (isset($_GET['post'])) ? intval($_GET['post']) : intval($_POST['post']);
$post = get_post($post_id);
if (isset($post) && $post != null) {
$current_user = wp_get_current_user();
$new_post_author = $current_user->ID;
// Создаем массив для новой записи
$args = array(
'comment_status' => $post->comment_status,
'ping_status' => $post->ping_status,
'post_author' => $new_post_author,
'post_content' => $post->post_content,
'post_excerpt' => $post->post_excerpt,
'post_name' => $post->post_name . '-copy',
'post_parent' => $post->post_parent,
'post_password' => $post->post_password,
'post_status' => 'draft', // Дублированный пост сохраняем как черновик
'post_title' => $post->post_title . ' (копия)',
'post_type' => $post->post_type,
'to_ping' => $post->to_ping,
'menu_order' => $post->menu_order
);
// Вставляем пост в базу
$new_post_id = wp_insert_post($args);
// Копируем таксономии (категории, теги и т.д.)
$taxonomies = get_object_taxonomies($post->post_type);
foreach ($taxonomies as $taxonomy) {
$post_terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'slugs'));
wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false);
}
// Копируем метаданные
$post_meta = get_post_meta($post_id);
foreach ($post_meta as $meta_key => $meta_values) {
foreach ($meta_values as $meta_value) {
update_post_meta($new_post_id, $meta_key, maybe_unserialize($meta_value));
}
}
// Перенаправляем на страницу редактирования новой записи
wp_redirect(admin_url('post.php?action=edit&post=' . $new_post_id));
exit;
} else {
wp_die('Пост не найден.');
}
}
add_action('admin_action_wpstuff_duplicate_post', 'wpstuff_duplicate_post');Этот код создает дубликат записи с сохранением всех таксономий и метаданных, а также устанавливает новый статус «черновик». После создания происходит редирект на страницу редактирования нового поста.
Применение плагина для дублирования постов
Если вы не хотите писать код, можно воспользоваться проверенным плагином Duplicate Post (от WPSHOP), который добавляет функцию дублирования с расширенными настройками.
Плагин позволяет:
- Выбирать, какие элементы копировать — метаданные, таксономии, поля и пр.
- Настраивать права доступа для разных ролей.
- Добавлять пользовательские кнопки и ссылки.
Это удобное решение для тех, кто хочет быстро внедрить дублирование без программирования.
Дополнительные советы по дублированию постов
При автоматическом копировании постов важно учитывать несколько нюансов:
- Копирование пользовательских полей: Обязательно проверяйте, что сериализованные данные корректно копируются и не ломают структуру.
- Изображения и медиа: При дублировании нужно убедиться, что все связанные изображения остаются корректными, особенно если вы используете пользовательские поля с ID вложений.
- SEO и уникальность: Не забывайте менять заголовок и URL, чтобы избежать проблем с дублирующимся контентом в поисковых системах.
При необходимости можно расширять функцию дублирования, например, добавлять автоматическую замену определённых фрагментов в контенте или создавать копии сразу в нужной категории.
Пример расширения функции дублирования: замена текста в контенте
function wpstuff_duplicate_post_replace_content($content) {
return str_replace('Старая фраза', 'Новая фраза', $content);
}
// Используем в функции дублирования перед вставкой
$args['post_content'] = wpstuff_duplicate_post_replace_content($post->post_content);Такой подход помогает быстро адаптировать копии под новые задачи.