Как создать подробный плагин для автоматического создания копий постов в WordPress

В этой статье разберём, как написать собственный плагин для WordPress, который автоматически создаёт копии постов по расписанию или при определённых условиях. Такая задача часто встречается при необходимости делать резервные дубли публикаций, создавать шаблоны постов или автоматизировать работу с контентом.

Зачем нужен плагин для автоматического дублирования постов

В WordPress нет встроенного механизма для автоматического создания копий записей, кроме как вручную дублировать через интерфейс. Автоматизация позволяет:

  • Создавать резервные копии важных публикаций;
  • Использовать дубли как заготовки для новых постов;
  • Автоматически создавать версии записей для разных условий (например, для разных языков или категорий);
  • Сохранять состояние постов перед массовыми изменениями.

Такой плагин особенно полезен на больших сайтах, где контент обновляется часто, и нужен контроль версий или шаблонов.

Основные функции плагина дублирования постов

Наш плагин должен уметь:

  • Создавать точную копию поста с сохранением всех метаданных, таксономий и пользовательских полей;
  • Запускать дублирование по расписанию (например, ежедневно или еженедельно);
  • Позволять запускать дублирование вручную через админку;
  • Позволять задать фильтры для выбора постов (по категориям, статусу, авторам и т. д.);
  • Логировать результаты операций для отладки и контроля.

Структура плагина и регистрация хуков

Создаём папку wpmark-post-duplicator в директории wp-content/plugins и файл wpmark-post-duplicator.php с заголовком плагина:

<?php
/*
Plugin Name: Wpmark Post Duplicator
Description: Автоматическое создание копий постов по расписанию и вручную
Version: 1.0
Author: Wpmark.ru
*/

// Защита от прямого доступа
if (!defined('ABSPATH')) exit;

Далее регистрируем функцию активации плагина, чтобы настроить WP-Cron для периодического запуска:

function wpmark_activation() {
    if (!wp_next_scheduled('wpmark_duplicate_posts_cron')) {
        wp_schedule_event(time(), 'daily', 'wpmark_duplicate_posts_cron');
    }
}
register_activation_hook(__FILE__, 'wpmark_activation');

function wpmark_deactivation() {
    wp_clear_scheduled_hook('wpmark_duplicate_posts_cron');
}
register_deactivation_hook(__FILE__, 'wpmark_deactivation');

Хук wpmark_duplicate_posts_cron будет запускать функцию дублирования постов.

Функция дублирования поста с сохранением всех данных

Создадим функцию wpmark_duplicate_post, которая принимает ID исходного поста, создаёт копию и возвращает ID новой записи.

function wpmark_duplicate_post($post_id) {
    $post = get_post($post_id);
    if (!$post) return new WP_Error('post_not_found', 'Пост не найден');

    $new_post = 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,
        'menu_order'    => $post->menu_order,
        'comment_status'=> $post->comment_status,
        'ping_status'   => $post->ping_status
    );

    $new_post_id = wp_insert_post($new_post);
    if (is_wp_error($new_post_id)) return $new_post_id;

    // Копируем все метаполя
    $meta = get_post_meta($post_id);
    foreach ($meta as $key => $values) {
        foreach ($values as $value) {
            add_post_meta($new_post_id, $key, maybe_unserialize($value));
        }
    }

    // Копируем таксономии
    $taxonomies = get_object_taxonomies($post->post_type);
    foreach ($taxonomies as $taxonomy) {
        $terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'ids'));
        wp_set_object_terms($new_post_id, $terms, $taxonomy);
    }

    return $new_post_id;
}

Функция тщательно копирует все данные, включая пользовательские поля и термины таксономий.

Автоматизация дублирования по расписанию с фильтрами выбора

Теперь реализуем функцию, которая будет запускаться по крону и дублировать все посты выбранного типа и категории.

function wpmark_duplicate_posts_scheduled() {
    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'category_name'  => 'avto', // пример категории для фильтрации
        'posts_per_page' => -1
    );

    $posts = get_posts($args);
    foreach ($posts as $post) {
        $new_id = wpmark_duplicate_post($post->ID);
        if (!is_wp_error($new_id)) {
            error_log('Wpmark: Пост ' . $post->ID . ' дублирован в ' . $new_id);
        }
    }
}
add_action('wpmark_duplicate_posts_cron', 'wpmark_duplicate_posts_scheduled');

В этом примере мы дублируем все опубликованные посты из категории "avto". Можно расширить фильтры под нужды сайта.

Добавляем интерфейс ручного запуска в админку WordPress

Для удобства добавим страницу в меню, где можно запускать дублирование вручную и видеть результаты.

function wpmark_admin_menu() {
    add_management_page(
        'Дублирование постов',
        'Дублирование постов',
        'manage_options',
        'wpmark-duplicate-posts',
        'wpmark_duplicate_posts_page'
    );
}
add_action('admin_menu', 'wpmark_admin_menu');

function wpmark_duplicate_posts_page() {
    if (!current_user_can('manage_options')) {
        wp_die('Доступ запрещён');
    }

    if (isset($_POST['wpmark_duplicate_submit'])) {
        $post_id = intval($_POST['post_id']);
        $result = wpmark_duplicate_post($post_id);
        if (is_wp_error($result)) {
            echo '<div class="notice notice-error">Ошибка: ' . esc_html($result->get_error_message()) . '</div>';
        } else {
            echo '<div class="notice notice-success">Пост успешно дублирован, ID новой записи: ' . esc_html($result) . '</div>';
        }
    }

    echo '<h1>Ручное дублирование поста</h1>';
    echo '<form method="post">';
    echo '<label>ID поста для копирования:</label> <input type="number" name="post_id" required />';
    echo '<input type="submit" name="wpmark_duplicate_submit" value="Дублировать" class="button button-primary" />';
    echo '</form>';
}

Теперь администратор может вручную ввести ID поста и сразу получить его копию.

Дополнительные возможности и улучшения

Плагин можно расширить:

  • Добавить выбор статуса дубликата (черновик, опубликован и т. п.);
  • Создать настройки для фильтров дублирования с интерфейсом;
  • Добавить поддержку дублирования вложений (медиафайлов);
  • Интегрировать с плагином WPRemark для автоматического добавления отзывов в дубликаты;
  • Добавить уведомления на email после дублирования.

Итог

Создание собственного плагина для автоматического дублирования постов в WordPress позволит вам гибко управлять контентом и автоматизировать рутинные задачи. Приведённые примеры кода легко адаптируются под конкретные требования, а расширения и интеграции сделают плагин ещё полезнее.

Если вам нужен мощный инструмент для управления отзывами и контентом, рекомендую обратить внимание на WPRemark — плагин для автоматизации отзывов и рейтингов в WordPress.

Как использовать WPCommunity для создания форума на WordPress
22.12.2025
Как удалить неиспользуемые мета данные в WordPress для ускорения сайта
10.12.2025
Как создать и использовать собственные пост типы в WordPress
17.11.2025
Автоматический импорт продуктов в WooCommerce через CSV: пошаговое руководство
01.01.2026
Как удалить и заблокировать загрузочные файлы в WordPress
26.03.2026