2017-01-11 6 views
1

私はこのコードを使用していたが、それは私のサイトの属性フィルタのリンクを破る:Woocommerce

あなたが使用することができ
add_action('pre_get_posts', 'custom_pre_get_posts_query'); 

function custom_pre_get_posts_query($q) { 

    if (! $q->is_main_query()) return; 
    if (! $q->is_post_type_archive()) return; 

    if (! is_admin() && is_shop()) { 

     $q->set('tax_query', array(array(
      'taxonomy' => 'product_cat', 
      'field' => 'slug', 
      'terms' => array('samples'), 
      'operator' => 'NOT IN' 
     ))); 

    } 

    remove_action('pre_get_posts', 'custom_pre_get_posts_query'); 

} 
+0

私はショップのページ*がメインのクエリであり、間違いなくポストタイプのアーカイブだと思うので、ショップのアーカイブでの作業を妨げます。 – helgatheviking

+1

@CarlosDaniel ... 'if(!$ q-> is_main_query())return;'と 'if(!$ q-> is_post_type_archive())を取り除く必要があることを意味します; – LoicTheAztec

答えて

1

woocommerce_product_queryフックは、pre_get_postsとかなり類似していますが、それには既に適切な条件ロジックがあります。 woocommerce_product_query_tax_queryフィルタもありますが、それがWooCommerce 2.6に存在するのか、それとも2.7ベータ版であればわかりません。

add_action('woocommerce_product_query', 'custom_pre_get_posts_query'); 

function custom_pre_get_posts_query($q) { 

    $q->set('tax_query', array(array(
     'taxonomy' => 'product_cat', 
     'field' => 'slug', 
     'terms' => array('samples'), 
     'operator' => 'NOT IN' 
    ))); 

} 

EDITフィルタリングは、分類クエリを介して行われ、上記の例では、我々は完全に税のクエリをオーバーライドしています。私はこれが今働いていることをテストすることはできません(そして、配列の配列は扱いにくいかもしれません)ので、理論は、WooCommerceによって生成された既存のタクソノミークエリと新しい制約をマージする必要があるということです。

add_action('woocommerce_product_query', 'custom_pre_get_posts_query'); 

function custom_pre_get_posts_query($q) { 

    $tax_query = (array) $q->get('tax_query'); 

    $tax_query[] = array(
      'taxonomy' => 'product_cat', 
      'field' => 'slug', 
      'terms' => array('samples'), 
      'operator' => 'NOT IN' 
    ); 


    $q->set('tax_query', $tax_query); 

} 
+0

カテゴリをホームページから除外しますが、それは私が達成しようとしているフィルタリングを許可しません。 –

+0

編集をご覧ください。フィルタウィジェットを "OR"関係で設定している場合、ウィジェット間のOR関係は不可能であり、サンプルを除外してAND関係を持つことができます。おそらく不可能ではありませんが、分類クエリを書くのではなく、カスタム 'posts_where' SQL文を書く必要があります。 – helgatheviking

+0

ありがとう、コードは完璧に動作します、私はエラーに遭遇した場合にお知らせします。また、フィルターウィジェットを「OR」関係から「AND」関係に変更して、エラーを防止しました。あなたは命の恩人です。 –