• 解決済 aquas

    (@aquas)


    お世話になっております。
    お力添えいただけると、幸いでございます。

    カスタム投稿にて、記事を書いております。
    archive-○○.php
    にて、一覧表示をしたいのですが、そこで行き詰ってしまいました。

    ページ送りには、プラグイン
    『wp pagenavi』を利用しております。

    検索をかけて調べてみると、ここでつまずいている方が非常に多いんですね…
    私も、そこから抜け出せずに困っております。

    設定→表示設定→最大投稿数を「1」には設定いたしました。
    ページ送りは表示されるのですが、
    「2」以降をクリックしても、
    『ページが見つかりません』となり「index.php」が表示されてしまいます。

    「query_posts」を使わない方法、というページも、拝見をし、
    いろいろ画策いたしましたが、前に進めない状態でございます。

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

    <?php
    	$args = array(
    		'post_type' => array( 'aaa', 'bbb', 'ccc', ),
    		'tax_query' => array(
    			'relation' => 'AND',
    		array(
    
    		~~中略~~
    
    			),
    		),
    		'posts_per_page' => 3,
    		'order' => 'DESC',
    	); ?>
        <?php $paged = get_query_var( 'paged' ); ?>
        <?php query_posts($args ); ?>
        <?php if(have_posts()): ?>
        <?php while(have_posts()):the_post(); ?>
    
    		~~ループ部分~~
    
        <?php endwhile; ?>
        <?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?>
        <?php wp_reset_query();endif; ?>
15件の返信を表示中 - 1 - 15件目 (全16件中)
  • モデレーター Takuro Hishikawa

    (@hissy)

    pre_get_postsフックを使うのが楽です。’dog’, ‘cat’, ‘panda’ の3つの投稿タイプがあったとします。archive-dog.phpを作成した場合、それはdog投稿タイプの一覧です。dog投稿タイプの投稿が1件しか無かったら、たとえ表示件数を1にしても2ページ目は存在しません。それを回避するには、投稿を取得する前に条件を改変する必要があります。query_postsでは、投稿を取得し終わったあとなので、カスタマイズのタイミングとしては遅すぎます。以下カスタマイズ例

    テーマのfunctions.phpなどに書く

    function customize_archive($query) {
        if ( is_admin() || ! $query->is_main_query() )
            return;
    
        if ( $query->is_post_type_archive('dog') ) {
        	$query->set( 'posts_per_page', 3 );
            $query->set( 'post_type', array( 'dog', 'cat', 'panda' ) );
            return;
        }
    }
    add_action('pre_get_posts','customize_archive');

    archive-dog.php に書く(特に何もしなくてOK)
    if(function_exists('wp_pagenavi')) wp_pagenavi();

    トピック投稿者 aquas

    (@aquas)

    hissy様
    ご回答ありがとうございます。

    hissy様のブログも、拝見しておりました。
    そんな方から、ご回答いただけるなんて、感激です。
    ありがとうございます!

    pre_get_posts、他、なぜ、2ページ目が表示されないかという点、勉強になりました。

    ‘dog’, ‘cat’, ‘panda’ と、投稿タイプがあり、
    実は、さらに別の’dragon’投稿タイプ(archive-dragon.php)で、一覧表示をしております。
    そうなった場合は、
    functions.php

    if ( $query->is_post_type_archive('dragon') ) {

    で、いいんですよね。
    archive-dragon.phpは、

    <?php if(have_posts()): ?>
        <?php while(have_posts()):the_post(); ?>
    
    		~~ループ部分~~
    
        <?php endwhile; ?>
        <?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?>
        <?php wp_reset_query();endif; ?>

    を残し、あとは消す、ということだと、理解いたしました…

    が、これでは、うまくいきません。
    ‘dragon’に仮に入れております、一件の投稿が、一覧として表示されるだけでございます。
    何かが、間違えておるのでしょうか…

    モデレーター Takuro Hishikawa

    (@hissy)

    pre_get_postsのトラブルシューティング

    1. Debug BarプラグインとDebug Bar Extenderプラグインをインストールしてください。
    2. それぞれ有効化して /dragon にアクセスし、ツールバーの「Debug」ボタンをクリックしてください。
    3. 表示されるウィンドウの左側の「WP Query」タブをクリックしてください。
    4. 「QUERY TEMPLATE:」が archive-dragon.php であることを確認してください。
    5. 「Query Arguments:」が post_type=dragon であることを確認してください。
    6. 「Query SQL:」に wp_posts.post_type IN (‘dog’, ‘cat’, ‘panda’) が含まれていることを確認してください。
    トピック投稿者 aquas

    (@aquas)

    お世話になります。

    1~3の工程は済ませました…が、
    4.の
    「QUERY TEMPLATE:」が表示されません。

    Query Arguments:
    Query SQL:
    Queried Object:

    は、表示されるのですが…

    モデレーター Takuro Hishikawa

    (@hissy)

    「QUERY TEMPLATE:」が表示されません。

    マジすか…他のテーマでもそうですか?これが表示されないのはおかしい。

    Query Arguments:
    Query SQL:
    Queried Object:

    こっちは上のコメで書いたとおりになります?

    トピック投稿者 aquas

    (@aquas)

    他テーマにしたり、
    必要プラグイン以外を停止にしてみたりしましたが…

    やはり、
    「QUERY TEMPLATE:」は、表示されません。

    Query Arguments:
    は、なんとか、そう表示はしてあります。


    「wp_posts.post_type IN 」
    欄がございません。

    トピック投稿者 aquas

    (@aquas)

    Query Arguments:

    order=asc&orderby=menu_order+title&post_type=dragon&posts_per_page=-1&posts_per_archive_page=-1

    Query SQL:

    SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = ‘dragon’ AND (wp_posts.post_status = ‘publish’ OR wp_posts.post_status = ‘future’ OR wp_posts.post_status = ‘draft’ OR wp_posts.post_status = ‘pending’ OR wp_posts.post_status = ‘private’) ORDER BY wp_posts.menu_order,wp_posts.post_title asc

    Queried Object:

    ~~以下省略~~

    モデレーター Takuro Hishikawa

    (@hissy)

    Query Argumentsに色々パラメーターがついてますね。普通に投稿タイプアーカイブ( example.com/?post_type=dragon )にアクセスするとこんなに出ないはずですので、投稿タイプのアーカイブ以外のものを見ておられて、それで is_post_type_archive() が効かないのだとおもいますが、どこのページを見ているのでしょうか…。

    トピック投稿者 aquas

    (@aquas)

    申し訳ございません!
    サイトを見るときの、ツールバーを表示させなくしておりまして…

    管理画面からのものを、提示しておりました!
    お恥ずかしいばかりです。

    サイト画面より「Debug」いたしました。

    すると…

    QUERY TEMPLATE:
    archive-dragon.php

    Query Arguments:
    post_type=dragon

    Query SQL:
    SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = ‘dragon’ AND (wp_posts.post_status = ‘publish’ OR wp_posts.post_status = ‘private’) ORDER BY wp_posts.post_date DESC LIMIT 0, 1

    となりました!
    wp_posts.post_type IN ~
    となっていませんね…

    モデレーター Takuro Hishikawa

    (@hissy)

    期待通りの動きになりました!テンプレートも正しく読み込まれていますし、post_type=dragonなのでis_post_type_archive(‘dragon’)で動くはずですので、functions.phpの記載を何かミスっているか、どこかにquery_postsが残っているかではないかと。

    トピック投稿者 aquas

    (@aquas)

    お付き合いくださいまして、本当にありがとうございます!

    現状をご報告いたします。

    function customize_archive($query) {
        if ( $query->is_post_type_archive('dragon') ) {
        	$query->set( 'posts_per_page', 3 );
            $query->set( 'post_type', array( 'dog', 'cat', 'panda' ) );
            return;
        }
    }
    add_action('pre_get_posts','customize_archive');

    functions.phpには、上記のように記載されております。
    archive-dragon.php を表示させようとしますと(?post_type=dragon)、
    なぜか、index.php が表示されてしまいます。

    functions.phpから、上記のコードを削除しますと、
    archive-dragon.php は、表示されますが…
    ループ部分は、もちろん、dog cat panda ではなく、
    dragon に仮投稿されています一件が表示されてしまいます。

    ということは、恐れ入りますが、上記コードのどこかしらが、おかしい、ということになりますよね。
    解決まで、あと一歩、というところを、実感して、大変うれしく思います!

    トピック投稿者 aquas

    (@aquas)

    あ…すみません!
    記載が漏れておりました!
    正しくは、以下です。

    function customize_archive($query) {
        if ( is_admin() || ! $query->is_main_query() )
            return;
    
        if ( $query->is_post_type_archive('dragon') ) {
        	$query->set( 'posts_per_page', 3 );
            $query->set( 'post_type', array( 'dog', 'cat', 'panda' ) );
            return;
        }
    }
    add_action('pre_get_posts','customize_archive');
    モデレーター Takuro Hishikawa

    (@hissy)

    合ってるようにしか見えません…困った

    トピック投稿者 aquas

    (@aquas)

    function customize_archive($query) {
        if ( is_admin() || ! $query->is_main_query() )
            return;
    
        if ( $query->is_post_type_archive('dragon') ) {
        	$query->set( 'posts_per_page', 3 );
            $query->set( 'post_type', array( 'dog', 'cat', 'panda' ) );
            return;
        }
    }
    add_action('pre_get_posts','customize_archive');

    のうちの、

    $query->set( 'post_type', array( 'dog', 'cat', 'panda' ) );

    の一行を、削除すれば、ページとしては、表示されるようになりました。
    とはいいつつ、もちろんdragonに、仮入力投稿のひとつが表示されるだけですけど…
    トップページの表示はなくなりました。

    トピック投稿者 aquas

    (@aquas)

    続報です。

    if ( $query->is_post_type_archive('dragon') ) {
        	$query->set( 'posts_per_page', 3 );
            $query->set( 'post_type', array( 'dog', 'cat', 'panda' ) );
            return;
        }

    の部分を

    if ( $query->is_post_type_archive('dragon') ) {
        	$query->set( 'posts_per_page', 3 );
            $query->set( 'post_type', 'dog' );
            return;
        }

    とすると…
    別に用意してあった
    『archive-dog.php』
    が、
    『archive-dragon.php』
    として、表示されます。

15件の返信を表示中 - 1 - 15件目 (全16件中)
  • トピック「カスタム投稿 ページ送り 2ページ目以降表示されない件」には新たに返信することはできません。