В этой статье мы подробно рассмотрим, как реализовать автоматическое копирование постов в 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. В статье показаны как простые решения для ручного копирования через админку, так и более сложные – автоматическое дублирование по расписанию. Используйте этот функционал, чтобы упростить подготовку материалов и сэкономить время.