投稿や固定ページをプラグインなしで複製する方法を実装してみた。 

Dupulicate3 ワードプレス関連
この記事は約6分で読めます。
記事内に広告が含まれています。
スポンサーリンク

以前は、投稿記事や固定ページを複製する際にプラグインを使用していました。しかし、複製機能の使用頻度がそれほど高くないと感じたため、プラグインを削除しました。
その後、お知らせなどの記事を再利用したい場面が出てきたため、自前で記事の複製機能を追加することにしました。今回は、プラグインに頼らず、functions.php にコードを記述して機能を実装する方法を選びました。
機能はシンプルで、「複製」のみを目的としたものですが、投稿記事、固定ページ、そしてカスタム投稿にも対応できるようになっています。
同じような機能の実装を検討している方の参考になればと思い、忘備録としてこの記事を残します。

スポンサーリンク

記事の複製 機能について

特に変わった機能はなく、シンプルにクリックするだけで複製されるものです。
複製された記事は、すぐに編集画面が開き、タイトルの前に複製の文字が投入されます。

Function.phpに貼付け

下記コードをFunction.phpに貼り付ければ完成です。
16行目の青色の”複製:”がタイトルの前に記述されます。
56行目の”記事を複製”が投稿一覧のオプション(編集、クイック編集等があるところ)に表示されます。
複製、記事を複製はお好きな言葉に変更ください。

/******************************
投稿記事 複製機能の追加
*****************************/
function duplicate_post_as_draft(){
    global $wpdb;

    if (! (isset($_GET['post']) || isset($_POST['post']) || (isset($_REQUEST['action']) && 'duplicate_post_as_draft' == $_REQUEST['action']))) {
        wp_die('No post to duplicate has been supplied!');
    }

    $post_id = (isset($_GET['post']) ? $_GET['post'] : $_POST['post']);
    $post = get_post($post_id);

    if (isset($post) && $post != null) {
        // 新しい投稿タイトルに「複製」を追加
        $new_title = '複製: ' . $post->post_title;

        $new_post = array(
            'post_title' => $new_title, // ここでタイトルに「複製」を追加
            'post_content' => $post->post_content,
            'post_status' => 'draft',  // 新しい投稿を下書きとして作成
            'post_type' => $post->post_type,
            'post_author' => $post->post_author,
        );

        $new_post_id = wp_insert_post($new_post);

        // タクソノミー(カテゴリ、タグなど)を複製
        $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);
        }

        // メタデータを複製
        $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) {
            foreach ($post_meta_infos as $meta_info) {
                $meta_key = $meta_info->meta_key;
                $meta_value = $meta_info->meta_value;
                update_post_meta($new_post_id, $meta_key, $meta_value);
            }
        }

        // 新しい投稿の編集画面にリダイレクト
        wp_redirect(admin_url('post.php?action=edit&post=' . $new_post_id));
        exit;
    } else {
        wp_die('Post creation failed, could not find original post.');
    }
}
add_action('admin_action_duplicate_post_as_draft', 'duplicate_post_as_draft');

function duplicate_post_link($actions, $post) {
    if (current_user_can('edit_posts')) {
        $actions['duplicate'] = '<a href="' . wp_nonce_url('admin.php?action=duplicate_post_as_draft&post=' . $post->ID, basename(__FILE__), 'duplicate_nonce') . '" title="Duplicate this item" rel="permalink">記事を複製</a>';
    }
    return $actions;
}
add_filter('post_row_actions', 'duplicate_post_link', 10, 2);
add_filter('page_row_actions', 'duplicate_post_link', 10, 2); // 固定ページにも適用

問題がなければ⇩のようになっているはずです。

Dupulicate1
Dupulicate2

通常は上のコードで、投稿、固定、カスタム投稿で問題なくオプションが表示されると思います。
もしカスタム投稿タイプで”記事の複製”のオプションが表示されない場合、一番下に下記を追加してみてください。

add_filter('投稿タイプ名_row_actions', 'duplicate_post_link', 10, 2); // カスタム投稿タイプに適用

赤色の投稿タイプ名を設定しているカスタム投稿タイプ名に変更ください。

スポンサーリンク

さいごに

とってもシンプルな機能ですが、いがいに役に立ちますよ。
興味のある方はお試しください。

Function.phpの編集を行う際には、バックアップ等を取ることをお勧めします。
編集にあたっては、自己責任となります。

コメント

タイトルとURLをコピーしました