Как автоматизировать создание копий публикаций в WordPress с помощью кода

В работе с 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));
    }
}

Это позволит избежать нежелательного дублирования служебных данных.

Как автоматизировать удаление неиспользуемых медиафайлов в WordPress
28.02.2026
Как добавить поддержку WebP в WordPress без плагинов
20.03.2026
Как добавить автоматически работающий кэш в WordPress с примерами кода
01.01.2026
WooCommerce: автоматическое изменение цен при изменении атрибутов товара
13.06.2026
Как избежать разрушения данных при массовой обработке товаров WooCommerce
22.04.2026