wp-code.ru wordpress WP-Codе

Автоматическое создание копий постов в WordPress с помощью кода

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

Почему важно создавать копии постов автоматически

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

  • Экономить время при подготовке контента;
  • Избегать ошибок, связанных с ручным копированием;
  • Упрощать работу редакторов и авторов;
  • Обеспечивать единообразие структуры копируемых записей.

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

Реализация функции копирования поста на PHP

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

function wpcode_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_excerpt'   => $post->post_excerpt,
        'post_status'    => 'draft', // Создаём как черновик
        'post_type'      => $post->post_type,
        'post_author'    => get_current_user_id(),
        'post_category'  => wp_get_post_categories($post_id),
    );

    // Вставляем новый пост и получаем ID
    $new_post_id = wp_insert_post($new_post);
    if (is_wp_error($new_post_id)) {
        return $new_post_id;
    }

    // Копируем метаполя
    $post_meta = get_post_meta($post_id);
    foreach ($post_meta as $meta_key => $meta_values) {
        foreach ($meta_values as $meta_value) {
            add_post_meta($new_post_id, $meta_key, maybe_unserialize($meta_value));
        }
    }

    // Копируем таксономии (категории, теги и др.)
    $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);
    }

    return $new_post_id;
}

Эта функция берёт ID исходного поста, создаёт новый с теми же данными, но в статусе черновика, копирует все метаполя и связанные таксономии. Новый пост получает в названии добавку «(копия)» для удобства.

Пример использования функции в админке

Чтобы вызвать дублирование поста при нажатии кнопки, можно добавить в административный интерфейс ссылку «Дублировать» рядом с каждым постом. Для этого используем фильтр post_row_actions:

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

add_action('admin_post_wpcode_duplicate_post', 'wpcode_handle_duplicate_post');
function wpcode_handle_duplicate_post() {
    if (!isset($_GET['post']) || !wp_verify_nonce($_GET['_wpnonce'], 'wpcode_duplicate_post_' . $_GET['post'])) {
        wp_die('Недостаточно прав');
    }

    $post_id = intval($_GET['post']);
    $new_post_id = wpcode_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;
}

Этот код добавляет ссылку «Дублировать» в строку действий у каждого поста в списке записей. При нажатии происходит проверка прав и nonce, затем вызывается функция дублирования и пользователя перенаправляет на страницу редактирования нового поста.

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

Если не хочется писать код, можно воспользоваться популярными плагинами, которые решают задачу дублирования постов:

  • Duplicate Post — классический плагин, который добавляет кнопку дублирования в админке;
  • Yoast Duplicate Post — плагин от разработчиков Yoast SEO, расширяет возможности копирования, позволяет копировать не только посты, но и страницы, пользовательские типы записей;
  • Post Duplicator — простой и лёгкий плагин с минимальными настройками.

Для установки плагина зайдите в раздел «Плагины» > «Добавить новый» и найдите нужный по названию. После активации в списке постов появится кнопка для дублирования.

Если вы используете на сайте плагин Clearfy Pro — обратите внимание, что в нём есть модуль для оптимизации работы с контентом, который может помочь с управлением дубликатами и очисткой метаданных.

Советы по работе с дубликатами постов

При реализации или использовании функций дублирования учитывайте следующие моменты:

  • Статус нового поста. Обычно дубликаты создают в статусе «черновик», чтобы не публиковать автоматически. Это позволяет проверить и отредактировать копию перед публикацией.
  • Уникальные поля. Если у поста есть уникальные поля, например, артикулы товаров или SEO-заголовки, их стоит изменять в копии, чтобы не было конфликтов.
  • Медиафайлы. Копирование поста не дублирует файлы из библиотеки медиа. Если нужно клонировать медиа, придётся реализовать дополнительный функционал.
  • Пользовательские типы записей. Функция универсальна и работает с любыми типами записей, но убедитесь, что все связанные таксономии корректно копируются.
  • Безопасность. Проверяйте права пользователя и используйте nonce для защиты от CSRF-атак.

Расширение функционала: автоматическое дублирование при сохранении

Иногда нужно, чтобы при сохранении поста автоматически создавалась его копия. Это можно сделать с помощью хука save_post. Ниже пример, который создаёт дубликат при обновлении поста, если у поста есть метаполе _wpcode_duplicate_on_save со значением 'yes'.

add_action('save_post', 'wpcode_duplicate_on_save_post', 10, 3);
function wpcode_duplicate_on_save_post($post_id, $post, $update) {
    // Избегаем бесконечной рекурсии
    remove_action('save_post', 'wpcode_duplicate_on_save_post');

    // Проверяем, что это обновление, а не создание
    if (!$update) {
        add_action('save_post', 'wpcode_duplicate_on_save_post', 10, 3);
        return;
    }

    // Проверяем метаполе
    $duplicate_flag = get_post_meta($post_id, '_wpcode_duplicate_on_save', true);
    if ($duplicate_flag === 'yes') {
        wpcode_duplicate_post($post_id);
        // Сбрасываем метаполе, чтобы не создавать копии каждый раз
        delete_post_meta($post_id, '_wpcode_duplicate_on_save');
    }

    add_action('save_post', 'wpcode_duplicate_on_save_post', 10, 3);
}

Для активации дублирования достаточно установить метаполе _wpcode_duplicate_on_save в значение 'yes' для нужного поста. Такой подход удобно интегрировать с интерфейсом или другими плагинами.

Итог

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

Рекомендуем также ознакомиться с плагинами на WPSHOP.ru — там есть инструменты, которые могут дополнительно помочь с оптимизацией и управлением контентом.

×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше