WordPress : Как дублировать страницы и посты без плагинов

Обычный вариант как дублировать страницы и посты без плагинов без сторонних модулей. Есть на Github. Код добавляете в functions.php.

/*
 * Function for post duplication. Dups appear as drafts. User is redirected to the edit screen
 */
function rd_duplicate_post_as_draft(){
	global $wpdb;
	if (! ( isset( $_GET['post']) || isset( $_POST['post'])  || ( isset($_REQUEST['action']) && 'rd_duplicate_post_as_draft' == $_REQUEST['action'] ) ) ) {
		wp_die('No post to duplicate has been supplied!');
	}
 
	/*
	 * Nonce verification
	 */
	if ( !isset( $_GET['duplicate_nonce'] ) || !wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) )
		return;
 
	/*
	 * get the original post id
	 */
	$post_id = (isset($_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) );
	/*
	 * and all the original post data then
	 */
	$post = get_post( $post_id );
 
	/*
	 * if you don't want current user to be the new post author,
	 * then change next couple of lines to this: $new_post_author = $post->post_author;
	 */
	$current_user = wp_get_current_user();
	$new_post_author = $current_user->ID;
 
	/*
	 * if post data exists, create the post duplicate
	 */
	if (isset( $post ) && $post != null) {
 
		/*
		 * new post data array
		 */
		$args = array(
			'comment_status' => $post->comment_status,
			'ping_status'    => $post->ping_status,
			'post_author'    => $new_post_author,
			'post_content'   => $post->post_content,
			'post_excerpt'   => $post->post_excerpt,
			'post_name'      => $post->post_name,
			'post_parent'    => $post->post_parent,
			'post_password'  => $post->post_password,
			'post_status'    => 'draft',
			'post_title'     => $post->post_title,
			'post_type'      => $post->post_type,
			'to_ping'        => $post->to_ping,
			'menu_order'     => $post->menu_order
		);
 
		/*
		 * insert the post by wp_insert_post() function
		 */
		$new_post_id = wp_insert_post( $args );
 
		/*
		 * get all current post terms ad set them to the new post draft
		 */
		$taxonomies = get_object_taxonomies($post->post_type); // returns array of taxonomy names for post type, ex array("category", "post_tag");
		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);
		}
 
		/*
		 * duplicate all post meta just in two SQL queries
		 */
		$post_meta_infos = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");
		if (count($post_meta_infos)!=0) {
			$sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) ";
			foreach ($post_meta_infos as $meta_info) {
				$meta_key = $meta_info->meta_key;
				if( $meta_key == '_wp_old_slug' ) continue;
				$meta_value = addslashes($meta_info->meta_value);
				$sql_query_sel[]= "SELECT $new_post_id, '$meta_key', '$meta_value'";
			}
			$sql_query.= implode(" UNION ALL ", $sql_query_sel);
			$wpdb->query($sql_query);
		}
 
 
		/*
		 * finally, redirect to the edit post screen for the new draft
		 */
		wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
		exit;
	} else {
		wp_die('Post creation failed, could not find original post: ' . $post_id);
	}
}
add_action( 'admin_action_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' );
 
/*
 * Add the duplicate link to action list for post_row_actions
 */
function rd_duplicate_post_link( $actions, $post ) {
	if (current_user_can('edit_posts')) {
		$actions['duplicate'] = 'Duplicate';
	}
	return $actions;
}

add_filter( ‘post_row_actions’, ‘rd_duplicate_post_link’, 10, 2 );
В последней строке видите активацию функции для постов. Чтобы сделать аналогично у веб-страниц (Page), допишите строку:

add_filter(‘page_row_actions’, ‘rd_duplicate_post_link’, 10, 2);

Cделайте предварительную резервную копию и аккуратно внедрите ее на своем сайте. Опять же, не уверен, насколько это эффективно для обычного пользователя по сравнению с обычной активацией плагина в 2-3 клика, но… Возможно, разработчикам будет интересно взглянуть на сам код.

Duplicate Post

Он позволяет создавать копии заметок любого типа или черновики заметок для последующего редактирования. Возможно пакетное редактирование, что позволит сэкономить время при работе с несколькими заметками (например, при копировании целых разделов портала). Было произведено более двух миллионов загрузок, а последняя модификация была сделана в течение месяца. Также есть специальный тег для шаблонов, который позволяет добавить на сайт кнопку клонирования — при нажатии менеджер переходит непосредственно в текстовый редактор. Довольно интересная функция.

Вот как выглядит раздел настройки после установки модуля:

Настройки Duplicate Post

Здесь будет три вкладки:

Что копировать. Выбираете определенные параметры элемента записи, которые вы хотите продублировать, например, название, дата, ярлык, статус, отрывок, автор и т.п. Также разрешается задать префикс/суфикс заголовку, увеличить порядок сортировки и указать еще парочку других опций.
Отображать. Отмечаете где в панели управления хотите видеть ссылки для выполнения дублирования: список всех элементов, при редактировании публикаций и т.п. По умолчанию активны все доступные места в админке.
Duplicate Post — копирование страниц WordPress

Разрешения. Указываете роли пользователей, способных выполнять данную процедуру и доступные им типы заметок. То есть, при необходимости вы можете только клонировать страницы в WordPress, а посты — нет.

Duplicate Page

Создает дубли всех типов объектов в WP за один клик, причем с выбором их статуса будь то черновик, скрытые страницы или ожидающие проверки. Все опции устанавливаются в настройках после активации. Есть локализация и продвинутая более функциональная версия. Загрузок больше 700тысяч, все ошибки исправлены, апдейт был 2 недели назад.

Post Duplicator

Автор разрабатывал модуль под себя, поэтому тот получился максимально простым. Он позволяет копировать записи при наведении на них и клике по соответствующей ссылке (как и в других вариантах). Поддерживаются разные таксономии и пользовательские поля. Комментарии при этом, разумеется, не переносятся. Не смотря на то, что это «авторская разработка», ее уже скачали более 100тыс. людей, оценка хорошая. Единственный минус — обновление около 10ти месяцев назад.

Page and Post Clone

Еще одно простое решение с принципом работы, аналогичным предыдущим пунктам, однако информации о поддержке других таксономий не нашел. Загрузок — более 50к, оценка максимальная, обновление недавно было.