投稿・固定ページ複製

WordPress(WP)で作成した『投稿』、『固定ページ』や『カスタム投稿』を簡単に複製(コピー)する方法をご紹介します。

WordPressには、過去の投稿や固定ページを複製する機能が備わっていません。

複製機能のメリットは、投稿や固定ページなどを追加する際に、一度作業を行ったページと統一性を持たせるために、テンプレート化しやすいという点で作業効率が良くなることです。


― 複製機能の追加方法 —

複製機能を追加する2つの方法をご紹介します。

(1)プラグインを追加して機能を追加

(2)functions.phpにプログラムを追加する

プラグインは便利ですが、古いプラグインやご利用のテーマやプラグインの組み合わせによっては、不具合を起こす場合もあります。本記事では特定の環境下での手順を示したものであり、ご利用の環境によっては本記事記載の手順以外の設定が必要になることもあります。そのため本番環境下へのプラグインの導入は、バックアップを取った上自己責任で実施をお願いいたします。


(1)プラグインを追加して機能を追加

Wordperss本体の機能を拡張しますので、プラグインを追加すると簡単(2~3分程度)

投稿・固定ページの複製プラグイン

Yoast Duplicate Post
Duplicate Page
Duplicate Post

プラグインを追加で『複製』と検索すると様々なプラグインがヒットします。
Yoast Duplicate Post
Duplicate Page
Duplicate Post
はインストールするして、有効にするだけで複製が出来るようになります。


(2)functions.phpにプログラムを追加する

この方法は、プラグイン追加に伴うソースの増加が気になる、
ちょっとでもSEOを考慮したいと思われる方向けです。
直接プログラムを追加するため、「間違えてサイトを壊す」というリスクを考慮しなければなりませんが、下記のソースをコピペするだけで、簡単に複製機能を追加することが出来ます。

【注意点】
サーバーでWAFが設定されていると、functions.phpが更新できない場合があります。
予め、WAFをOFFにしておくことも考慮しましょう。

/**Duplicate *********/
// 投稿・固定ページの複製リンクを追加
function add_duplicate_post_link($actions, $post) {
    if (current_user_can('edit_posts')) {
        $actions['duplicate'] = '<a href="' . wp_nonce_url(
            admin_url('admin.php?action=duplicate_post_as_draft&post=' . $post->ID),
            basename(__FILE__), 'duplicate_nonce'
        ) . '" title="この投稿を複製">複製</a>';
    }
    return $actions;
}
add_filter('post_row_actions', 'add_duplicate_post_link', 10, 2);
add_filter('page_row_actions', 'add_duplicate_post_link', 10, 2);

// 複製処理
function duplicate_post_as_draft() {
    if (
        !isset($_GET['post']) ||
        !isset($_GET['duplicate_nonce']) ||
        !wp_verify_nonce($_GET['duplicate_nonce'], basename(__FILE__))
    ) {
        wp_die('不正なリクエストです');
    }

    $post_id = absint($_GET['post']);
    $post = get_post($post_id);

    if (isset($post) && $post != null) {
        $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);

        // カスタムフィールドも複製
        $meta = get_post_meta($post_id);
        foreach ($meta 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) {
            $terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'ids'));
            wp_set_object_terms($new_post_id, $terms, $taxonomy);
        }

        wp_redirect(admin_url('post.php?action=edit&post=' . $new_post_id));
        exit;
    } else {
        wp_die('投稿が見つかりません');
    }
}
add_action('admin_action_duplicate_post_as_draft', 'duplicate_post_as_draft');

functions.php にコピペするだけで、複製機能を追加できるので、
プラグインの影響で追加されるソースや、プラグインの更新が止まってしまうようなことも気にする必要ないですね。

固定ページでの複製
投稿での複製

投稿者 masterit