共通のタグが設定されている記事を関連記事として記事下に表示させる

お題

特定のカテゴリの個別投稿ページの記事下に、その記事と同じタグが設定されている固定ページのリストを表示させたい。

考え方

最初:個別投稿ページに設定されているタグリストと各固定ページのタグリストを結合して、配列の要素数によって重複を判断して重複していたらその固定ページを表示するようにしよう。 → 試してみたけど、上手くいかない。。 結局、tag__inを使って同じタグが設定されている記事のリストを取得してそれを表示するように。

実装方法

サンプルコード


// コラムカテゴリの個別投稿の場合に、記事下に関連する固定ページ記事へのリンクリストを挿入するフィルタ
function rankingadd($the_content) {
    if(!is_home() && !is_front_page() && !is_page()) {
        if(is_single() && in_category('feature')) {
            $current_tags = get_the_tags();
            //この記事がタグを持っているかどうか判別
            if (!empty($current_tags)) {
                foreach ( $current_tags as $tag ) {
                    $current_tag_list[] = $tag->term_id;
                }

                // 記事下に表示する固定ページ記事を特定するための変数準備(rankingページ配下の子ページのみが対象)
                $get_page_id = get_page_by_path('ranking');
                $get_page_id = $get_page_id -> ID;

                // 抽出条件(固定ページ、公開済み、親ページのIDが指定のものである、表示させる記事と同一のタグが設定されている、収集件数は全部)
                $args = array(
                              'post_type'      => 'page',
                              'post_status'    => 'publish',
                              'post_parent'    => $get_page_id,
                              'tag__in'        => $current_tag_list,
                              'posts_per_page' => '-1'
                             );

                // 新しいループを使って表示記事のリストを作成
                $related_posts = new WP_Query( $args );
                //関連する記事があるかどうか判別
                if($related_posts->have_posts()) {
                    $str  = '';
                    $str .= '<ul>'."\n";
                    while($related_posts->have_posts()) {
                        $postInfo = $related_posts->the_post();
                        $postid   = $postInfo->ID;
                        $str .= '<li><a href="' .get_permalink($postid) .'">' .get_the_title($postid) .'</a></li>'."\n";
                    }
                    $str .= '</ul>'."\n";

                    $the_content .= $str;
                    return $the_content;

                } else {
                    return $the_content;
                }
            } else {
                return $the_content;
            }
        } else {
            return $the_content;
        }
    } else {
        return $the_content;
    }
    wp_reset_postdata();
}

add_filter('the_content', 'rankingadd');

おまけ:上手くいかなかった最初の考え方のサンプルコード(失敗原因未検証)


// コラムカテゴリの個別投稿の場合に、記事下に関連する比較・ランキング記事へのリンクリストを挿入するフィルタ
function rankingadd($the_content) {
    if(!is_home() && !is_front_page()) {
        // 不動産投資コラムのときのみ適用
        if(in_category('feature')) {
            // 固定ページ「ranking」の子ページのみのリストを配列で抽出
            $get_page_id = get_page_by_path('ranking');
            $get_page_id = $get_page_id -> ID;
            $rankpages = get_posts(
                                   array(
                                         'post_type' => 'page',
                                         'post_status' => 'publish',
                                         'posts_per_page' => '-1',
                                         'post_parent' => $get_page_id
                                        )
                                  );
            // コラム記事のタグ数を確認
            $colpost = get_post();
            $colid  = $colpost -> ID;
            $colarr = get_the_tags($colid);
            $coltag = $colarr -> slug;
            $colcnt = (int)count($coltag);

            // 記事下挿入情報用変数初期化
            $str = "";

            // 「ranking」の各子ページについて、タグ数を確認(判定条件に+1があるのは、確実に共通しているタグが1つ存在するから)
            // コラム記事のタグ配列と子ページのタグ配列を結合した配列の要素数を確認
            // コラム記事タグ数+子ページタグ数=結合配列要素数+1なら重複なし → 子ページ情報は追加しない
            // コラム記事タグ数+子ページタグ数>結合配列要素数+1なら重複あり → 記事末尾に子ページ情報を追加
            if(!empty($rankpages)) {
                foreach($rankpages as $rankid) {
                    $rankid = $rankpages -> ID;
                    $rankarr = get_the_tags($rankid);
                    $ranktag = $rankarr -> slug;
                    $rankcnt = (int)count($ranktag);

                    $mergetag = array_merge($coltag,$ranktag);
                    $mergecnt = (int)count($mergetag);

                    if($colcnt + $rankcnt > $mergecnt + 1) {
                        $ranktitle = $rankpages -> post_title;
                        $rankurl = $rankpages -> guid;
                        $str .= '<li><a href="';
                        $str .= $rankurl;
                        $str .= '">';
                        $str .= $ranktitle;
                        $str .= '</a></li>';
                    }
                    
                }
            }

            // 共通する比較・ランキングページが存在したら、$strの前後にulタグを追加してthe_content()の後ろに挿入
            if(!empty($str)) {
                $addcontent .= $the_content;
                $addcontent .= '<ul>';
                $addcontent .= $str;
                $addcontent .= '</ul>';
            }

            return $addcontent;

        } else {

            return $the_content;

        }
    }
}

add_filter('the_content','rankingadd');
The following two tabs change content below.

Web勉強中おじさん

最新記事 by Web勉強中おじさん (全て見る)

0