気ままに

プログラム関連で困ったことを調べて気ままに投稿

【WordPress】WP-PageNavi 固定ページでページングを表示する

[WordPress]WP-PageNaviプラグインを使った固定ページでページング処理

WP-PageNaviを使ったページング処理は、下記のソースコードにより表示可能ですが、固定ページでうまく表示できない場合があります。

<?php
if(function_exists('wp_pagenavi')) { wp_pagenavi(); }
wp_reset_query();
?>


ページングのリンクが表示できない原因については、下記の理由が考えられます。w

  • ループ処理に問題がある
  • $pagedが取得できていない
  • ページ名が重複している

ループ処理に問題がある

固定ページでカテゴリやタクソノミーごとの一覧を表示している場合、ループ処理を行うことなります。ループ処理の方法として、WP_Queryを使ったWP_QUERYを使用してWP-PAGENAVIでページナビを表示やquery_postsを使った困ったことにWP-PageNaviがまったく機能していない状況です・・・などの方法があります。

今回、ハマったのは3つ目の対応ですが、ループ処理においてよくある間違いとして色々なところで書かれていたので、参考までに。


WP_Query() を使った場合は、wp_reset_postdata();
query_posts() を使った場合は、wp_reset_query();
関数を使って、ループ処理内のpostデータとして割り当てられた値をリセットします。
WP-PageNaviプラグインを使った処理を記述より先に上記の関数を書いてしまうと、
ページングのHTMLが生成されません。これはループ処理のデータを参照してページングのHTMLが作らているためです。そのため、ループ処理のデータをリセットする関数を書く前にWP-PageNaviの処理を書かなければなりません。
サンプル

WP-PageNaviを書くページの.phpファイル
<?php
// ループ条件を設定
$args = array(
	'post_type' => 'result', /* 投稿タイプを指定 */
	'paged' => $paged,
	'posts_per_page' => 10, // 表示件数
	'order' => 'date',
	'order' => 'DESC',
);
?>
<?php query_posts( $args ); ?>
<?php if (have_posts()) : ?>
	<?php while (have_posts()) : the_post();  ?>
		/* ループ開始 */
		<?php the_time("Y年m月d日"); ?><br />
		<a href="<?php the_permalink(); ?>"><?php
		the_title(); ?></a>
	<?php endwhile; ?>
	
<?php else : ?>
		<h1>記事がありません</h1>
		<p>表示する記事はありませんでした。</p>
<?php endif; ?>
<?php
// ページングを表示
if (function_exists('wp_pagenavi')) { wp_pagenavi(); }
// ループ処理のデータをリセット 
wp_reset_query();
?>


WP_Query() においても、同様に注意が必要です。


$pagedが取得できていない

固定ページでは、$pagedが取得できない場合があるようです。その場合には、下記のコードを検索条件の前に書いて、再定義しておくと回避できるようすが、私の環境では再現していないため、メモとして残します。

$paged = (int) get_query_var('paged');
$paged = get_query_var('paged');

query_posts()の検索条件で最大表示件数を指定する場合にも注意が必要です。showposts()ではなくposts_per_page()を使う必要があります。

ページ名が重複している

今対応しているサイトでハマったのは、この部分!!
固定ページ名とタクソノミーのrewrite(slug)に書かれている定義名が同じだったのが原因で、indexとしか表示されませんでした。
タクソノミーの定義名を「s」をつけて回避しました。

functions.php
function my_item_init() {
 
    register_post_type('item', array(
	'hierarchical' => true,
            'labels' => array(
            'name' => '商品',
            'all_items' => '商品一覧',
            'search_items' => '商品を検索',
            'not_found' =>  '商品が見つかりません',
            'not_found_in_trash' => 'ゴミ箱内に商品が見つかりませんでした。',
            'parent_item_colon' => ''
        ),
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'has_archive' => true,  /*archiveテンプレートでアーカイブ表示*/
       'rewrite' => array('slug' => <span style="color: #ff2600">'items',</span> 'with_front' => false), /*
        'capability_type' => 'post',
        'hierarchical' => true,
        'menu_position' => 5,
        'supports' => array('title','editor','thumbnail','custom-fields','page-attributes' )
    ));


固定ページで「item」という名前をつけていたので、タクソノミーのrewrite slugをitemsと重複しないように変更しました。indexとしか表示されないため、原因が何かわかるまでに時間がかかりました。WordPressの癖がやっとわかるよになってきて、なんとかなるよになってきました。

これから、困ったことをどんどん書いていこうと思います。

[更新]
2016.9/17 ymさんにコメント頂いたphpの閉じタグがなかったので修正しました。
2014.4.1 誤字やレイアウトが崩れていたので、修正しました。

基礎からのWordPress (BASIC LESSON For Web Engineers)

基礎からのWordPress (BASIC LESSON For Web Engineers)

WordPress レッスンブック 3.x対応

WordPress レッスンブック 3.x対応

本格ビジネスサイトを作りながら学ぶ WordPressの教科書

本格ビジネスサイトを作りながら学ぶ WordPressの教科書