web-dev-qa-db-ja.com

クエリカテゴリのときにページナビゲーションが表示されない

問題
www.example.com?cat=4を実行するか、カスタムメニューまたはカテゴリウィジェットからカテゴリを選択すると、ナビゲーションのない最初のページのみが下部に表示されます。テンプレートとしてindex.phpまたはcategory-slug.phpを使用しても同じです。テストのために、私はwww.example.com?year=2012を行うときそれは動作します。また、www.example.com?cat=4&paged=2も機能します。それでそれはカテゴリーを持つ何かでなければなりません。

私の設定:Wordpress 3.5、Free WP tubeテーマ、SQLite

関連コード:index.php

<?php get_header(); ?>

    <!-- code to get theme options and setup $orderby -->                               
                            query_posts($query_string.$orderby.'&cat=4'); //in this case showing category with navigation works
                            if (have_posts()) : ?>
                            <?php $i=0; while (have_posts()) : the_post(); $i++; ?>

                <!-- code for displaying posts -->          

                            <?php if($i%3==0) : ?><div class="clear"></div><?php endif; ?>

                            <?php endwhile; wp_reset_query(); ?>
                            <?php 
                            $next_page = get_next_posts_link('Previous'); 
                            $prev_pages = get_previous_posts_link('Next');
                            if(!empty($next_page) || !empty($prev_pages)) :
                            ?>
                            <!-- navigation -->
                            <div class="navigation">
                                <?php if(!function_exists('wp_pagenavi')) : ?>
                                <div class="alignleft"><?php echo $next_page; ?></div>
                                <div class="alignright"><?php echo $prev_pages; ?></div>
                                <?php else : wp_pagenavi(); endif; ?>
                            </div>
                            <!-- /navigation -->
                            <?php endif; ?>

注:私はクエリで&cat=4を使用しているのがわかります。ホームページに動画のみを表示したいので、category_name=videoと同じです。しかしまた、私はカスタムメニューからそのカテゴリを選択できるようにしたいのですが、その場合ページナビゲーションは表示されません。

私が試したことのあるもの:

$wp_query = nullを作成してから、ループの前に新しいクエリを作成します。 http://wordpress.org/support/topic/next-page-navigation-doesnt-work 。基本的にこれの変形

<?php
$myqueryname = $wp_query;
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->query('showposts=5'.'&paged='.$paged);
?>

動作しません。

WP-pagenaviおよびフォーラムの作成者が提案したように$ pagedを追加します。

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
                                  <?php query_posts("cat=-11&paged='.$paged);; ?>

動作しません。

テスト:質問の "問題"の部分にある単純なものに加えて、問題の発生箇所を確認するためにすべての方法でprint_r($wp_query)を実行しました。私はheader.phpの最初の行としてprint_r($wp_query)を置きます。だから、問題はテーマのカスタムクエリにはない、私は正しいですか?私は働いている$ wp_queryのためにそれをしましたそして働いていない$ wp_queryそれからそれらを比較しました。これはコードの関連する比較部分です:Working $ wp_query:

[category_name] =>
[cat] => 4
...
**//most important part**
[found_posts] => 382    
[max_num_pages] => 43
...
[request] => SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')  ORDER BY wp_posts.post_date DESC LIMIT 0, 9
...
//here shows code for some posts even if not displaying them, because they're not in the cat=4 or category_name=video 

機能していない$ wp_query:

[category_name] => video
[cat] => 4
...
**//most important part**
[found_posts] => 1
[max_num_pages] => 1
...
[tax_query] => WP_Tax_Query Object
        (
            [queries] => Array
                (
                    [0] => Array
                        (
                            [taxonomy] => category
                            [terms] => Array
                                (
                                    [0] => video
                                )

                            [include_children] => 1
                            [field] => slug
                            [operator] => IN
                        )

                )

            [relation] => AND
        )
...
[query] => Array
        (
            [category_name] => video
        )

    [request] => SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( wp_term_relationships.term_taxonomy_id IN (4) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 9
...
//this $wp_query doesn't show code for the posts which are not from video category
...
[queried_object] => objArray Object
        (
            [term_id] => 4
            [name] => Video
            [slug] => video
            [term_group] => 0
            [term_taxonomy_id] => 4
            [taxonomy] => category
            [description] => 
            [parent] => 0
            [count] => 379
            [cat_ID] => 4
            [category_count] => 379
            [category_description] => 
            [cat_name] => Video
            [category_nicename] => video
            [category_parent] => 0
        )

編集#1:これはカスタムクエリの前の比較です。私がループの中で$ wp_queryをダンプしたとき、カスタムquery_posts()の後、それらは同一です。だから問題は$ wp_queryにはありません。また、index.phpコードから、カテゴリフォームメニューまたは?category_name=videoを選択すると、get_next_posts_link('Previous')はNULLを返します。

結論:デフォルトのクエリでテンプレートファイルの前に何かが起こっていますが、私は何を知りません。誰かが私にページナビゲーションを見せるのを手伝ってくれる?

#2を編集する:get_next_posts_link('Previous')はNULLを返すので、ナビゲーションを表示するには$wp_query->max_num_pages;に関する数字である必要があります。だから私はそれが1から> 1に変わる時を見るためにコード<pre><?php echo $wp_query->max_num_pages; ?></pre>を入れてテストしました。私は、作業バージョンでは<?php endwhile; wp_reset_query(); ?>の後にそれが変わることを発見しました、そして非作業バージョンではそれが変化しないことを発見しました。

2
cikatomo

部分的な回避策を見つけました。 index.phpの中のqueryオブジェクトは正しいものなので、この場合はcategory-video.phpのように、シリアライズを使って選択したテンプレートに転送しました。

Index.phpで私は上に置く

<?php $s = serialize($wp_query);
file_put_contents('query',$s); ?>

そしてcategory-video.phpに入れました

<?php $u = file_get_contents('query');
$wp_the_query = unserialize($u); ?>

これは解決策ではありませんが、回避策であり、ページナビゲーションが表示され部分的に機能しています。ナビゲーションの番号は現在のページを正しく表示しませんが、前後のページ番号をクリックするだけでなく機能しています。それはWp-PageNaviプラグインです。

編集:ページ番号も修正しました。 wp_reset_query()$wp_query->get('paged')が間違った番号を返した後の何らかの理由で、なぜ私に尋ねないでください、私は知りません。だから私は前から$ pagedを取り、wp_reset_queryの後に新しいクエリvarを設定しました。

query_posts($query_string.$orderby);                        
$my_page = $wp_query->get('paged') 

/*code for looping the posts*/

wp_reset_query();
set_query_var('paged',$my_page);

これで、WPページナビは正しいページ番号を表示します。

編集:問題はPDOプラグインとSqliteにあります、私はそれをテストしました。

0
cikatomo