問題:
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(); ?>
の後にそれが変わることを発見しました、そして非作業バージョンではそれが変化しないことを発見しました。
部分的な回避策を見つけました。 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にあります、私はそれをテストしました。