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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

解決済

2回答

932閲覧

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

kenn

総合スコア15

WordPress

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

PHP

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

0グッド

0クリップ

投稿2017/12/06 15:38

編集2017/12/07 05:42

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2017/12/06 15:42

『同一サブカテゴリ』のアーカイブページへのリンクということでしょうか。
kenn

2017/12/06 23:51

お世話になります。アーカイブページへのリンクではなく、例えば、このページでしたら、フッター付近の「前の記事」「次の記事」の部分を、サブカテゴリ内の記事のみにする、という目的です。どうぞよろしくお願い致します。
m.ts10806

2017/12/07 03:57

タグにWordpressを追加されたほうが良いと思います。
kenn

2017/12/07 05:33

ご指摘頂き誠にありがとうございます!
kei344

2017/12/07 05:38

サブカテゴリとはもしかしてカスタムタクソノミーのことでしょうか?それとも記事に複数設定したカテゴリのことでしょうか。
退会済みユーザー

退会済みユーザー

2017/12/07 05:40 編集

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

2017/12/07 05:40

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

2017/12/07 05:44

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

回答2

0

ベストアンサー

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

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

PHP

1<div> 2 <dl> 3 <?php 4 $categories = get_the_category(); 5 foreach ($categories as $category) { 6 if ($category->category_parent === 0) { 7 $parent_term_id = $category->term_id; 8 } else { 9 $child_term_id[] = $category->term_id; 10 } 11 } 12 if (is_array($child_term_id)) { 13 $term_children = get_term_children($parent_term_id, 'category'); 14 $term_children = array_diff($term_children, $child_term_id); 15 $term_children = implode(',', $term_children); 16 } 17 $prev_post = get_previous_post(true, $term_children); 18 $next_post = get_next_post(true, $term_children); 19 if ( !empty( $prev_post ) ): ?> 20 <dt>PREV</dt> 21 <dd> 22<a href="<?php echo esc_url( get_permalink( $prev_post->ID ) ); ?>"><?php echo $prev_post->post_title; ?></a> 23 </dd> 24 <?php endif; ?> 25 <?php 26 $next_post = get_next_post(true, $term_children); 27 if ( !empty( $next_post ) ): ?> 28 <dt>NEXT</dt> 29 <dd> 30<a href="<?php echo esc_url( get_permalink( $next_post->ID ) ); ?>"><?php echo $next_post->post_title; ?></a> 31 </dd> 32 <?php endif; ?> 33 </dl> 34</div>

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

投稿2017/12/07 06:42

編集2017/12/11 01:20
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenn

2017/12/07 07: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 07:26

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

2017/12/10 03: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 01:07

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

退会済みユーザー

2017/12/11 01:19

いや、記事に親カテゴリしか設定されていない場合にエラーが出てただけで、親・子カテゴリが1つ以上設定されていれば上手く動きますね。回答のコードを微調整してます。 メインループの中に記述していたりしませんか?出来ればsingle.php全体のソースコードが欲しいのですが…。
kenn

2017/12/24 12:09

ありがとうございます! ご連絡が遅れ申し訳ありません。 動作を確認できましたので、ベストアンサーとさせて頂きました。 誠にありがとうございます!
guest

0

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

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

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

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

php

1function change_posts_per_page($query) { 2 /* 管理画面,メインクエリに干渉しないために必須 */ 3 if( is_admin() || ! $query->is_main_query() ){ 4 return; 5 } 6 7 /* カテゴリーページの表示件数を5件にし、カテゴリID2を除外する */ 8 if ( $query->is_category() ) { 9 $query->set( 'posts_per_page', '5' ); 10 $query->set( 'cat','-2' ); 11 return; 12 } 13 14} 15add_action( 'pre_get_posts', 'change_posts_per_page' );

投稿2017/12/07 00:40

編集2017/12/07 01:21
raidomaru

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenn

2017/12/07 00:58

ご連絡頂き誠にありがとうございます。 $in_same_term、$taxonomyのアドバイス、ありがとうございます。 もし可能でしたら、 サイト全体の、投稿ページのテンプレートのphpとなっているため、サイト内で、複数のサブカテゴリを設定しています。 そのため、各サブカテゴリ番号を指定する方法以外の、「サイト内の投稿」全ページに、適用できるような記述の方法がありますと、大変ありがたいです。 ご検討頂けますと幸いです。
kenn

2017/12/07 05:35

ありがとうございます。 カテゴリIDを、指定せずに、同一のサブカテゴリ内の記事を、ページ送りで、数珠つなぎにしたいのですが、一括で、記述できる方法を模索しております。 もしご存じでしたらよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問