サポート » プラグイン » カスタムフィールドテンプレートを使って検索するとサイドバーのループ

  • カスタムフィールドテンプレートのプラグインを使用しています。
    テンプレート上で、カスタムフィールドテンプレートの検索用ショートコードを

    echo do_shortcode('[cgtsearch format=0]');

    のようにテンプレートファイルに直接記入し、
    search.phpで、

    //メインループ
    if (have_posts()) :
    	while (have_posts()) : the_post();
    		the_title();
    	endwhile;
    endif;
    wp reset query();

    サイドバーに、

    //サブループ
    $args = array(
    	'post_type' => 'test',//カスタム投稿タイプ
    	'posts_per_page' => '1',//表示件数
    	);
    $custom_post_loop = new WP_Query($args);
    if($custom_post_loop->have_posts()):
    	while($custom_post_loop->have_posts()):
    		$custom_post_loop->the_post();
    		the_content();
    	endwhile;
    endif;
    wp_reset_postdata();

    としています。

    この時、カスタムフィールドテンプレートの検索機能を使うと、
    サイドバーのサブループにも、カスタムフィールドテンプレートのフィルターが適用されて困っています。

    どこに問題があるのでしょうか。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • wp reset query() はミスタイプでしょうか?

    トピック投稿者 yukiforweb

    (@yukiforweb)

    > 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から実行してもいいかもしれません。
    今回、特定の関数だけ除去することが出来なかったのですが、もっとスマートなやり方があったらどなたか回答お願いします。

    トピック投稿者 yukiforweb

    (@yukiforweb)

    ありがとうございます。

    やはり上記の部分が問題だったんですね。

    remove_filter( 'posts_join', 'custom_field_template_posts_join' );

    のように(よくわからずに)、remove_filterを試してみたのですが、
    全く効果がなかったので、凹んでいました。。。

    明日、早速このコードを試させて頂きます!
    本当にありがとうございました

    トピック投稿者 yukiforweb

    (@yukiforweb)

    戴いたコードを、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 日本語版

    トピック投稿者 yukiforweb

    (@yukiforweb)

    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’でフィルター適用の有無を変更出来るようですので、動作しないということはどこかに不具合があるのだと思いますから、デフォルトテーマで正常に動作するか確認しておいた方がいいと思います。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「カスタムフィールドテンプレートを使って検索するとサイドバーのループ」には新たに返信することはできません。