Часто при работе с 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 с функциями оптимизации и управления.