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

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

ただいまの
回答率

89.98%

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

解決済

回答 1

投稿 編集

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

sekai11

score 10

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

固定ページに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();   ?>


                <div class="col-md-4">
                    <dl class='news'>
                        <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="more"><a href="<?php the_permalink(); ?>">続きを読む<i class="fa fa-chevron-right"></i></a></p>
                        <?php if(has_post_thumbnail()): ?>
                        <p><a href="<?php the_permalink(); ?>">
                                <?php the_post_thumbnail('medium'); ?></a></p>
                        <?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(); ?>


を入れています。

sidebar-seisaku.phpには、

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

こちらを入れています。カテゴリーリンクはtaxonomy.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'=>'news',←これをreportに書き換える
'posts_per_page'=>5
);
}else{
$args=array(
'paged' => $paged,
'post_type'=>'news',←これをreportに書き換える
'posts_per_page'=>5,
'year'=>$monthly_arc['year'],
'monthnum'=>$monthly_arc['monthnum']
);
}
?>


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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

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/12 12:52

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

    キャンセル

  • 2019/03/12 12: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をやめた形だと何がダメだったのかなどどのように試して何を検証したのかが抜けていたら
    別の問題が発生することになります。

    とありましたが、どこが原因で解決されたのか、分かっていません(笑)。
    可能であれば、教えていただきたいです。よろしくお願いいたします。

    キャンセル

  • 2019/03/12 15: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を使いたいなど 
    それをする理由があればそれはそれで理解できているということだと思います。

    このような説明でわかりますでしょうか。
    どんなときにどんな値が取得できるか というところを確認しておくと
    他のことで行き詰ったときに対処しやすくなるということです。

    キャンセル

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

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる