WordPressにマイリストを追加して投稿動画風の前後関係リンクをつける

WordPressの最近のテーマだと個別記事のページで時系列の前後の記事のリンクを表示してくれる。これはこれであってよいのだが、日(記事)をまたいだ時には意味がなくなる。

パートが複数ある投稿動画のような前後関係のリンクを手動で書くのが面倒になったのでこれを簡単にしようと思った。

最初はカスタム投稿データにprev_postnext_postを追加して自前のテーマで表示しようと思ったんだけど双方向の設定や投稿IDを調べるのが面倒。

次にmylistというカスタム投稿データを追加して同じデータを持つ投稿を検索しようと思ったけどそれってもうタクソノミーでいいじゃんと思ってタクソノミーを追加してみることにした。WordPressにはカスタムタクソノミーというものがあってタグやカテゴリの他に独自の分類を追加できるようになっている。今回はこれを利用してマイリストという分類を追加して同じリストにしたい投稿にタグを追加するように設定していく。

プラグインにするのも面倒なので自前のテーマのfunction.phpから上記ファイルを読み込んでいる。すると投稿編集画面でカテゴリ、タグの他にMylistを追加できるようになる。

function.php
require(get_template_directory() . '/mylist.php');

投稿動画風のリンクだと、最初→、前→、次→のようなリンクを書くことが多いのでmylist.phpget_first_post_on_mylistget_adjacent_post_on_mylistという前後関係の投稿を取得する関数を追加している。

あとはこれらを使って個別ページで表示するテンプレートを書いた。

template-tags.php
function mylist_nav()
{
    global $post;

    if ($mylist = get_mylist($post)) {

        $first_post = get_first_post_on_mylist($post);
        $prev_post = get_adjacent_post_on_mylist($post, true);
        $next_post = get_adjacent_post_on_mylist($post, false);

        if ($first_post->ID == $post->ID || $first_post->ID == $prev_post->ID) {
            unset($first_post);
        }

        $mylist_link = get_term_link($mylist, 'mylist');

        ?>
        <div class="section section-mini">
            <h2 class="section-title">List</h2>

            <div class="section-content">
                <?php if ($first_post): ?>
                    最初→&nbsp;<a href="<?php echo get_permalink($first_post) ?>"
                                rel="prev"><?php echo get_the_title($first_post) ?></a>&nbsp;
                <?php endif ?>
                <?php if ($prev_post): ?>
                    前→&nbsp;<a href="<?php echo get_permalink($prev_post) ?>"
                                rel="prev"><?php echo get_the_title($prev_post) ?></a>&nbsp;
                <?php endif ?>
                <?php if ($next_post): ?>
                    次→&nbsp;<a href="<?php echo get_permalink($next_post) ?>"
                                rel="prev"><?php echo get_the_title($next_post) ?></a>&nbsp;
                <?php endif ?>
                <?php if (!is_wp_error($mylist_link)): ?>
                    マイリスト→&nbsp;<a href="<?= $mylist_link ?>"><?= $mylist->name ?></a>&nbsp;
                <?php endif ?>
            </div>
        </div>
    <?php
    }
}

とりあえず粛々とやっている大掃除マイリスト

若干デザイン的に浮いているので調整したいが機能的には思い道理のものができた。