Автоматизация дублирования постов в WordPress с помощью хуков

В администрировании сайтов на 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, либо реализовать собственный функционал с помощью приведенного кода.

Важно тщательно тестировать все изменения, чтобы избежать потери данных и конфликтов с другими плагинами. С внедрением описанных методов вы сможете быстро создавать копии постов и управлять ими без лишних усилий.

Как удалить метаданные из изображений в WordPress
05.01.2026
WooCommerce: использование хука woocommerce_before_cart_table для дополнительного контента в корзине
16.05.2026
Автоматическое удаление спама в комментариях WordPress
19.01.2026
WooCommerce: отключение автоподгрузки корзины и настройка обновления без перезагрузки страницы
28.05.2026
Как создать и настроить собственный виджет в WordPress
28.11.2025