В администрировании сайтов на WordPress часто возникает необходимость быстро создавать копии существующих постов или страниц для редактирования без изменения оригинала. В этой статье мы подробно разберем, как автоматизировать процесс дублирования постов с помощью хуков WordPress, а также предложим готовые решения с примерами кода и рекомендации по использованию плагинов.
Зачем нужна автоматизация дублирования постов в WordPress
Дублирование постов полезно в нескольких случаях:
- Создание шаблонов контента для последующего редактирования.
- Эксперименты с разными вариантами оформления и текста без риска потерять исходный материал.
- Ускорение работы редакторов и авторов за счет снижения количества повторяющихся действий.
Вручную копировать содержимое и создавать новый пост — процесс трудоемкий и подверженный ошибкам. Автоматизация с помощью хуков позволяет сделать это максимально просто и быстро.
Использование стандартных возможностей WordPress для дублирования постов
WordPress не предоставляет встроенной кнопки «Дублировать» в списке постов. Но мы можем добавить эту функцию, используя фильтры и экшены.
Для начала рассмотрим популярный плагин Duplicate Post, который добавляет кнопку «Клонировать» в административной панели.
Однако если вы хотите полностью контролировать процесс или добавить кастомную логику, лучше создать свой функционал.
Создание функции дублирования поста на PHP с использованием хуков WordPress
Ниже приведен пример функции, которая создает копию поста по ID и устанавливает статус копии как "черновик". Добавим также обработчик нажатия кнопки в админке.
function wp_pro_duplicate_post_as_draft( $post_id ) {
$post = get_post( $post_id );
if ( null === $post ) {
return new WP_Error( 'post_not_found', 'Пост не найден' );
}
$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(),
'post_excerpt' => $post->post_excerpt,
'post_parent' => $post->post_parent,
);
$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 ) {
$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_keys = get_post_custom_keys( $post_id );
if ( is_array( $post_meta_keys ) ) {
foreach ( $post_meta_keys as $meta_key ) {
$meta_values = get_post_custom_values( $meta_key, $post_id );
foreach ( $meta_values as $meta_value ) {
add_post_meta( $new_post_id, $meta_key, maybe_unserialize( $meta_value ) );
}
}
}
return $new_post_id;
}
function wp_pro_add_duplicate_post_link( $actions, $post ) {
if ( current_user_can( 'edit_posts' ) ) {
$url = wp_nonce_url( admin_url( 'admin.php?action=wp_pro_duplicate_post&post=' . $post->ID ), 'wp_pro_duplicate_post_' . $post->ID );
$actions['duplicate'] = '<a href="' . esc_url( $url ) . '" title="Дублировать этот пост" rel="permalink">Дублировать</a>';
}
return $actions;
}
add_filter( 'post_row_actions', 'wp_pro_add_duplicate_post_link', 10, 2 );
function wp_pro_process_duplicate_post() {
if ( ! ( isset( $_GET['post'], $_GET['_wpnonce'] ) ) ) {
return;
}
$post_id = absint( $_GET['post'] );
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'wp_pro_duplicate_post_' . $post_id ) ) {
wp_die( 'Ошибка безопасности' );
}
if ( ! current_user_can( 'edit_posts' ) ) {
wp_die( 'Нет прав для дублирования постов' );
}
$new_post_id = wp_pro_duplicate_post_as_draft( $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_action_wp_pro_duplicate_post', 'wp_pro_process_duplicate_post' );Этот код добавляет ссылку «Дублировать» в списке постов, которая создает копию выбранного поста с сохранением содержимого, таксономий и метаданных. Новая запись создается в статусе черновика и открывается в редакторе для дальнейших правок.
Копирование пользовательских полей и таксономий
Очень часто у постов есть свои метаданные (пользовательские поля) и связанные таксономии, например, категории или теги. Без их переноса копия будет неполной.
В приведенном выше примере мы специально обходили все таксономии с помощью get_object_taxonomies и переносили термины через wp_set_object_terms. Аналогично метаданные копируются через функции get_post_custom_keys и add_post_meta.
Если в вашем проекте используются сложные структурированные поля (например, ACF), возможно, потребуется добавить дополнительную обработку для сериализованных данных.
Дополнительные возможности: копирование изображений и вложений
Стандартно функция wp_pro_duplicate_post_as_draft не копирует прикрепленные файлы и миниатюры. Для полного дубля поста часто нужно продублировать и эти медиа.
Чтобы скопировать миниатюру поста, добавьте в функцию следующий код:
$thumbnail_id = get_post_thumbnail_id( $post_id );
if ( $thumbnail_id ) {
set_post_thumbnail( $new_post_id, $thumbnail_id );
}Если требуется создать полноценную копию вложений (например, изображения, документы), нужно вручную скопировать файлы в медиа-библиотеку и связать их с новым постом — это более сложная задача, требующая работы с функциями WordPress для загрузки файлов.
Использование плагина Clearfy Pro для расширенного дубляжа постов
Если вы хотите более удобный и функциональный способ без ручного кода, рекомендуем обратить внимание на плагин Clearfy Pro. Он интегрируется с админкой, добавляет кнопку дубляжа и позволяет гибко настраивать, какие элементы копировать: метаданные, таксономии, настройки SEO и пр.
Clearfy Pro особенно полезен, если вы управляете большим сайтом с разными типами записей и хотите избежать конфликтов между плагинами при дублировании.
Советы по безопасности и производительности при дублировании
При добавлении кода для автоматизации важно:
- Проверять права пользователя с помощью
current_user_can, чтобы не допустить неавторизованных дубликатов. - Использовать nonce для защиты ссылок от CSRF-атак.
- Обрабатывать ошибки и исключения корректно, чтобы не нарушать работу админки.
- Оптимизировать копирование метаданных, чтобы избежать избыточных запросов к базе.
Правильное использование хуков WordPress позволяет встроить дублирование в рабочий процесс без снижения производительности и безопасности.
Заключение
Автоматизация дублирования постов с помощью хуков — эффективный способ повысить продуктивность работы с контентом на WordPress. Вы можете использовать готовые решения, такие как плагин Duplicate Post или Clearfy Pro, либо реализовать собственный функционал с помощью приведенного кода.
Важно тщательно тестировать все изменения, чтобы избежать потери данных и конфликтов с другими плагинами. С внедрением описанных методов вы сможете быстро создавать копии постов и управлять ими без лишних усилий.