自作の一覧関数を作成した場合に、WP_Pagenaviプラグインを利用したページネーションが表示されない、表示しようとしても画面の上の方に表示されるという事象に遭遇しました。プラグインのソースコードの一部を修正する事で対応できます。ちょっとしたコードの修正で、逆にページネーションをページ中どこでも設置できます。
目次
ページネーションが表示されてない!(汗)
お盆休みで、自分のサイト「演劇感想文リンク」のページを何気なく見ていたら、大変な事を発見。劇団ページ、公演時期ページにページネーションが表示されていない。
最新の10公演以前の公演履歴を見ることができなくなっていることに気づきました。数ヶ月前に、プラグイン カテゴリーリストからカスタムフィールドで対象記事を絞り込む自作の一覧関数に置き換えたのが原因のようです。(気づくの遅!)
あわてて、解消に乗り出すことにしまいした
ページネーションとは?
WORDPRESSに限りませんが、記事の一覧等たくさんのアイテムがページ上に並べる際に、数がある程度を超えた場合に別ページにページを分割し、(通常は)記事の下に分割されたページへのリンクを記述する方法です。以下のような感じになります。
演劇感想文リンクは、大量のページの集合体で、多くのページは、他のページ(公演の感想文リンクページ)の一覧を様々な切り口で表示しているという構造なので、自ずと一覧系のページが多くなっています。そして、結果として自作の一覧関数を利用している例が多くなっています
非表示の原因は、returnの設置位置
一覧関数を作成する際、当初は位置欄の表示をechoで内容を表示していたのですが、ページ内の思った位置に表示されませんでした。(必ず先頭に表示される)
そこで、$ret_htmlという変数で記載内容を追記していって関数の最後でreturnをするという表示にしていたのですが、この設置位置に問題がありました。
以下はコードの一部です。
$the_query = new WP_Query( $args );
// The Loop
$count = $the_query->found_posts;
if ( $the_query->have_posts() ) {
echo '該当' . $msg .'は全部で' . $count .$count_word . 'です<br/>';
$ret_html='<ul class="lcp_catlist" id="lcp_instance_0">';
while ( $the_query->have_posts() ) {
$the_query->the_post();
//echo '<li>' . get_the_title() . '</li>';
$summarys=get_post_custom_values('summary');
$company=get_post_custom_values('company');
if($catid=='3'){
$ret_html.='<li>'.$company[0].'「<a href="'. get_permalink() . '">' . get_the_title() . '</a>」';
}else{
$ret_html.='<li><a href="'. get_permalink() . '">' . get_the_title() . '</a>';
}
$ret_html.='<div class="lcp_customfield">'. $summarys[0] . '</div></li>';
//echo $ret_html;
}
$ret_html.= '</ul>';
} else {
// no posts found
$ret_html= '該当' . $msg . 'はありません';
}
return $ret_html;
wp_pagenavi(array('query' => $the_query));
/* Restore original Post Data */
wp_reset_postdata();
}
$ret_htmlに<ul>〜</ul>の一覧を書き込み、それを「return $ret_html;」で、返しています。こうすることで、ショートコードを書いた位置で表示されるようになりました。
が、よく見るとわかりますが、ページネーションを表示する「wp_pagenave(array(‘query’ => $the_query));」の文の前で、returnをしていますので、return以降の文が処理されず、当然ながらページネーションが表示されないことになってしまいます。
returnの場所を変えると、ページネーションがページの上に表示される
では、ということで、returnを関数の最後に記載してみました。すると、ページネーションが画面の頭に表示されてしまいます。
これは、wp_pagenaviの中で、echoしているのが原因と思われます。
WP_PAGENAVIのプラグインを編集することで解消
最悪一からページネーションを作るかという悲壮感をもちつつ、プラグインのソースコードを眺めていたら、なんとechoするか否かのフラグがあることが判明しました。core.phpの中の以下のコード部分です。
$args = wp_parse_args( $args, array(
'before' => '',
'after' => '',
'wrapper_tag' => 'div',
'wrapper_class' => 'wp-pagenavi',
'options' => array(),
'query' => $GLOBALS['wp_query'],
'type' => 'posts',
'echo' => true
) );
この部分の$echo=trueの部分をfalseに変えれば、echoをしなくなりそうです。
早速以下のように書き換えました。
$args = wp_parse_args( $args, array(
'before' => '',
'after' => '',
'wrapper_tag' => 'div',
'wrapper_class' => 'wp-pagenavi',
'options' => array(),
'query' => $GLOBALS['wp_query'],
'type' => 'posts',
'echo' => false
) );
更に、元の自作関数内も、$ret_htmlにwp_pagenaviの返値も加えるように以下のように書き換えました。
$ret_html.=wp_pagenavi(array('query' => $the_query)); /* Restore original Post Data */ wp_reset_postdata(); return $ret_html;
上記のコードは、下に配置したくて上記のようにコーディングしましたが、この方法であればページ中のどこにでも、設置できます。
WORDPRESSの関数の自作、まだまだなれていないので色々なことがありますね。