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

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

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

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

PHP

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

Q&A

解決済

1回答

1881閲覧

月別一覧ページの表示について

sekai11

総合スコア16

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/03/08 07:00

編集2019/03/08 07:11

月別一覧ページを作りたいと考えていますが、どのPHPにどのコードを書けばいいのか分かりません。
どなたか教えてください。

固定ページにarchive-seisaku.phpとして

php

1<?php 2/* 3Template Name:制作実績一覧表 4*/ 5?> 6<?php get_header(); ?> 7<div class="kotei"> 8 <div id="main"> 9 <div class="container"> 10 <div class="row"> 11 <?php 12 if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } 13elseif ( get_query_var('page') ) { $paged = get_query_var('page'); } 14else { $paged = 1; } 15global $post; 16$args = array( 17 'posts_per_page' => 3, 18 'post_type'=> 'seisaku', 19 'paged' => $paged, 20 21); 22 23$myposts = new WP_Query( $args ); 24if ( $myposts->have_posts() ): 25 while( $myposts->have_posts() ): 26 $myposts->the_post(); ?> 27 28 29 <div class="col-md-4"> 30 <dl class='news'> 31 <h3 class='news-title'> 32 <?php the_title(); ?> 33 </h3> 34 <dd class='news-date'> 35 <i class="fa fa-clock-o"></i> 36 <?php the_date('Y.m.d'); ?> 37 </dd> 38 <dd class='news-content'> 39 <i class="fa fa-folder-open"></i> 40 <?php 41if ($terms = get_the_terms($post->ID, 'seisaku-cat')) { 42 foreach ( $terms as $term ) { 43 echo '<span>' . esc_html($term->name) . '</span>'; 44 } 45} 46?> 47 </dd> 48 <?php the_excerpt(); ?> 49 <p class="more"><a href="<?php the_permalink(); ?>">続きを読む<i class="fa fa-chevron-right"></i></a></p> 50 <?php if(has_post_thumbnail()): ?> 51 <p><a href="<?php the_permalink(); ?>"> 52 <?php the_post_thumbnail('medium'); ?></a></p> 53 <?php endif; ?> 54 55 </dl> 56 </div> 57 58 59 60 61 <?php endwhile; ?> 62 63 </div> 64 </div> 65 <div class="container"> 66 67 68 <div class="pagenav"> 69 <span class="old "> 70 <?php next_posts_link( '<i class="fa fa-chevron-circle-left"></i>古い記事', $myposts->max_num_pages );?> 71 </span> 72 73 <span class="new "> 74 <?php previous_posts_link( '新しい記事<i class="fa fa-chevron-circle-right"></i>' );?> 75 </span> 76 </div> 77 78 </div> 79 <?php wp_reset_postdata(); 80 endif; ?> 81 82 </div> 83</div> 84 85<!--/#main --> 86<?php get_footer(); ?>

を入れています。

sidebar-seisaku.phpには、

php

1 <ul> 2 <h3>月別実績</h3> 3 <?php wp_get_archives('type=monthly&show_post_count=1&post_type=seisaku'); ?> 4 </ul>

こちらを入れています。カテゴリーリンクはtaxonomy.phpに記述し、抽出できたのですが、月別一覧のサイドバーリンクをクリックするとすべて表示されます。
どこにどの記述をすれば表示されるのかさっぱり分かりません。date.phpでしょうか、archive-seisaku.phpでしょうか。

php

1<?php 2$monthly_arc=array( 3'year'=>get_query_var('year'), 4'monthnum'=>get_query_var('monthnum') 5); 6if(empty($monthly_arc)){ 7$args=array( 8'paged' => $paged, 9'post_type'=>'news',←これをreportに書き換える 10'posts_per_page'=>5 11); 12}else{ 13$args=array( 14'paged' => $paged, 15'post_type'=>'news',←これをreportに書き換える 16'posts_per_page'=>5, 17'year'=>$monthly_arc['year'], 18'monthnum'=>$monthly_arc['monthnum'] 19); 20} 21?>

これをarchive-seisaku.phpに入力すれば表示されるということは分かったのですが、すでに固定ページようとして使用しているので、どこに記述すればいいのか分かりません。

だれか教えていただけますでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

wordpressが、どのバージョン
テーマファイルのバージョン
などがあると説明しやすいです。

>月別一覧のサイドバーリンクをクリックするとすべて表示されます。

sidebar-seisaku.php 引数に 「&limit=12」がいるのでは?

変更前

<?php wp_get_archives('type=monthly&show_post_count=1&post_type=seisaku'); ?>

変更後

<?php wp_get_archives('type=monthly&show_post_count=1&post_type=seisaku&limit=12'); ?>

これでarchive-seisaku.phpを使えば、1ヵ月毎の表示になるのだと思います。

不明点はまたお知らせください。
上手くいくといいですね。

似たようなことをしたい人もいたようです。参考まで。
https://teratail.com/questions/115923
https://teratail.com/questions/110081

今回の場合、 「カスタム投稿タイプのアーカイブページ 月別表示」 などで
調べればいいです。

(以降補足説明)

テーマフォルダ内にある single.php、date.php、archive.php、index.php ・・という
一連のファイルは、テンプレートファイルと呼びます。

ページの種類によって使用するテンプレートが決まっていてそれぞれに優先度があります。

カスタム投稿タイプのアーカイブページの場合、
http://xxx.com/?post_type=seisaku にアクセスすると一覧が表示されます。
読み込まれるテンプレートは、archive-seisaku(投稿タイプ).php→archive.php→index.phpの
優先度で表示されます。

月別アーカイブの表示の場合 
http://xxx.com/?m=201903 にアクセスすると一覧が表示されます。
※パーマリンクの設定などはサイトによってカスタマイズされていたりするので説明は割愛します。

アーカイブページの年月日は、date.php→archive.php→index.phpの優先度で表示されます。

この時、読み込まれるテンプレートは date.php が優先的に読み込まれます。
もし、 date.php がない場合 archive.php が読み込まれるという形です。

何でもいいので文字を入れてどのファイルが適用されているか表示結果で確認するといいです。

投稿2019/03/09 09:38

tukatter

総合スコア284

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

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

sekai11

2019/03/09 10:14 編集

大変丁寧な回答、本当にありがとうございます!! 補足説明に関しても分かりやすく説明していただきありがとうございます!! sidebar-seisaku.php 引数に 「&limit=12」を入力しましたが、反映されませんでした。 なお、サイドバーの年月欄をクリックすると、/xxx.com/archives/date/2019/03/?post_type=seisaku”が表示されます。 WordPressのバージョンは 5.1です。 テーマはオリジナルテンプレートを作成しています。 なお、date.phpに <?php $monthly_arc=array( 'year'=>get_query_var('year'), 'monthnum'=>get_query_var('monthnum') ); if(empty($monthly_arc)){ $args=array( 'paged' => $paged, 'post_type'=>'seisaku', 'posts_per_page'=>5 ); }else{ $args=array( 'paged' => $paged, 'post_type'=>'seisaku', 'posts_per_page'=>5, 'year'=>$monthly_arc['year'], 'monthnum'=>$monthly_arc['monthnum'] ); } ?> <?php if(have_posts()): ?> <?php while(have_posts()): the_post(); ?> <?php $terms = wp_get_object_terms($post->ID, 'seisaku-cat'); ?> <?php foreach($terms as $term): ?> <div class="dashArea archiveList"> <a href="<?php the_permalink(); ?>"> <!-- ▼サムネイル表示 --> <div class="reportImg"> <?php the_post_thumbnail('thumbnail'); ?> </div> <!-- ▼レポートタイトル等記載エリア --> <div class="reportText"> <span class="term <?php echo " $term->slug"; ?> infoGenre"> <?php echo "$term->name" ?></span> <span class="date"> <?php the_time('Y年m月d日'); ?></span> <p class="title"> <?php the_title(); ?> </p> <span class="fontGray pt10 spnone"> <?php the_excerpt(); ?></span> </div> <div class="fontGray pcnone cl mt05"> <?php the_excerpt(); ?> </div> </a> </div> <?php endforeach; ?> <?php endwhile; ?> <?php else: ?> <p>現在投稿記事はありません。</p> <?php endif; ?> を入力しましたが、サイドバー月別欄をクリックしてもアクセスされるのは、/xxx.com/archives/date/2019/03/?post_type=seisaku(date.phpがフォルダ内にないときと同じ)です。 date.phpが読み込まれていないということは、archive-seisaku(投稿タイプ).phpに <?php $monthly_arc=array( 'year'=>get_query_var('year'), 'monthnum'=>get_query_var('monthnum') ); if(empty($monthly_arc)){ $args=array( 'paged' => $paged, 'post_type'=>'seisaku', 'posts_per_page'=>5 ); }else{ $args=array( 'paged' => $paged, 'post_type'=>'seisaku', 'posts_per_page'=>5, 'year'=>$monthly_arc['year'], 'monthnum'=>$monthly_arc['monthnum'] ); } ?> を入力すればいいのでしょうか? どこに入力すれば反映されるのか分かりません。よろしくお願い致します。
tukatter

2019/03/10 02:54

サイドバーの記述は出来ています。 カスタム投稿タイプのアーカイブページなので archive-seisaku.php を使います。 date.phpは読み込まれないと思います。 archive-seisaku.phpに適当な文字を打ってそれが表示されるかを見るといいでしょう。 表示されなかったら archive.php に何か記述してみる。 このページを表示させたときに年月関係ないデータが全て表示されているのでしょうか。 /xxx.com/archives/date/2019/03/?post_type=seisaku archive-seisaku.php の $myposts をやめて 通常の取得をしてみて表示されるか見てみるといいかもしれません。 変更前 if ( $myposts->have_posts() ): while( $myposts->have_posts() ): $myposts->the_post(); ?> 変更後 if ( have_posts() ): while( have_posts() ): the_post(); ?> これでどのように表示されるか。 $argsの記述をコメントにしてどうか。 メインループのリクエストは行われているので表示できるのではないでしょうか。 var_dumpなどでどのような情報を取得しているか表示してみるのもいいです。 出来てないようでしたらそのあとに、 「date.phpが読み込まれていないということは、archive-seisaku(投稿タイプ).phpに ・・・」と書いていた $argsに引数を設定 してから $myposts = new WP_Query( $args ); if ( $myposts->have_posts() ): while( $myposts->have_posts() ): $myposts->the_post(); ?> の記述にしてどうか。 日付データが取得出来ているか、 pagedの値が気になるので echo $paged; するとか 0 1 2 と数字で記述してページ切替されるか試すのもいいでしょう。 今回と関係ないですが date.phpには WP_Queryとか$args の記述は必要ない でしょうね。
sekai11

2019/03/10 06:54 編集

コメントありがとうございます。 丁寧な説明本当にありがとうございます。 何とか表示できたのですが、別の問題が発生しました。 修正内容としては、私の場合、固定ページにarchive-seisaku.phpを使用していましたので、これを月別アーカイブに使用したいと考え、中身が同じpage-seisaku.phpを作成し、それを固定ページにしました。 月別アーカイブにarchive-seisaku.phpでは、 <div class="kotei"> <div id="main"> <?php if(is_month()): ?> <h1 class="archive-title my-5 pt-5 text-center"> <i class="fa fa-clock-o"></i> <?php echo get_the_date('Y年n月'); ?>に投稿した記事 </h1> <?php endif; ?> <div class="container"> <div class="row"> <?php if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { $paged = get_query_var('page'); } else { $paged = 1; } global $post; $monthly_arc=array( 'year'=>get_query_var('year'), 'monthnum'=>get_query_var('monthnum') ); if(empty($monthly_arc)){ $args=array( 'paged' => $paged, 'post_type'=>'seisaku', 'posts_per_page'=>2 ); }else{ $args=array( 'paged' => $paged, 'post_type'=>'seisaku', 'posts_per_page'=>2, 'year'=>$monthly_arc['year'], 'monthnum'=>$monthly_arc['monthnum'] );} ?> <?php $myposts = new WP_Query( $args ); if ( $myposts->have_posts() ): while( $myposts->have_posts() ): $myposts->the_post(); ?> <!-- ▼サムネイル表示 --> <div class="col-md-4"> <dl class='news my-5'> <h3 class='news-title'> <?php the_title(); ?> </h3> <dd class='news-date'> <i class="fa fa-clock-o"></i> <?php the_date('Y.m.d'); ?> </dd> <dd class='news-content'> <i class="fa fa-folder-open"></i> <?php if ($terms = get_the_terms($post->ID, 'seisaku-cat')) { foreach ( $terms as $term ) { echo '<span>' . esc_html($term->name) . '</span>'; } } ?> </dd> <?php the_excerpt(); ?> <p class="seisaku-more "><a href="<?php the_permalink(); ?>">続きを読む</a></p> <div class="seisaku-img"> <?php if(has_post_thumbnail()): ?> <p><a href="<?php the_permalink(); ?>"> <?php the_post_thumbnail('medium'); ?></a></p> </div> <?php endif; ?> </dl> </div> <?php endwhile; ?> </div> </div> <div class="container"> <div class="pagenav"> <span class="old "> <?php next_posts_link( '<i class="fa fa-chevron-circle-left"></i>古い記事', $myposts->max_num_pages );?> </span> <span class="new "> <?php previous_posts_link( '新しい記事<i class="fa fa-chevron-circle-right"></i>' );?> </span> </div> </div> <?php wp_reset_postdata(); endif; ?> </div> </div> を入力し、月別一覧の表示ができたのですが、次のページへ進む「古い記事」をクリックすると、ページがみつかりませんでしたと表示されます。 これは、どこが原因なのでしょうか。 差し替えなければ教えてください。 よろしくお願いいたします。
tukatter

2019/03/10 09:59

始めに掲載していたソースからどのように変更を試して このようにしたらダメだった、うまくいったという経緯も書いて 後で見返す人の参考になるような形にしてあげた方がいいと思います。 出来上がったことより、ここで理解できているかということの方が大事です。 >中身が同じpage-seisaku.phpを作成 これも共通化などが出来なかったのか、 他に方法がないかということも考えてあげないといけないです。そのようにしないといけない理由など。 $mypostsをやめた形だと何がダメだったのかなどどのように試して何を検証したのかが抜けていたら 別の問題が発生することになります。 >月別一覧の表示ができたのですが、次のページへ進む「古い記事」を >クリックすると、ページがみつかりませんでしたと表示されます。 どのようなリンクが生成されたのか、何ページ目を表示していてそのリンクなのか 仮に1ページ目で戻るリンクが押せる、表示されているというのに違和感があるかもしれません。 ページネーションを使ってあげるといいのではないでしょうか。 if ($myposts->max_num_pages > 1){ //ページネーション echo "<div id='pagenation'>"; echo paginate_links( array( 'base' => get_pagenum_link(1).'%_%', 'format' => 'page/%#%/', 'current' => max(1, $paged), 'total' => $myposts->max_num_pages, 'prev_next' => true, 'prev_text' => 'PREV', 'next_text' => 'NEXT', ) ); echo "</div>"; } wp_reset_postdata(); これはwp_reset_postdataより手前で書いてあげないといけない。 個人的にはこっちの方が分かりやすいです。 <?php if(function_exists('wp_pagenavi')) wp_pagenavi(array('query' => $myposts));?> wp_reset_postdata(); 設定>表示設定>1ページに表示する最大投稿数が 'posts_per_page'=>数値 と一致していないと404になるかも。 数値がバラバラだったので統一すべきだと感じました。 動作確認はしていません。 雰囲気こんな感じかなということで走り書きしました。
tukatter

2019/03/12 03:52

どう解決したのかを載せてあげてください。
sekai11

2019/03/12 03:54

tukatter様 返信が遅れて申し訳ありません。 解決できました。 解決策は、設定>表示設定>1ページに表示する最大投稿数が 'posts_per_page'=>数値が統一されていなかったからでした。 統一することによって、すべての問題を解決できました。 tukatter様の言うとおり、変更前と変更後を書いていきたいと思います。 まず、最初にこのテーマでは、ヘッダーメニューにおいて、固定ページとして、archive-seisaku.phpを使用していました。 その内容は、 <?php /* Template Name:制作実績一覧表 */ ?> <?php get_header(); ?> <div class="kotei"> <div id="main"> <div class="container"> <div class="row"> <?php if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { $paged = get_query_var('page'); } else { $paged = 1; } global $post; $args = array( 'posts_per_page' => 3, 'post_type'=> 'seisaku', 'paged' => $paged, ); $myposts = new WP_Query( $args ); if ( $myposts->have_posts() ): while( $myposts->have_posts() ): $myposts->the_post(); ?> ~ループ内容~ <?php endif; ?> </dl> </div> <?php endwhile; ?> </div> </div> <div class="container"> <div class="pagenav"> <span class="old "> <?php next_posts_link( '<i class="fa fa-chevron-circle-left"></i>古い記事', $myposts->max_num_pages );?> </span> <span class="new "> <?php previous_posts_link( '新しい記事<i class="fa fa-chevron-circle-right"></i>' );?> </span> </div> </div> <?php wp_reset_postdata(); endif; ?> </div> </div> <!--/#main --> <?php get_footer(); ?> でした。 なので、月別アーカイブページの読み込みが別方法での解決策が分かりませんでしたので、固定ページとして上記のarchive-seisaku.phpの内容をそのまま、page-seisaku.phpへ記述し新しく作成した、archive-seisaku.phpには、 <div class="kotei"> <div id="main"> <?php if(is_month()): ?> <h1 class="archive-title my-5 pt-5 text-center"> <i class="fa fa-clock-o"></i> <?php echo get_the_date('Y年n月'); ?>に投稿した記事 </h1> <?php endif; ?> <div class="container"> <div class="row"> <?php if ( get_query_var('paged') ) { $paged = get_query_var('paged'); } elseif ( get_query_var('page') ) { $paged = get_query_var('page'); } else { $paged = 1; } global $post; $monthly_arc=array( 'year'=>get_query_var('year'), 'monthnum'=>get_query_var('monthnum') ); if(empty($monthly_arc)){ $args=array( 'paged' => $paged, 'post_type'=>'seisaku', 'posts_per_page'=>2 ); }else{ $args=array( 'paged' => $paged, 'post_type'=>'seisaku', 'posts_per_page'=>2, 'year'=>$monthly_arc['year'], 'monthnum'=>$monthly_arc['monthnum'] );} ?> <?php $myposts = new WP_Query( $args ); if ( $myposts->have_posts() ): while( $myposts->have_posts() ): $myposts->the_post(); ?> ~ループ内容~ <?php endif; ?> </dl> </div> <?php endwhile; ?> </div> </div> <div class="container"> <div class="pagenav"> <span class="old "> <?php next_posts_link( '<i class="fa fa-chevron-circle-left"></i>古い記事', $myposts->max_num_pages );?> </span> <span class="new "> <?php previous_posts_link( '新しい記事<i class="fa fa-chevron-circle-right"></i>' );?> </span> </div> </div> <?php wp_reset_postdata(); endif; ?> </div> </div> とし、設定>表示設定>1ページに表示する最大投稿数が 'posts_per_page'=>数値を統一したら、月別一覧アーカイブも読み込み、次ページへのリンクもうまくいきました。 ありがとうございました。 >他に方法がないかということも考えてあげないといけないです。そのようにしないといけない理由など。 $mypostsをやめた形だと何がダメだったのかなどどのように試して何を検証したのかが抜けていたら 別の問題が発生することになります。 とありましたが、どこが原因で解決されたのか、分かっていません(笑)。 可能であれば、教えていただきたいです。よろしくお願いいたします。
tukatter

2019/03/12 06:37

$mypostsを使わないで情報を取得した場合は、 画面を表示するタイミングで取得された have_posts() などで ループした情報を使うことになります。 以下のように query_posts('posts_per_page=3'); をしない限り 設定>表示設定>1ページに表示する最大投稿数の件数を使うということなのかと思いました。 <?php query_posts('posts_per_page=3'); ?> <?php while (have_posts()) : the_post(); ?> // 投稿のループ <?php endwhile;?> この場合は、URLのパラメータとデフォルトの指定により取得。 件数を変えてみたり、数値の増減などでエラーなのかというところでの検証。 <?php while (have_posts()) : the_post(); ?>このようにして 画面を表示するタイミングで取得した情報をループするところを WP_Queryというのは新たに条件を指定して取得しなおすということですので 2回情報をとってきているのかとも感じますよね。 細かく条件を指定したいという意味でWP_Queryを使いたいなど  それをする理由があればそれはそれで理解できているということだと思います。 このような説明でわかりますでしょうか。 どんなときにどんな値が取得できるか というところを確認しておくと 他のことで行き詰ったときに対処しやすくなるということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問