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

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

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

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

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

Q&A

解決済

1回答

1413閲覧

親カテゴリ毎に子カテゴリの記事一覧を表示して、ページ送りできるようにしたい

omioss

総合スコア5

WordPress

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

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

0グッド

1クリップ

投稿2019/11/24 04:13

前提・実現したいこと

WordPressで親カテゴリ毎に子カテゴリの記事(抜粋)一覧を表示して、
ページ送りできるようにしたいと思っています。

category-tokyo.php

■category一覧

tokyo(親カテゴリID:2)
∟ shibuya(子)
-- shopA(記事)
-- shopB(記事)

∟ ginza(子)
-- shopC(記事)
-- shopD(記事)

http://www.02320.net/children-category-archive/
こちらのページを参考に親カテゴリ毎に子カテゴリの記事一覧を表示することはできたのですが、
ページ送りがうまく動きません。
ページ送りは「WP Page Navi」puginを使用しています。

発生している問題・エラーメッセージ

---- shibuya ---- ●shopA ●shopB ---- ginza ---- ●shopC ●shopD < 1 2 3 >(page送り) 1ページ目も、2ページ目も、3ページ目も同じものが表示されてしまいます。

該当のソースコード

<?php $categories = get_terms( 'category', array( 'orderby' => 'id', 'hide_empty' => 0, 'child_of' => 2,   /*親カテゴリのID*/ ) ); foreach ( $categories as $value ): ?> <h3><a href="<?php echo get_category_link($value->term_id); ?>"><?php echo $value->name;?></a></h3> <?php $cat_id = $value->term_id; $post_id = 'category_' . $cat_id; ?> <ul> <?php $postslist = get_posts( "category=$value->term_id & numberposts=5" ); foreach ( $postslist as $post ) { ?> <li><a href=<?php echo get_permalink(); ?>><?php echo $post->post_title; ?></a> <?php if( get_field('shop_info3') ) { ?> <p> <?php the_field('shop_info3'); ?> </p> <?php } ?> </li> <?php } ?> </ul> <?php endforeach; ?> <?php wp_reset_postdata(); ?> <?php wp_pagenavi(); ?>

試したこと

WP Page Naviが正常に動かない時の対策として
”paged=$paged”を指定するといいとあったので、
入れようと思ったのですが、どの位置にどう入れたら良いのかわかりませんでした。
試しに、全体を

<?php if (have_posts()) : while (have_posts()) : the_post(); ?> XXXXX <?php endwhile; ?> <?php endif; ?>

で囲んでみましたが、更に繰り返されるだけでした。

基本的なところがわかっていないのですが、
なんとかご教授願えませんでしょうか。
よろしくお願いいたします。

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

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

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

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

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

tabuu

2019/11/24 23:54

>ページ送りがうまく動きません。 上手く動かないとはどのような感じでしょうか?ナビゲーションが正常に表示されない、ページインデックスに沿った記事が表示されない、そもそもナビゲーションが表示されない、など。
omioss

2019/11/25 03:43

ナビゲーションは表示されています。 << 1 2 3 >> ↑イメージはこんな感じで、pagenationが表示されているのですが、 1ページ目も、2ページ目も、3ページ目も同じ一覧が表示されている状態です。 伝わりましたでしょうか。
tabuu

2019/11/25 23:22

以下試してみていただけないでしょうか。 ・numberposts=5となっていますが、Wordpressの1ページに表示する記事数と同値にする ・get_postsではなくquery_postsを使う(非推奨だけど確認のため) ・wp_reset_postdataを削除する ちなみに1,2,3の各リンクのURLはすべて同じURLでしょうか?例で1,2,3と書かれていると思いますがページ数は正しいでしょうか?
omioss

2019/11/26 23:53

返信ありがとうございます。 ・Wordpressの1ページに表示する記事数と同値にしてみました。→変わらず ・query_posts にしてみました。→変わらず ・wp_reset_postdataを削除してみました。 →変わらず urlは以下のようになっています。 1ページ目のurl  → http://XXXXXX.com/tokyo/ 2ページ目のurl  → http://XXXXXX.com/tokyo/page/2 やりたいことは 例えば、1ページに表示する投稿数が10件として shibuyaの記事が5件、ginzaの記事が10件、uenoの記事が10件の場合 以下のように子カテゴリ名と記事を表示して、ページ送りしたいです。 1ページ目================== tokyo(親) ・shibuya(子カテゴリ名) -- shibuya-shop1(記事タイトル) -- shibuya-shop2(記事タイトル) -- shibuya-shop3(記事タイトル) -- shibuya-shop4(記事タイトル) ・ginza(子カテゴリ名) -- ginza-shop1(記事タイトル) -- ginza-shop2(記事タイトル) -- ginza-shop3(記事タイトル) -- ginza-shop4(記事タイトル) 2ページ目================== -- ginza-shop5(記事タイトル) -- ginza-shop6(記事タイトル) -- ginza-shop7(記事タイトル) -- ginza-shop8(記事タイトル) ・ueno(子カテゴリ名) -- ueno-shop1(記事タイトル) -- ueno-shop2(記事タイトル) -- ueno-shop3(記事タイトル) -- ueno-shop4(記事タイトル)
guest

回答1

0

ベストアンサー

やりたいことを見て理解できました。以下の方法を試してみてください。
(机上で書いていますのでエラー等ありましたら調整してください。)

まず、リストを子カテゴリで並ぶようにソートします。ソートする条件は自身のデータに合わせてください。既に子カテゴリでソートされるようになっていればこちらは不要です。

PHP

1functions.php 2 3function pre_get_posts1($query) { 4 if (...) { 5 $query->set('orderby', '...'); 6 } 7} 8add_action('pre_get_posts', 'pre_get_posts1');

次に、テンプレートは通常のループになるように戻してください。そしてループの1回目、または、1つ前に表示した記事とカテゴリが異なる場合はカテゴリを表示するようにしてください。下の例ではカテゴリ名だけ表示しています。

PHP

1category-tokyo.php 2 3$p = null; 4if (have_posts()) : while (have_posts()) : the_post(); 5 $category = get_the_category(); 6 if (!$p || $p != $category[0]->cat_ID) { 7 echo $category[0]->cat_name; 8 } 9 $p = $category[0]->cat_ID; 10 .... 11

投稿2019/11/27 02:22

tabuu

総合スコア2449

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

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

omioss

2019/11/28 06:44 編集

ありがとうございます! 教えていただいた内容で希望通りの表示ができました。 ページ送りも機能しています。 本当にありがとうございます! 最終的には以下のようになりました。 <?php $p = null; if ( have_posts() ): while ( have_posts() ): the_post(); $category = get_the_category(); if ( !$p || $p != $category[ 0 ]->cat_ID ) { echo '<div><a href="' . get_category_link( $category[ 0 ]->term_id ) . '">' . $category[ 0 ]->name . '</a></div>'; echo '<ul>'; } $p = $category[ 0 ]->cat_ID; $title = get_the_title(); echo '<li>' . $title . '</li>'; endwhile; echo '</ul>'; endif; ?> <?php wp_pagenavi(); ?>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問