web-dev-qa-db-ja.com

カスタムクエリフィルタがwoocommerceカテゴリページで機能しない

私は私のwoocommerceウェブサイト用のカスタムフィルタを作成しようとしています。ショップページではすべてうまく機能していますが、アーカイブページに移動してもフィルタが機能しません。 URLアドレスに各フィルタプロパティを記録しています。

ショップページのコードは機能していますが、アーカイブページ(カテゴリ)では機能していません。アーカイブページでSQLクエリを操作する方法を誰かが知っていますか?私の現在のコードは:

function modify_query($ query)if [!is_admin()&& $ query-> is_main_query()&& $ query-> query_vars ['post_type'] == 'product'){
 if (isset($ _ GET ["fillter"])){
 $ arr [] =配列(
 '分類法' => 'pc_filters'、
 'field' => ' term_id '、
' terms '=> $ _GET ["fillter"]、
); 
 $ query-> set(' tax_query '、array(
) 'relation' => 'AND'、
 array($ arr)
)
); 
 return $ query; 
} 
} 
} 
 add_action( 'pre_get_posts'、 'modify_query');

しかし、それはショップページでのみ機能しています。

2
Sky

一見しただけでは、なぜこれがあなたのホームページだけでアーカイブページではないのかわからないのですが、この関数の書き方にはいくつか問題があります。それで、私はあなたのためにそれを書き換えました - 代わりにこれを使うことで以前に難解なバグを導入していたらmay問題を解決してください。

注意すべきことがいくつかあります。

  • 内部クエリが1つしかない場合は、relationtax_queryと一緒に使用しないでください( reference
  • あなたのtax_queryは3つの配列深さでした - それは2つだけであるべきです
  • pre_get_postsはアクションなので、返される値は受け入れられません(この場合、$query参照渡し なので、返す必要はありません)。
  • "filter""fillter"のようにスペルミスされていました(これがコードを単独で分割することはなかったでしょうが、クエリ文字列で?filter=を使用した場合、テスト中にできます
  • また、term_idであることを考えて、 absint() を使用して、入力したクエリ文字列変数のサニタイズも追加しました。

そうは言っても、これが単純化された関数です。

function modify_query($query) {
  if( ! is_admin() && $query->is_main_query() && $query->query_vars['post_type'] == 'product') {
    if( isset( $_GET['filter'] ) ) {

      $query->set( 'tax_query', array (
        array(
          'taxonomy' => 'pc_filters',
          'field'    => 'term_id',
          'terms'    => absint( $_GET['filter'] ),
        )
      ));

    }
  }
}

add_action( 'pre_get_posts', 'modify_query' );

私はこれをテストしていませんが、それはあなたが意図していたことをやや簡単な方法でやるべきであり、それはあなたの問題を解決するかもしれません。

これで解決しない場合は、WooCommerceがアーカイブページで使用しているクエリ、特にquery_vars['post_type']の値が原因である可能性があります。 WooCommerceの細部はここでは話題になっていませんし、私は実際にはそれに精通していませんが、一般的なWordPressに関しては、上記の関数内でprint_r($query->query_vars);を使って作業内容を確認し、それに応じて修正できます。あるいは、post_typeチェックを完全に削除することもできますが、このコードは一般的な投稿やページにも適用されますが、実際には使用できない可能性があります。

1
Tim Malone