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

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

Почему стоит использовать AJAX для дублирования записей

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

Создание дубликата через AJAX позволяет:

  • Выполнить копирование записи без перезагрузки страницы.
  • Добавить кнопку "Дублировать" прямо в списке записей.
  • Автоматизировать процесс, минимизировать ошибки.

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

Создание AJAX обработчика для дублирования записи

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

add_action('wp_ajax_wplite_duplicate_post', 'wplite_duplicate_post_callback');

function wplite_duplicate_post_callback() {
    // Проверка nonce для безопасности
    check_ajax_referer('wplite_duplicate_nonce', 'nonce');

    if (!current_user_can('edit_posts')) {
        wp_send_json_error('Нет прав для выполнения действия');
    }

    $post_id = isset($_POST['post_id']) ? intval($_POST['post_id']) : 0;
    if (!$post_id) {
        wp_send_json_error('Неверный ID записи');
    }

    $post = get_post($post_id);
    if (!$post) {
        wp_send_json_error('Запись не найдена');
    }

    // Создаём копию записи
    $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(),
    );

    $new_post_id = wp_insert_post($new_post);

    if (is_wp_error($new_post_id)) {
        wp_send_json_error('Ошибка при создании копии');
    }

    // Копируем метаданные записи
    $meta = get_post_meta($post_id);
    foreach ($meta as $key => $values) {
        foreach ($values as $value) {
            update_post_meta($new_post_id, $key, maybe_unserialize($value));
        }
    }

    wp_send_json_success(array('new_post_id' => $new_post_id));
}

Этот обработчик получает ID исходной записи через POST, проверяет права пользователя, создаёт новую запись с добавлением "(копия)" в заголовок, копирует содержимое и метаданные, и возвращает ID новой записи.

Добавляем кнопку дублирования в список записей

Чтобы добавить кнопку "Дублировать" в строку записи в админке, используем фильтр post_row_actions. Ниже пример кода:

add_filter('post_row_actions', 'wplite_add_duplicate_link', 10, 2);

function wplite_add_duplicate_link($actions, $post) {
    if (current_user_can('edit_posts')) {
        $nonce = wp_create_nonce('wplite_duplicate_nonce');
        $url = "javascript:void(0);";
        $actions['duplicate'] = "<a href='$url' class='wplite-duplicate-link' data-post-id='" . $post->ID . "' data-nonce='$nonce'>Дублировать</a>";
    }
    return $actions;
}

Здесь мы добавляем ссылку с классом и data-атрибутами для передачи ID записи и nonce.

Подключаем JavaScript для обработки клика и отправки AJAX

Чтобы кнопка работала, нужно добавить скрипт, который будет отправлять AJAX запрос и обрабатывать ответ. Пример JavaScript (подключите его в админке):

jQuery(document).ready(function($) {
    $('.wplite-duplicate-link').on('click', function(e) {
        e.preventDefault();
        var postId = $(this).data('post-id');
        var nonce = $(this).data('nonce');
        var link = $(this);
        link.text('Копирование...');

        $.post(ajaxurl, {
            action: 'wplite_duplicate_post',
            post_id: postId,
            nonce: nonce
        }, function(response) {
            if(response.success) {
                var editUrl = '/wp-admin/post.php?post=' + response.data.new_post_id + '&action=edit';
                link.html('<a href="' + editUrl + '">Редактировать копию</a>');
            } else {
                alert('Ошибка: ' + response.data);
                link.text('Дублировать');
            }
        });
    });
});

Этот скрипт отправляет запрос на сервер, меняет текст кнопки на "Копирование...", а при успешном ответе предлагает перейти к редактированию новой записи.

Особенности и доработки

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

  • Копирование таксономий с помощью wp_get_object_terms и wp_set_object_terms.
  • Копирование прикреплённых медиафайлов — более сложный процесс, который требует создания новых вложений.
  • Добавить уведомления в админку с помощью admin_notices вместо alert.
  • Реализовать ограничение на дублирование по типам записей и по ролям пользователей.

Для примера, вот как скопировать таксономии:

$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);
}

Заключение

Создание собственного AJAX-дублирования записей позволяет гибко и быстро создавать копии с минимальными затратами ресурсов и без установки тяжёлых плагинов. Такой подход особенно полезен для сайтов с большим объёмом контента, где нужно оперативно создавать заготовки новых материалов.

Если хотите расширить возможности, рекомендую посмотреть плагины вроде Duplicate Post или Clearfy Pro с функциями оптимизации и управления.

Как удалить неиспользуемые таксономии в WordPress без кода
01.01.2026
Как использовать REST API в WordPress для создания кастомных приложений
22.11.2025
Как автоматически удалять старые черновики в WordPress
04.04.2026
Как создать настройки для своего плагина в WordPress
17.11.2025
Как изменить URL записи в WordPress без редиректа
25.12.2025