既存の投稿または固定ページと同一(またはほぼ同一)の新しい投稿または固定ページを作成したい場合があります。

投稿または固定ページが長い場合、または多くのメディアが含まれている場合、すべてのコンテンツをもう一度追加するのは非常に骨の折れる作業に感じるかもしれません。また、類似する投稿が多数ある場合は、文章を手動でもう一度入力することも、メディアファイルをすべて追加して新しい投稿または固定ページを作成するのは面倒でしょう。

1つのブラウザウィンドウまたはタブで既存の投稿を開き(便宜上のために、以下は「投稿と固定ページ」ではなく「投稿」のみを使用します)、別のウィンドウで新しい投稿を作成し、 コンテンツをコピーして貼り付けるのは一つのやり方です。結局のところ、WordPressの最近の(Gutenbergがリリースされ後の)バージョンでは、「すべてのコンテンツをコピー」オプションを利用できるため、これは非常に簡単です。

一方、何回も上記を行う必要がある場合は、エラーが発生するリスクがあります。元の投稿を誤って編集し、サイトに既に公開したコンテンツを上書きした場合はどうなりますか?または、コピーしたい投稿が多数あり、作成済みの投稿がどちらか分からなくなった場合は?

幸いなことに、もっと簡単なやり方があります。編集したり調整したりして、既存のコンテンツとほぼ同じ新規投稿を作成できるように、投稿や固定ページを複製する無料のプラグインが存在します。

本記事では、投稿の複製のやり方と最高なプラグインのいくつかをご紹介します。

ただし、最初に、プラグインを使わずにWordPressで固定ページまたは投稿を半手動で複製する方法についても説明します。半手動の方法では、コピーと貼り付けを行いますが、WordPressを使用するとこれは非常に簡単です。コピーする投稿が1つしかない場合は、プラグインをインストールするよりもおそらく速くなります。

WordPressで固定ページまたは投稿を複製する方法

プラグインをインストールする時間を節約できるため、複製する投稿が1つしかない場合、この方法の方が速いでしょう。複製する投稿が多数ある場合は、このセクションをスキップすることを強くお勧めします。プラグインを使用する方が、正確性は言うまでもなく、はるかに速くなります。

さて、1つだけの投稿または固定ページを複製する場合は、次の手順に従います。

まず、既存の投稿または固定ページを開きます。投稿のブロックの外側をクリックするか、画面右側の編集ペインの「文書」タブを選択して、一つのブロックではなく文書全体が選択されている状態にします。一つのブロックが選択されている場合、WordPressは文書全体ではなく、そのブロックのみのコンテンツをコピーします。

次に、編集画面の右上にある省略記号(3点リーダー)をクリックします。

WordPressのすべてのコンテンツをコピーするオプション
WordPressのすべてのコンテンツをコピーするオプション

メニューが表示されます。このメニューの下部に「すべてのコンテンツをコピー」が表示されます。それをクリックすると、コンテンツがコピーされたというメッセージが表示されます。

次に、新しい投稿を作成します。投稿にタイトルを付け、編集画面の最初の空のブロックをクリックします。貼り付けにキーボードのショートカットキーを使用します(WindowsではCtrl + V、MacではCmd + V)、または右クリックして表示されるショートカットメニューの「貼り付け」を選択します。

これで、既存の投稿のコンテンツが新しい投稿に表示されます。マジック! (ではないですが…)

これで、その投稿を編集して、以前の投稿とは異なるものにすることができます。これは、私が強く推奨することです。サイト上で全く同じブログ投稿を作成しても意味がありません。訪問者を混乱させるだけでなく、SEOにも悪影響を及ぼします。

しかし、投稿の複製を複数作成したい場合はどうすれば良いでしょうか?下記をご参照ください。

WordPressプラグインで固定ページまたは投稿を複製する方法

投稿を複製する最も速く、最も簡単で信頼できる方法は、プラグインを使用することです。これにより、時間を節約し、人為的なエラーを回避し、どの投稿タイプをコピーできるようになります。私たちの経験では、投稿の複製をよく実施するのはカスタム投稿タイプです。2つのほとんど同様なブログ投稿を公開するのは珍しいことですが、たとえばストアの商品なら、よくあることです。

そこで、投稿を簡単に複製できるプラグインと、その使い方を以下に示します。

WooCommerce

投稿複製のプラグインではなくeコマースプラグインであるWooCommerceが本記事で紹介されることを疑問に思われるかもしれません。

ただし、WooCommerceでは追加のプラグインをインストールせずに商品を複製できることを知っておく価値はあります。投稿複製プラグインを探して、商品を複製するために使用し始める前に、WooCommerceの組み込み機能を使用して見ましょう。

WooCommerceの商品一覧に移動し、マウスを該当の商品の上に置くと、その投稿の下に「複製」リンクが表示されます。

WooCommerceの商品を複製するオプション
WooCommerceの商品を複製するオプション

複製」リンクをクリックするだけで、新しい商品が作成されます。新しい商品の編集画面が表示されるため、そのまま変更して公開できます。

新しい商品のスラッグは既存の商品のスラッグに「-copy」が追加されたものになるため、新しい商品のタイトルを変更した場合でも、スラッグを編集する必要があることにご注意ください。

複製された商品の編集
複製された商品の編集

Duplicate Postプラグイン

Duplicate Postは、投稿を複製するための最も人気のあるプラグインで、300万回以上ダウンロードされています。

アクティブ化すると、WordPress管理画面の投稿一覧の各投稿に「 Clone」(クローン)というリンクが追加されます。

Duplicate Post プラグイン
Duplicate Post プラグイン

複製する投稿の下の「 Clone」リンクをクリックすると、同じコンテンツとタイトルの下書きの新規投稿が作成されます。

その後、新しい投稿を編集して新しいタイトルを付けることができます。(そうするように強くお勧めします。WordPressでは同じタイトルの投稿を作成することができますが、ユーザーエクスペリエンスには良くないことです。)

また、固定ページとカスタム投稿タイプにも同じ「 Clone」リンクが追加されます(設定で有効にした場合)。

Duplicate Page

900,000以上のダウンロードのあるDuplicate Pageプラグインは、上記のDuplicate Postプラグインの代替品です。

プラグインをインストールしたら、投稿または固定ページの管理画面に移動するか、カスタム投稿タイプの管理画面に移動すると、各投稿の下に「Duplicate This」(これを複製)リンクが表示されます。例えば、カスタム投稿タイプでは次の通りです。

Duplicate Page プラグイン
Duplicate Page プラグイン

リンクをクリックすると、元の投稿と同じコンテンツとタイトルの下書きの新規投稿(または固定ページやカスタム投稿タイプの投稿)が表示されます。公開する前に、編集してスラッグを修正する必要があります。

注:WooCommerceをご利用の場合、WooCommerceの独自の本記事の前半で説明した「複製」リンクで上書きされるため、商品画面にこのプラグインの「Duplicate This」リンクは表示されません。

固定ページまたは投稿を一括複製する方法

上記のプラグインを使用すると、一度に1つの投稿を複製できます。しかし、サイトのすべての投稿、またはあるカスタム投稿タイプのすべての投稿を複製したい場合はどうすればよいでしょうか?それとも、今年公開したすべての投稿の場合?

WP Bulk Post Duplicatorプラグインを使用すると、一括複製が可能になります。このプラグインでは、個々の投稿に付けた複製リンクではなく、設定した条件に従って投稿を一括複製できる設定画面を使用できます。

注:このプラグインは、執筆時点では2年前から更新されていないため、本番サイトで使用する前に開発サイトにインストールしてテストすることをお勧めします。私たちはテストサイトで問題なく使用できました。

プラグインをインストールした上で、「設定」> 「WP Bulk Post Duplicator」に移動して、プラグインの設定画面を表示します。

まず、複製する投稿タイプと投稿のステータスを選択します。例えば、「投稿」と「公開済み」を選択すると、プラグインはすべての公開済みの投稿を複製します。一方、「投稿」と「下書き」を選択すると、プラグインはすべての下書きを複製します。

一括複製の設定:投稿タイプと投稿のステータス
一括複製の設定:投稿タイプと投稿のステータス

下にスクロールして、複製する投稿の年を選択します(これはオプションです)。次に、作成された新しい投稿のステータスを指定することもできます。何も指定しない場合、ステータスはデフォルトの「下書き」になります。

一括複製の設定:年と公開ステータス
一括複製の設定:年と公開ステータス

複製」ボタンをクリックすると、プラグインが投稿を複製します。ここで、複製されたすべてのページを確認できます。私は公開されている既存のページを12点と新しい下書きのページを12点複製しました。次に、すべてのページを一個ずつ確認して、公開する前に編集する必要があります。これには明らかに時間がかかりますが、一括複製により作業は迅速になりました。

独自の投稿複製プラグインを作成する方法

サードパーティ製のプラグインを使用して投稿を複製するよりも、独自のプラグインを作成したい場合はどうなりますか?

問題ありません。以下の手順に従って、独自の投稿複製プラグインを作成してください。

1. プラグインのセットアップ

まず、プラグインをセットアップします。 「wp-content/plugins」フォルダーで新しいファイルを作成し、次のコメントアウトしたテキストをそのファイルに追加します。(ファイルを編集して、作成者名をご自分の名前にしてもかまいません。)

<?php
/*
Plugin Name: Kinsta Duplicate posts and pages
Plugin URI: https://kinsta.com
Description: Plugin to accompany kinsta posst on duplicating posts in WordPress.Allows for duplication of posts and pages.
Version: 1.0
Author: Rachel McCollin
Author URI: https://rachelmccollin.com
TextDomain: kinsta
License: GPLv2
*/

2. 関数の作成

次に、投稿を複製する関数を追加し、アクションフックにフックします。このアクションフックはまだ存在しません。心配しないでください。まもなく作成されます。

function kinsta_duplicate_post(){
}
add_action( 'admin_action_kinsta_duplicate_post', 'kinsta_duplicate_post' );

次に、アクションを作成します。アクションは、投稿と固定ページの画面に複製リンクを追加する関数の一部になります。

function kinsta_duplicate_post_link( $actions, $post ) {
 if ( current_user_can( 'edit_posts') ) {
  $actions['duplicate'] = 'Duplicate';
 }
 return $actions;
}
add_filter( 'post_row_actions', 'kinsta_duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'kinsta_duplicate_post_link', 10, 2);

これで複製用のリンクが追加されますが、実際の複製機能はまだ機能しません。

3. 複製機能の追加

複製機能用のコードを追加しましょう。コードの残りをすべて、空のkinsta_duplicate_post() 関数内に記載します。

まず、セキュリティのために、有効な投稿が選択されていることを確認し、ノンスを確認します。

global $wpdb;

// Die if post not selected
if (! ( isset( $_GET['post']) || isset( $_POST['post'])  || ( isset($_REQUEST['action']) && 'kinsta_duplicate_post' == $_REQUEST['action'] ) ) ) {
 wp_die( __( 'Please select a post to duplicate.', 'kinsta' ) );
}

// Verify nonce
if ( ! isset( $_GET['duplicate_nonce'] ) || ! wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) ) {
 return;
}

次に、複製する投稿のIDとそのデータをフェッチする必要があります。

// Get id of post to be duplicated and data from it
$post_id = ( isset( $_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) );
$post = get_post( $post_id );

これで引数の配列を定義し、wp_insert_post()を使用してデータベースに新しい投稿を挿入できます。ただし、まずは投稿が「null」ではないことを確認する条件ステートメントを追加します。

if ( isset( $post ) && $post != null ) {

}

条件ステートメントの中に次を追加します。

// args for new post
$args = array(
 'comment_status' => $post->comment_status,
 'ping_status'    => $post->ping_status,
 'post_author'    => $post->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 new post
$new_post_id = wp_insert_post( $args );

次に、既存の投稿から分類法をフェッチして、新規投稿に追加します。

// add taxonomy terms to the new post

// identify taxonomies that apply to the post type
$taxonomies = get_object_taxonomies( $post->post_type );

// add the taxonomy terms to the new post
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 );
}

次に、SQLクエリを使用して、追加の投稿メタデータを追加します。

// use SQL queries to duplicate postmeta
$post_metas = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");
if ( count( $post_metas )!=0 ) {
 
$sql_query = "INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) ";
 
foreach ( $post_metas as $post_meta ) {
  $meta_key = $post_metas->meta_key;
  if( $meta_key == '_wp_old_slug' ) continue;
  $meta_value = addslashes( $post_metas->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 );

}

最後に、投稿の投稿タイプを確認し、関連する画面にリダイレクトします。

// redirect to admin screen depending on post type
$posttype = get_post_type( $post_id );
wp_redirect( admin_url( 'edit.php?post_type=' .$posttype ) );

ここで、if ( isset( $post ) && $post != null )の括弧の外に、エラーメッセージを追加します。

else {
 // display an error message if the post id of the post to be duplicated can't be found
 wp_die( __( 'Post cannot be found.Please select a post to duplicate.', 'kinsta' ) );
}

以上です!

プラグインのコード全貌

プラグインの完全なコードは次のとおりです。

<?php

/* Plugin Name: Kinsta Duplicate posts and pages

Plugin URI: https://kinsta.com
Description: Plugin to accompany kinsta posst on duplicating posts in WordPress. Allows for duplication of posts and pages. Version: 1.0 Author: Rachel McCollin
Author URI: https://rachelmccollin.com
TextDomain: kinsta
License: GPLv2
*/

/********************************************************************
kinsta_duplicate_post() - duplicates the selected post
*********************************************************************/

function kinsta_duplicate_post(){

global $wpdb;

// Die if post not selected
if (! ( isset( $_GET['post']) || isset( $_POST['post'])  || ( isset($_REQUEST['action']) && 'kinsta_duplicate_post' == $_REQUEST['action'] ) ) ) {

wp_die( __( 'Please select a post to duplicate.', 'kinsta' ) );
}

// Verify nonce
if ( ! isset( $_GET['duplicate_nonce'] ) || ! wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) ) {
return;
}

// Get id of post to be duplicated and data from it
$post_id = ( isset( $_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) );
$post = get_post( $post_id );

// duplicate the post
if ( isset( $post ) && $post != null ) {

// args for new post
$args = array(
'comment_status' => $post->comment_status,
'ping_status'    => $post->ping_status,
'post_author'    => $post->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 new post
$new_post_id = wp_insert_post( $args );

// add taxonomy terms to the new post

// identify taxonomies that apply to the post type
$taxonomies = get_object_taxonomies( $post->post_type );

// add the taxonomy terms to the new post
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 );

}

// use SQL queries to duplicate postmeta
$post_metas = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");

if ( count( $post_metas )!=0 ) {
 
 $sql_query = "INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) ";

 foreach ( $post_metas as $post_meta ) {

  $meta_key = $post_metas->meta_key;
  if( $meta_key == '_wp_old_slug' ) continue;
  $meta_value = addslashes( $post_metas->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 );

 }

 // redirect to admin screen depending on post type
 $posttype = get_post_type( $post_id );
 wp_redirect( admin_url( 'edit.php?post_type=' . $posttype ) );

 } else {

  // display an error message if the post id of the post to be duplicated can't be found
  wp_die( __( 'Post cannot be found. Please select a post to duplicate.', 'kinsta' ) );
 }

}
add_action( 'admin_action_kinsta_duplicate_post', 'kinsta_duplicate_post' );

// Add the duplicate link to action list for post_row_actions
function kinsta_duplicate_post_link( $actions, $post ) {

 if ( current_user_can( 'edit_posts') ) {
  $actions['duplicate'] = 'Duplicate';
 }

 return $actions;

}
add_filter( 'post_row_actions', 'kinsta_duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'kinsta_duplicate_post_link', 10, 2);

完全なプラグインはgithubにもあります。

おめでとうございます!これで、WordPressサイトの投稿と固定ページを複製するための独自のプラグインができました。

このコードの一部は、Hostingerブログの投稿を参照して作成されました。

まとめ

投稿や固定ページを複製する際にプラグインを使用すると、作業は手動で行うよりも速くなり、コンテンツをコピーする際のエラーのリスクを取り除くことができます。

コピーする投稿が1つしかない場合は、WordPressに組み込まれている「すべてのコンテンツをコピー」機能を使用した方が速いかもしれませんが、複数の投稿の場合は、プラグインを使用した方がいいでしょう。上記のプラグインのいずれかを使用する場合、または独自のプラグインをコーディングする場合は、必要な数の投稿、固定ページ、またはカスタム投稿タイプを複製できます。

このようにすると、時間を節約できます。そしてさらに重要なことに、新規投稿を編集しようとしたときに、誤って既存の投稿を編集してしまう危険性がなくなります。