wp reset query() はミスタイプでしょうか?
> popupさま
wp reset query() はミスタイプでしょうか?
wp_reset_query();のタイプミスです。申し訳ございません。
カスタムフィールドテンプレートでSQL関係のフィルタに追加された関数が原因でした。
if ( isset($_REQUEST['cftsearch_submit']) ) :
if ( !empty($_REQUEST['limit']) )
add_action( 'post_limits', array(&$this, 'custom_field_template_post_limits'));
add_filter( 'posts_join', array(&$this, 'custom_field_template_posts_join') );
add_filter( 'posts_where', array(&$this, 'custom_field_template_posts_where'), 100 );
add_filter( 'posts_orderby', array(&$this, 'custom_field_template_posts_orderby' ) );
endif;
検索条件によっては一部のフィルタのみ除去すれば動作すると思いますが、一応すべて除去するようにします。(検索結果表示のループ後に記述)
search.php
endwhile; // End while(have_posts)
if ( isset($_REQUEST['cftsearch_submit']) ) :
if ( !empty($_REQUEST['limit']) )
remove_all_filters( 'post_limits' );
remove_all_filters( 'posts_join' ) ;
remove_all_filters( 'posts_where' ) ;
remove_all_filters( 'posts_orderby' ) ;
endif; ?>
上記を関数にしてfunctions.phpに記述し、search.phpから実行してもいいかもしれません。
今回、特定の関数だけ除去することが出来なかったのですが、もっとスマートなやり方があったらどなたか回答お願いします。
ありがとうございます。
やはり上記の部分が問題だったんですね。
remove_filter( 'posts_join', 'custom_field_template_posts_join' );
のように(よくわからずに)、remove_filterを試してみたのですが、
全く効果がなかったので、凹んでいました。。。
明日、早速このコードを試させて頂きます!
本当にありがとうございました
戴いたコードを、endwhile;
の後でなく、endif;
の後に追加しました。
(一件も該当データがなかったときに、remove_all_filtersがスルーされないように)
search.php
if(have_posts()):while(have_posts()):the_post();
the_title();
endwhile; //endwhile;の後ろではなく
endif; //endif;の後ろに入れました。
//以下、いただいたコード
if ( isset($_REQUEST['cftsearch_submit']) ) :
if ( !empty($_REQUEST['limit']) )
echo remove_all_filters( 'post_limits' );
echo remove_all_filters( 'posts_join' ) ;
echo remove_all_filters( 'posts_where' ) ;
echo remove_all_filters( 'posts_orderby' ) ;
endif;
//以上、いただいたコード
wp_reset_query();
とりあえず、これで、search.phpのメインループ「以降」のサブループに、余計なフィルターがかかることがなくなりましたが、search.phpのメインループ「以前」に読み込まれているサブループには、相変わらず余計なフィルターがかかっていました。
ので、
functions.php
function removeCftSearchFilters(){
//戴いたコードのコピペ
if ( isset($_REQUEST['cftsearch_submit']) ) :
if ( !empty($_REQUEST['limit']) )
remove_all_filters( 'post_limits' );
remove_all_filters( 'posts_join' ) ;
remove_all_filters( 'posts_where' ) ;
remove_all_filters( 'posts_orderby' ) ;
endif;
}
を作成し、
search.php
if(have_posts()):while(have_posts()):the_post();
the_title();
endwhile; //endwhile;の後ろではなく
endif; //endif;の後ろに入れました。
removeCftSearchFilters(); //<=関数の挿入
wp_reset_query();
search.phpより前のサブループ
$args = array(
'post_type' => 'test',//カスタム投稿タイプ
'posts_per_page' => '1',//表示件数
);
removeCftSearchFilters(); //<=関数の挿入
$custom_post_loop = new WP_Query($args);
//以下略
とやることで対処いたしました。
※全くスマートでないので、よりスマートな方法を教えていただきたいです^^;
戴いたコードを、endwhile;の後でなく、endif;の後に追加しました。
(一件も該当データがなかったときに、remove_all_filtersがスルーされないように)
そうでしたね。気がつきませんでした。
未確認ですが、$argsで’suppress_filters’をtrueにするとフィルタが抑制されて、サブループにはcftのフィルタは適用されないかもしれません。
$args = array(
'post_type' => 'test',//カスタム投稿タイプ
'posts_per_page' => '1',//表示件数
'suppress_filters' => true
);
メインループ以降のサブループも上記の方法でいいかもしれません。(^^;
get_posts()でしたら、デフォルトでフィルタが抑制されます。
テンプレートタグ/get_posts – Codex 日本語版
search.phpより前のサブループ
$args = array(
'post_type' => 'test',//カスタム投稿タイプ
'posts_per_page' => '1',//表示件数
'suppress_filters' => true, // suppress_filtersを使用
);
// removeCftSearchFilters(); remove_all_filters()を適用するのやめる
$custom_post_loop = new WP_Query($args);
//以下略
で試してみましたが、cftのフィルタは適用されてしまいました^^;
試してみましたが、こちらでは大丈夫ですね。
パラメータ’suppress_filters’を指定して対処するのが一番シンプルでいいと思いますが。
search.phpのメインループより前のサブループですよね?
どこにどのように記述していますか?
デフォルトテーマで試すとどうなるでしょう?
functions.phpに次を記述するだけで、cftsearchの検索結果ページでメインループを除いてフィルターが除去されます。
search.php、sidebar.phpには何も記述する必要がありません。
function remove_posts_filter($wp_query) {
if(!$wp_query->is_main_query() && isset($_REQUEST['cftsearch_submit']) ) :
if ( !empty($_REQUEST['limit']) )
remove_all_filters( 'post_limits' );
remove_all_filters( 'posts_join' ) ;
remove_all_filters( 'posts_where' ) ;
remove_all_filters( 'posts_orderby' ) ;
endif;
}
add_action( 'pre_get_posts', 'remove_posts_filter' );
サブループでposts_whereフィルタを利用していなければ上記で大丈夫ですが、そうでない場合は、各サブループの方で’suppress_filters’によりフィルターを適用しないようにした方がいいと思います。
WP_Query()でも、本来’suppress_filters’でフィルター適用の有無を変更出来るようですので、動作しないということはどこかに不具合があるのだと思いますから、デフォルトテーマで正常に動作するか確認しておいた方がいいと思います。