PublishPressのプラグインで記事を複数のシリーズに追加させる

PublishPress Seriesの無料バージョンでは、1つの記事に1つのシリーズしか追加できません。しかし、WordPressのプラグインのソースコードは編集可能です。今回は、このプラグインを編集して 1つの記事を複数のシリーズに追加できるようにカスタマイズ する方法をご紹介します。

カスタマイズの背景

デフォルトのPublishPress Seriesでは、記事をシリーズに紐づける際に単一選択しかできません。そのため、例えば「初心者向けJavaScript」と「フロントエンド開発」という2つのシリーズに同じ記事を含めたい場合には対応できません。

今回のカスタマイズでは、コードを編集して 複数選択が可能なチェックボックス形式 に変更します。

コード編集手順

WordPress管理画面 から

  • 「プラグイン」→「プラグインエディター」に移動します。
  • 編集したいプラグインとして「PublishPress Series」を選択します。

プラグインファイル「orgSeries-admin.php」を選択します。

下記のコードを編集・追加します。

// function orgseries_add_meta_box()
// {
// 	global $orgseries;
// 	$posttypes = apply_filters('orgseries_posttype_support', array('post'));
// 	foreach ($posttypes as $posttype) {
// 		add_meta_box('seriesdiv', __('Series', 'organize-series'), 'series_edit_meta_box', $posttype, 'side');
// 		remove_meta_box('tagsdiv-series', $posttype, 'side'); //removes series meta box added by WordPress Taxonomy api.
// 	}
// }

function orgseries_add_meta_box()
{
    global $orgseries;
    $posttypes = apply_filters('orgseries_posttype_support', array('post'));
    foreach ($posttypes as $posttype) {
        add_meta_box('seriesdiv', __('Series', 'organize-series'), 'series_edit_meta_box_multi', $posttype, 'side');
        remove_meta_box('tagsdiv-series', $posttype, 'side'); // Removes the default taxonomy meta box.
    }
}

// 複数シリーズ選択を実現するメタボックス
function series_edit_meta_box_multi($post)
{
    $id = $post->ID;
    $series_list = get_series_list(0); // すべてのシリーズを取得
    $current_series = wp_get_post_terms($id, ppseries_get_series_slug(), ['fields' => 'ids']); // 現在選択されているシリーズを取得
    ?>
    <div class="series-metadiv">
        <div class="tabs-panel">
            <?php wp_nonce_field('save_series_meta_box', 'series_meta_nonce'); ?>
            <ul id="serieschecklist" class="list:series serieschecklist categorychecklist form-no-clear">
                <?php foreach ($series_list as $serial): ?>
                    <li id="series-<?php echo esc_attr($serial['series_ID']); ?>">
                        <label for="in-series-<?php echo esc_attr($serial['series_ID']); ?>">
                            <input value="<?php echo esc_attr($serial['series_ID']); ?>" 
                                   type="checkbox" 
                                   name="post_series[]" 
                                   id="in-series-<?php echo esc_attr($serial['series_ID']); ?>" 
                                   <?php checked(in_array($serial['series_ID'], $current_series)); ?>>
                            <?php echo esc_html($serial['ser_name']); ?>
                        </label>
                    </li>
                <?php endforeach; ?>
            </ul>
        </div>
    </div>
    <?php
}

// 保存時の処理を追加
add_action('save_post', 'orgseries_save_post_series');

function orgseries_save_post_series($post_id) {
    // オートセーブや非認証時は終了
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    }

    if (!isset($_POST['series_meta_nonce']) || !wp_verify_nonce($_POST['series_meta_nonce'], 'save_series_meta_box')) {
        return $post_id;
    }

    // 権限チェック
    if (!current_user_can('edit_post', $post_id)) {
        return $post_id;
    }

    // シリーズ情報を保存
    if (isset($_POST['post_series']) && is_array($_POST['post_series'])) {
        $series_ids = array_map('intval', $_POST['post_series']);
        wp_set_object_terms($post_id, $series_ids, ppseries_get_series_slug(), false);
    } else {
        // シリーズが選択されていない場合、削除
        wp_set_object_terms($post_id, [], ppseries_get_series_slug());
    }

    return $post_id;
}

動作確認

  • 編集が完了したら、記事の編集画面に移動します。
  • 「Series」メタボックスを確認し、複数のシリーズが選択可能なチェックボックスが表示されていることを確認します。
  • 複数のシリーズを選択して記事を保存します。
  • 選択したシリーズが正しく保存されていることを確認します。

カスタマイズの注意点

並び順の変更: デフォルトでは、シリーズ内の記事はID順に並びます。独自の並び順を設定したい場合は、カスタムフィールドやプラグインを活用してさらに調整することができます。

バックアップ: ファイルを編集する前に、必ずプラグインのバックアップを取ってください。

終わりに

このように、少しのコード編集で無料版のPublishPress Seriesをカスタマイズし、記事を複数のシリーズに対応させることが可能です。他のカスタマイズにも挑戦して、自分のサイトに最適な機能を追加していきましょう!

Leave a Comment