前記事の「検索対象にカスタムタクソノミーの文字列も含めたい」で作成した検索が、ページネーション用に使用しているプラグイン「wp_pagenavi」に対応していなかった。
原因を探ってみる。
query_posts()にページ送り用の情報が送られていないのが原因のようだ。
wp_pagenaviを利用している普通の検索だと、$query_stringにある
s=’検索キーワード’
paged=ページ番号
という情報が自動的に適用される。
検索をカスタマイズしてしまったので、「paged」の情報を追加してquery_posts()を行う必要がある。
修正したのは以下の部分。
//検索結果が0でなければ、query_postsでヒットした投稿のIDを指定して抽出する。 if (!empty($objResult)){ $id_array = ''; foreach ($objResult as $key => $value) { // echo $value->post_title . ':' . $value->name . '<br />'; $id_array[$i] = $value->ID; $i++; } $arg = array( 'post__in'=>$id_array, 'post_status'=>'publish', 'post_type'=>'対象のカスタム投稿タイプ' //対象のカスタム投稿タイプ ); //$query_stringを分解して、wp_pagenaviの情報を配列に追加 if(!empty($query_string)){ $query_string_array = explode('&',$query_string); foreach ($query_string_array as $q_key => $q_value) { $temp = explode('=',$q_value); $key_str = $temp[0]; if ($temp[0] == 'paged'){ $numb=(int)$temp[1]; if (is_int($numb)) $arg[$key_str] = $numb ; } } } query_posts( $arg ); }
$query_stringを分解して、pagedが含まれていれば配列に格納する。
その際に変なもんが入らないよう、整数型にキャストしてチェックし、数字以外が追加されないようにする。
これでページ送りも確認がとれた。
ただ、キーワードを複数にした場合、期待通りの動作をしないことがある。
これは自身の稚拙なSQLに原因があるのだと思う。
あれこれ試してみたが、どうもうまく行かないので、こんど詳しい方にアドバイスを仰ごう。
追記
query_posts()のパラメータ「paged」は、wp_pagenaviの利用に限らず存在してた。
query_posts()のパラメータ指定に、post_statusがpublishであることを付け加えた。
これが無いと非公開の投稿も表示されてしまう。