Как создать автоматический копировщик постов в WordPress

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

Зачем нужен автоматический копировщик постов в WordPress

Автоматическое дублирование записей облегчает работу с контентом, особенно если вы часто создаёте похожие записи. Это экономит время и минимизирует ошибки, связанные с ручным копированием.

Примеры ситуаций использования:

  • Создание шаблонов статей с предзаполненными данными.
  • Подготовка похожих новостей с минимальными изменениями.
  • Автоматическое создание копий для временного редактирования без риска потерять оригинал.

Встроенных функций WordPress для этого нет, но есть множество готовых плагинов, например, WPRemark, который позволяет дублировать записи в один клик. Но мы рассмотрим, как сделать это своими силами.

Добавление кнопки «Дублировать» в список постов WordPress

Первым шагом сделаем кнопку, которая позволит копировать пост вручную из панели управления. Вставьте следующий код в файл вашего плагина или functions.php активной темы:

function wpedu_add_duplicate_post_link( $actions, $post ) {
    if ( current_user_can( 'edit_posts' ) ) {
        $url = wp_nonce_url(
            admin_url('admin.php?action=wpedu_duplicate_post&post=' . $post->ID),
            'wpedu_duplicate_post_' . $post->ID
        );
        $actions['duplicate'] = '<a href="' . esc_url($url) . '" title="Дублировать этот пост">Дублировать</a>';
    }
    return $actions;
}
add_filter( 'post_row_actions', 'wpedu_add_duplicate_post_link', 10, 2 );

Этот код добавляет ссылку «Дублировать» в действия для каждой записи.

Обработка действия дублирования поста

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

function wpedu_handle_duplicate_post() {
    if ( ! ( isset( $_GET['post'] ) || isset( $_POST['post'] ) ) ) {
        wp_die('Не указан ID поста для дублирования');
    }

    $post_id = ( isset( $_GET['post'] ) ) ? absint( $_GET['post'] ) : absint( $_POST['post'] );

    check_admin_referer( 'wpedu_duplicate_post_' . $post_id );

    $post = get_post( $post_id );

    if ( empty( $post ) ) {
        wp_die('Пост не найден');
    }

    $new_post_args = array(
        'post_author' => $post->post_author,
        'post_content' => $post->post_content,
        'post_title' => $post->post_title . ' (копия)',
        'post_status' => 'draft',
        'post_type' => $post->post_type,
        '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_args );

    // Копируем мета данные
    $meta_data = get_post_meta( $post_id );
    foreach ( $meta_data 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 ) {
        $post_terms = wp_get_object_terms( $post_id, $taxonomy, array( 'fields' => 'slugs' ) );
        wp_set_object_terms( $new_post_id, $post_terms, $taxonomy, false );
    }

    wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
    exit;
}
add_action( 'admin_action_wpedu_duplicate_post', 'wpedu_handle_duplicate_post' );

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

Автоматическое копирование постов по расписанию

Иногда нужно не просто вручную дублировать запись, а делать это автоматически – например, создавать копии определённого типа постов раз в сутки. Для этого используем WP-Cron.

Регистрация задачи в WP-Cron

Добавьте в плагин или functions.php следующий код для регистрации задачи, если она ещё не зарегистрирована:

function wpedu_schedule_post_copy() {
    if ( ! wp_next_scheduled( 'wpedu_cron_copy_posts_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'wpedu_cron_copy_posts_hook' );
    }
}
add_action( 'wp', 'wpedu_schedule_post_copy' );

Создание функции, которая будет делать копии

function wpedu_cron_copy_posts_function() {
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => 5, // Сколько постов копировать за раз
        'post_status' => 'publish',
        'orderby' => 'date',
        'order' => 'DESC',
    );
    $posts = get_posts( $args );

    foreach ( $posts as $post ) {
        $new_post_args = array(
            'post_author' => $post->post_author,
            'post_content' => $post->post_content,
            'post_title' => $post->post_title . ' (автокопия)',
            'post_status' => 'draft',
            'post_type' => $post->post_type
        );
        $new_post_id = wp_insert_post( $new_post_args );

        $meta_data = get_post_meta( $post->ID );
        foreach ( $meta_data 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 ) {
            $post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'slugs' ) );
            wp_set_object_terms( $new_post_id, $post_terms, $taxonomy, false );
        }
    }
}
add_action( 'wpedu_cron_copy_posts_hook', 'wpedu_cron_copy_posts_function' );

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

Практические советы и рекомендации

Чтобы не перегружать базу и админку, рекомендуем:

  • Добавлять проверку, чтобы не копировать одни и те же посты несколько раз подряд.
  • Очищать старые дубликаты, если они больше не нужны, используя аналогичные автоматические задачи.
  • Использовать сторонние плагины, например WPRemark, для быстрого добавления кнопки дублирования без кода.

Заключение

Автоматический копировщик постов — удобный инструмент для оптимизации работы с контентом WordPress. В статье показаны как простые решения для ручного копирования через админку, так и более сложные – автоматическое дублирование по расписанию. Используйте этот функционал, чтобы упростить подготовку материалов и сэкономить время.

⭐⭐⭐⭐⭐