add_filterでJetPackより先に「関連記事リスト」を表示させてみる覚書

the_contentの下にコンテンツを追加しようとすると、JetPackのようなコンテンツを差し込むプラグインが優先されて思うように配置できない・・・ということがままあります。 今回はadd_filterの引数を使って […]

広告ここから
広告ここまで

目次

    the_contentの下にコンテンツを追加しようとすると、JetPackのようなコンテンツを差し込むプラグインが優先されて思うように配置できない・・・ということがままあります。

    今回はadd_filterの引数を使って、自由に表示位置を選択できる方法をざっくりまとめました。

    Before – After

    JetPackの「共有」や「関連記事」機能よりも上にオリジナルの「関連記事リスト」が出るようになりました。

    変更前 変更後
    スクリーンショット_031015_105413_AM スクリーンショット_031015_105337_AM

    というわけでこの「場所入れ替え」を行うために触ったコードをざっくりとまとめてみます。

    元々のコード

    元のコードはテーマファイルでthe_contentを呼び出している部分の直下に直接記述していました。

    content.php(ループ内でコール)

    [php]
    //前略
    <?php the_content(); ?>
    <aside>
    <h2>こちらの記事もおすすめです:-)</h2>
    <ul class="disc">
    <?php

    $cur_post = $wp_query->get_queried_object();
    $post_cats = get_the_category($cur_post->ID);

    foreach((get_the_category()) as $cat) {
    $cat_id = $cat->cat_ID ;
    break ;
    }
    $query = ‘cat=’ . $cat_id. ‘&showposts=6’; //
    query_posts($query) ;
    if ( have_posts() ) : while ( have_posts() ) : the_post();
    if ($post->ID !== $cur_post->ID) :?>
    <li>
    <a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a>
    </li>
    <?php
    endif; endwhile; else:
    ?>
    <p>記事がありません</p>
    <?php
    endif;
    wp_reset_query();
    ?>
    </ul>
    </aside>
    //以下略
    [/php]

    このやり方のネックは「the_contentに働きかける系のプラグインが優先されること」です。

    the_contentの中にコンテンツを追加されてしまうとそっちが先に表示されてしまうので、どうしても表示順序の操作がやりにくくなります。

    とすると「だったらこいつもthe_contentに追加すればいいじゃないか」というわけで、実際にfunctions.phpに移設してみました。

    書き換え後のコード

    ここからはfunctions.phpを直接触るか、プラグインとしてコードを書いていきます。

    functions.phpもしくはプラグイン

    [php]
    add_filter( ‘the_content’, ‘add_recomend_post_list’, 10 );
    function add_recomend_post_list($content){
    global $wp_query;
    $text_recommend = "<aside><h2>こちらの記事もおすすめです:-)</h2><ul class=’disc’>";
    $cur_post = $wp_query->get_queried_object();
    $post_cats = get_the_category($cur_post->ID);

    foreach((get_the_category()) as $cat) {
    $cat_id = $cat->cat_ID ;
    break ;
    }

    $query = ‘cat=’ . $cat_id. ‘&showposts=6’;
    query_posts($query);
    if ( have_posts() ) : while ( have_posts() ) : the_post();
    if ($post->ID !== $cur_post->ID) :
    $text_recommend .= "<li><a href=’" . get_permalink() . "’>" . get_the_title() ."</a></li>";
    endif;
    endwhile;endif;
    wp_reset_query();
    $text_recommend = $text_recommend . "</ul></aside>";
    $content = $content . $text_recommend;
    return $content;
    }
    [/php]

    プラグインにするのは心理的ハードルが高めですが、エラーが起きた時にサイト自体は落ちないので安全性はこっちのほうが高かったりします。

    ポイント

    ここからは「なぜこのやり方で順番を入れ替えれるか?」というところをざっくりと。

    まずJetPackの「共有」ボタンを呼び出す処理は以下のような形になっています。
    [php]
    add_filter( ‘the_content’, ‘sharing_display’, 19 );
    [/php]
    *参考:GitHub

    3つ目の引数(19が入っているところ)が「フィルターの呼出順序」になります。

    apply_filterのパラメータ(Codexより引用)

    [php]
    <?php apply_filters( $tag, $value, %var… ); ?>
    [/php]

    $tag
    (文字列) (必須) フィルターフック名。
    初期値: なし
    $value
    (mixed) (必須) フィルターがフックされている $tag が変更できる値。
    初期値: なし
    $var
    (mixed) (オプション) フィルター関数へ渡す追加変数(複数指定可)。バージョン 1.5.1 で追加。
    初期値: なし

    関数リファレンス/apply filters – WordPress Codex 日本語版

    ですのでfilter処理が重複した場合は、優先したいfilterの3つ目の引数の数字を相対的に小さい値にするとOKです。

    反対に数字を大きくすれば、今までどおりの配置や、「共有」と「関連記事」の間に差し込むことも可能ということですね。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark