質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.34%

  • PHP

    15174questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    4769questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Wordpressで、ページ送りのprev nextタグを『同一サブカテゴリ』にしたい

受付中

回答 2

投稿 2017/12/07 00:38 ・編集 2017/12/07 14:42

flag 質問者が3日前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 0
  • VIEW 87

kenn

score 7

現在、ページ送りのprev nextタグが、『同一カテゴリ内へのリンク』になっているところを、『同一サブカテゴリ(子カテゴリ)』にしたいと考えております。

各、個別ページのフッター部分に設置している、ページ送りの機能で、
PREV:前の記事
NEXT:次の記事
に、各ページ、ページ送りがされています。

ソースは、下記の通りです。

<!--ページナビ-->
<div>
    <dl>
        <?php
        $prev_post = get_previous_post(true);
        if ( !empty( $prev_post ) ): ?>
            <dt>PREV</dt>
            <dd>
<a href="<?php echo esc_url( get_permalink( $prev_post->ID ) ); ?>"><?php echo $prev_post->post_title; ?></a>
            </dd>
        <?php endif; ?>
        <?php
        $next_post = get_next_post(true);
        if ( !empty( $next_post ) ): ?>
            <dt>NEXT</dt>
            <dd>
<a href="<?php echo esc_url( get_permalink( $next_post->ID ) ); ?>"><?php echo $next_post->post_title; ?></a>
            </dd>
        <?php endif; ?>
    </dl>
</div> 

$prev_post = get_previous_post(true);
の部分で、同一カテゴリ内の、ページ送りが出来ているのですが、 この部分をサブカテゴリ(子カテゴリ)内のリンクに変更する方法はありますか?

お詳しい方に、ご教授頂けますと、大変ありがたいです。

どうぞよろしくお願い致します。

【補足1】
例えば、このページでしたら、
http://tetra-themes.com/wordpress-link-158/

フッター付近の「前の記事」「次の記事」の部分を、サブカテゴリ内の記事のみにするための記述を模索しています。
(通常は、サイト内の全記事にリンクし合っている部分です。)

どうぞよろしくお願い致します。

【補足2】
上記コードは、サイト全体の、投稿ページのテンプレートのphpとなっています。
サイト内では、複数のサブカテゴリを設定しているため、テンプレートを変更することで、記事投稿のページ送りを、ずべてサブカテゴリ内で巡回させる方法を模索しております。

各サブカテゴリ番号を指定する方法以外の、「サイト内の投稿」全ページに、適用できるような記述の方法がありますと、大変ありがたいです。

【補足3】
カテゴリIDを、指定せずに、同一のサブカテゴリ内の記事を、ページ送りで、数珠つなぎにしたいのですが、一括で、記述できる方法を模索しております。

下記URLの記事内で、同一「カテゴリ」内を、数珠つなぎに、ページ送りする方法が書かれています。
この「サブカテゴリ版」の記述をしたいと考えております。
ご存じの方がいらっしゃいましたら、どうぞよろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • aozuki

    2017/12/07 14:40 編集

    全ての記事に子カテゴリが必ず設定されていますか? 1記事の子カテゴリは1つですか?2つ以上設定されることがありますか?

    キャンセル

  • kenn

    2017/12/07 14:40

    ご連絡頂き誠にありがとうございます。サブカテゴリとは、親カテゴリの下の階層の、「子カテゴリ」です。

    キャンセル

  • kenn

    2017/12/07 14:44

    全ての記事に子カテゴリが必ず設定されています。1記事の子カテゴリは2つ以上です。(10以上の子カテゴリがあります。1つの記事に対して、複数の子カテゴリが設定されていることもあります。)

    キャンセル

回答 2

+1

テンプレートタグ/previous post link

$in_same_termをtrue、$taxonomyで指定したいサブカテゴリーを指定するといかがでしょうか。

【補足を受けての回答】
全体ということなのでcategory.phpと仮定して回答します。

functions.phpにpre_get_postsを追記してループを制御していらないカテゴリーを外すことができます。
その他の書き方も参考サイトをみればできるのではないでしょうか。
[WordPress]pre_get_postsを使いこなす!pre_get_posts使い方まとめ

function change_posts_per_page($query) {
 /* 管理画面,メインクエリに干渉しないために必須 */
 if( is_admin() || ! $query->is_main_query() ){
     return;
 }

 /* カテゴリーページの表示件数を5件にし、カテゴリID2を除外する */
  if ( $query->is_category() ) {
      $query->set( 'posts_per_page', '5' );
      $query->set( 'cat','-2' );
      return;
  }

}
add_action( 'pre_get_posts', 'change_posts_per_page' );

投稿 2017/12/07 09:40

編集 2017/12/07 10:21

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/07 09:58

    ご連絡頂き誠にありがとうございます。
    $in_same_term、$taxonomyのアドバイス、ありがとうございます。

    もし可能でしたら、
    サイト全体の、投稿ページのテンプレートのphpとなっているため、サイト内で、複数のサブカテゴリを設定しています。
    そのため、各サブカテゴリ番号を指定する方法以外の、「サイト内の投稿」全ページに、適用できるような記述の方法がありますと、大変ありがたいです。

    ご検討頂けますと幸いです。

    キャンセル

  • 2017/12/07 14:35

    ありがとうございます。

    カテゴリIDを、指定せずに、同一のサブカテゴリ内の記事を、ページ送りで、数珠つなぎにしたいのですが、一括で、記述できる方法を模索しております。

    もしご存じでしたらよろしくお願い致します。

    キャンセル

+1

全ての記事に子カテゴリが必ず設定されています。1記事の子カテゴリは2つ以上です。(10以上の子カテゴリがあります。1つの記事に対して、複数の子カテゴリが設定されていることもあります。)

とりあえず該当の記事に設定されている子カテゴリのいずれかで一番目にヒットした記事を表示する仕様で書きます。

<div>
    <dl>
        <?php
        $categories = get_the_category();
        foreach ($categories as $category) {
            if ($category->category_parent === 0) {
                $parent_term_id = $category->term_id;
            } else {
                $child_term_id[] = $category->term_id;
            }
        }
        if (is_array($child_term_id)) {
            $term_children = get_term_children($parent_term_id, 'category');
            $term_children = array_diff($term_children, $child_term_id);
            $term_children = implode(',', $term_children);
        }
        $prev_post = get_previous_post(true, $term_children);
        $next_post = get_next_post(true, $term_children);
        if ( !empty( $prev_post ) ): ?>
            <dt>PREV</dt>
            <dd>
<a href="<?php echo esc_url( get_permalink( $prev_post->ID ) ); ?>"><?php echo $prev_post->post_title; ?></a>
            </dd>
        <?php endif; ?>
        <?php
        $next_post = get_next_post(true, $term_children);
        if ( !empty( $next_post ) ): ?>
            <dt>NEXT</dt>
            <dd>
<a href="<?php echo esc_url( get_permalink( $next_post->ID ) ); ?>"><?php echo $next_post->post_title; ?></a>
            </dd>
        <?php endif; ?>
    </dl>
</div>


get_previous_post()が除外するIDを指定できるものの表示したいIDは指定できなかったので、少し回りくどくなってしまいましたが、
これで変数$prev_post$next_postにはサブカテゴリが一致する記事が入っているはずですので確認してみてください。

投稿 2017/12/07 15:42

編集 2017/12/11 10:20

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/07 16:17 編集

    ありがとうございます!

    <?php
    $prev_post = get_previous_post(true);
    if ( !empty( $prev_post ) ): ?>



    <?php
    $categories = get_the_category();
    foreach ($categories as $category) {
    if ($category->category_parent === 0) {
    $parent_term_id = $category->term_id;
    } else {
    $child_term_id[] = $category->term_id;
    }
    }
    $term_children = get_term_children($parent_term_id, 'category');
    $term_children = array_diff($term_children, $child_term_id);
    $term_children = implode(',', $term_children);
    $prev_post = get_previous_post(true, $term_children);
    $next_post = get_next_post(true, $term_children);
    if ( !empty( $prev_post ) ): ?>

    に変更して、更新してみました。

    なぜか、以前の親カテゴリの記事へのリンクが表示されているのですが、設置の方法が誤っていますでしょうか。

    お伝えし切れていなかった点として、記事は、親カテゴリにもチェックが入っていて、子カテゴリにもチェックが入っています。
    かつ、場合によって、複数の子カテゴリにチェックが入っている状況です。

    親カテゴリのIDは、1で、、現在親カテゴリは、1つのみです。
    子カテゴリの数は、10以上あります。

    設置の方法が間違っていたかも知れず、もしお気づきの点がありましたら、ご一報頂けますと幸いです。
    どうぞよろしくお願い致します。

    キャンセル

  • 2017/12/07 16:26

    提示のコードを含めたコードに書き直しました。これで上書きしてみてください

    挙動としては
    1.現在の記事の親・子カテゴリのIDを取得
    2.その親カテゴリに存在する子カテゴリのIDを全て取得
    3.二つのIDを比較して重複していないものを除外する(つまり現在の子カテゴリIDだけ表示する)
    ですので正常に親カテゴリ1つと子カテゴリ1つ以上が設定されていれば問題ないはずです

    キャンセル

  • 2017/12/10 12:16

    ご連絡頂き誠にありがとうございます。

    各記事は、基本的に、親カテゴリ1つと子カテゴリ1つが設定されています。
     
    ーーー
    <div>
    <dl>
    <?php
    $categories = get_the_category();
    foreach ($categories as $category) {
    if ($category->category_parent === 0) {

    ーーー
    の記述をしてみたのですが、親カテゴリの記事、が、PREVとNEXTに表示され、子カテゴリの記事が表示されませんでした。

    ちなみに、Wordpress上の、記事投稿の際に、カテゴリは、設定しているため、親カテゴリ、子カテゴリの設定自体は問題ないと思います。

    私の知識不足の面もあり、申し訳ありません。
    もし、ヒントとなる点がありましたら、ご教授頂けますと幸いです。

    引き続きどうぞよろしくお願い致します。

    キャンセル

  • 2017/12/11 10:07

    確かに上手く動きませんね。先週テストしたときは動作してたのですが
    少し調整してみます。

    キャンセル

  • 2017/12/11 10:19

    いや、記事に親カテゴリしか設定されていない場合にエラーが出てただけで、親・子カテゴリが1つ以上設定されていれば上手く動きますね。回答のコードを微調整してます。

    メインループの中に記述していたりしませんか?出来ればsingle.php全体のソースコードが欲しいのですが…。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.34%

関連した質問

同じタグがついた質問を見る

  • PHP

    15174questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    4769questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。