HUSKY - WooCommerce Product Filter Professional

WooCommerceフィルターで現在のカテゴリーの属性だけを表示する

複数の商品カテゴリーが1つの属性を共有していると、WooCommerceのフィルターには、そのページでは意味をなさない値が表示されることがよくあります。冷蔵庫のカテゴリーにグリル (Grill)、ヘッドフォンのカテゴリーに512 GB、そのカテゴリーでは扱っていないブランド、といった具合です。クリックしても結果は空になります。HUSKYでは、WooCommerceのフィルターに現在のカテゴリーの属性だけを表示するために、ページ上の各タームに属する商品を数え、件数がゼロのタームを非表示にします。以下では、その仕組み、具体的な設定、件数を表示させない方法、そしてカテゴリーがまったく分からないケースを説明します。

フィルターは現在のカテゴリーに属するものをどう判断するか

商品カテゴリーページや、その他の商品タクソノミーのアーカイブ(タグ、属性アーカイブ、ブランド)では、HUSKYがそのページに表示されているタームを記憶します。動的再カウント (Dynamic recount)を有効にすると、フィルターの各タームの横の数字は、「このカテゴリーの商品のうち、訪問者がすでに選択した条件にすべて一致し、さらにこのタームを持つもの」として計算されます。カテゴリー内のどの商品にも存在しない値は0になります。

続いて空の用語を非表示 (Hide empty terms)が、0のタームをすべてフォームから取り除きます。セクション内のすべてのタームが取り除かれると、タイトルを含むセクション全体も消えるため、そのカテゴリーで使われていない属性はサイドバーから消えます。カテゴリーセクション自体は、表示中のカテゴリーのサブカテゴリーだけに絞り込まれます。この点と例外については、フィルターにサブカテゴリーしか表示されない理由で説明しています。

カテゴリーごとの設定は必要ありません。サイドバーやカテゴリーテンプレートに置いた同じフォームが、どのカテゴリーページにも自動的に適応します。

空のタームを非表示にする3つの設定

プラグイン設定のオプション (Options)タブを開き、次のように設定します。

  1. 件数を表示 (Show count):はい (Yes)
  2. 動的再カウント (Dynamic recount):はい (Yes)
  3. 空の用語を非表示 (Hide empty terms):はい (Yes)

保存したら、古い件数を保持している可能性のあるキャッシュをすべてクリアします。使用している場合は詳細設定 → オプション (Advanced → Options)のフィルター内の各アイテムの動的再カウント数をキャッシュする (Cache dynamic recount number for each item in filter)とキャッシュ用語 (Cache terms)、そしてサイトのページキャッシュです。

この3つのオプションは互いに依存しており、設定ページもそれを強制します。空のタームは、数えることでしか見つけられないためです。空の用語を非表示 (Hide empty terms)をオンにすると、ほかの2つも自動的にオンになり、件数を表示 (Show count)をオフにすると、ほかの2つも自動的にオフになります。数字を消すために件数を表示 (Show count)を「いいえ」にすると、空のタームがすべてのページに戻ってきます。組み合わせは次のとおりです。

件数を表示 / 動的再カウント / 空の用語を非表示訪問者に見えるもの
いいえ / いいえ / いいえすべてのターム、数字なし
はい / いいえ / いいえストア全体の数字。商品が1つもないタームはグレーアウト
はい / はい / いいえ現在のカテゴリーと選択内容に応じた数字。0のタームは表示されたままグレーアウトされ、選択できない
はい / はい / はい0のタームは非表示。空のセクションは消える

3行目は、利用できない値を削除せず、無効な状態で表示したい場合の選択肢です。ほかにも、グローバルオプションを上書きできる場所がいくつかあります。

  • 無料版では、空の用語を非表示 (Hide empty terms)と、後述の用語の件数テキストを非表示 (Hide terms count text)はグレーアウトされています。これらはプレミアム版の機能です。
  • HUSKYのフィルターウィジェットには、独自の動的再カウント (Dynamic recount)フィールド(デフォルト (Default)、いいえ (No)、はい (Yes))があります。いいえ (No)に設定すると、そのウィジェットはグローバル設定を無視します。[woof] ショートコードにも、dynamic_recount=1 または dynamic_recount=0 という同じスイッチがあります。
  • ターボモードが有効な場合、オプション (Options)タブには、ターボモード用にこの3つの設定の別コピーが表示されます。ターボモードを有効にしたあとで、もう一度設定してください。
  • レンジスライダーとして表示されているタクソノミーは、グローバルオプションでは再カウントされません。追加オプション(構造 (Structure)タブでタクソノミーの横にある歯車アイコン)を開き、動的再カウントを有効にする (Enable dynamic recount)を「はい」に設定してください。商品のない値は、スライダーの目盛りから除外されます。

同じ画面にあるその他の設定は、オプションタブのドキュメントで説明しています。

件数を表示せずに空のタームを非表示にする

最も多い要望は、(12) のような数字を出力せずに、空のタームを非表示にしたいというものです。3つのオプションはすべてオンのままにして、詳細設定 → オプション (Advanced → Options)を開き、用語の件数テキストを非表示 (Hide terms count text)を「はい」に設定します。プラグインは、何が空かを知るために必要な件数の計算は引き続き行いますが、それを出力しません。1つのフォームだけでこれを行うには、そのショートコードに hide_terms_count=1 を追加します(例:[woof hide_terms_count=1])。

CSSでカウンターを非表示にする方法も、チェックボックスとラジオボタン(.woof_checkbox_count、.woof_radio_count)では機能しますが、ドロップダウンでは使えません。ドロップダウンでは数字がオプションのテキストの一部で、独立した要素がないためです。この設定は、すべてのフィルタータイプに有効です。

一部のセクションだけでカウンターを変更するには、woof_term_count_format フックを使用します。このフックは、デフォルトで (%d) であるフォーマットと、タクソノミーのスラッグを受け取ります。

/*
 * HUSKY: counter format per filter section.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woof_term_count_format', function ($format, $tax_slug) {
    // no numbers at all in the Tags and Brand sections
    if (in_array($tax_slug, array('product_tag', 'pa_brand'), true)) {
        return '';
    }
    // "12" instead of "(12)" everywhere else
    return '%d';
}, 10, 2);

これらのセクションでも空のタームは非表示のままです。非表示は、出力されるテキストではなく、計算された件数に基づいて行われるためです。カテゴリーツリーの最下層でのみ数字を表示するには、子を持つタームのカウンターをCSSで非表示にします(テーマのカスタムCSSフィールドに記述)。

.woof_childs_list_li > .woof_checkbox_label > .woof_checkbox_count {
    display: none;
}

選択済みのタームには、数字は表示されません。これは仕様です。再カウントは、すでに検索条件に含まれているタームをスキップします。

最初の選択のあとにほかの値が消える理由

動的再カウントは、選択のたびにフォームを絞り込みます。ブランド:Bosch (Brand: Bosch)を選択すると、このカテゴリーのBosch製品に存在する色だけが残ります。これがこの機能の目的です。1つのセクションだけでこれをオフにすることはできません。

別のケースとして、1つの色を選ぶとほかのすべての色が消えてしまう場合があります。これはセクションのロジックによるものです。タクソノミーの追加オプション(構造 (Structure)タブの歯車アイコン)を開き、フィルタリングのロジック (Logic of filtering)を確認してください。

  • OR(デフォルト):選択した値のうち少なくとも1つを持つ商品。ほかの各色は(ほかのセクションでの選択の範囲内で)個別に数えられるため、カテゴリーに存在する色は残ります。
  • AND:選択したすべての値を同時に持つ商品。ほかの各色の件数は「赤と青を同時に持つ商品」となり、通常は0です。そのため空の用語を非表示 (Hide empty terms)が有効だと、それらは消えます。
  • NOT IN:選択した値を持つ商品を除外します。

色やサイズなど、訪問者が「これかあれか」を求めるほとんどの属性には、ORが適切なロジックです。「Wi-FiとBluetooth」のように、すべてが揃っている必要がある特徴には、ANDを使用してください。

商品が読み込まれる前にオプションを絞り込みたい場合(依存するドロップダウンで構成された検索ツールなど)は、[woof ajax_redraw=1 autosubmit=1] を使用します。変更のたびに、再カウントされたオプションでフォームだけが再描画され、フィルターボタンで商品が読み込まれます。ajax_redraw はAJAXモード向けではないため、そのフォームではショップのAJAX化を試みる (Try to ajaxify the shop)をオフのままにしてください。

ショップページ、カスタムページ、ページビルダー

自動的な絞り込みには、タクソノミーアーカイブが必要です。それ以外の場所には、現在のカテゴリーがありません。

  • メインのショップページはカタログ全体を表示するため、訪問者が何かを選択するまでは、ストア内にまったく商品がない値だけが非表示になります。これは正しい動作です。
  • WordPressの固定ページ(ホームページ、ランディングページ、1つのカテゴリーを一覧表示するElementorやDiviで作成したページ)は、そのカテゴリーの商品だけを表示していても、カテゴリーアーカイブではありません。フィルターはそれを認識できず、すべてを一覧表示します。

このようなページでは、ページがどのカテゴリーに関するものかを、2つのショートコードの両方に指定します。商品 → カテゴリー (Products → Categories)のタームIDを使用します。

[woof taxonomies=product_cat:15]
[woof_products taxonomies=product_cat:15 per_page=12]

[woof] の taxonomies 属性は、件数の計算と非表示がそのカテゴリーに従うようにし、[woof_products] の同じ属性は、表示される商品を限定します。同じタクソノミーの複数のIDはカンマで区切り(product_cat:15,16、どちらかに属する商品)、複数のタクソノミーはプラス記号で区切ります(product_cat:15+pa_color:22)。これは、前述の3つのオプションがオンの場合にのみ機能します。このようなページの設定の詳細は、カスタムページやトップページの商品フィルターにあります。

値ではなく、カテゴリーごとに異なるセクションの組み合わせが必要な場合は、カテゴリーごとに異なるフィルターを表示する方法を参照してください。

実際のカテゴリーアーカイブでも、フィルターがショップページと同じように動作する場合は、テーマのアーカイブテンプレートが現在のカテゴリーをプラグインから隠している可能性があります。これは主にブロックベースのテンプレートで起こります。詳細設定 → オプション (Advanced → Options)で、カテゴリーページの追加チェック (Additional check of the category page)を「はい」に設定してください。

動的再カウントを使わない軽量な方法

ストア全体のどこにも商品がないターム(古いサイズ、販売を終了したブランドなど)を非表示にするだけなら、動的再カウントは必要ありません。次のスニペットは、HUSKYがタームを読み込む際に、そのようなタームをスキップするようWordPressに指示します。

/*
 * HUSKY: do not list terms that have no published products at all.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woof_get_terms_args', function ($args) {
    $args['hide_empty'] = true;
    return $args;
});

ページの読み込み時にコストはかかりませんが、現在のカテゴリーや訪問者の選択内容は考慮されません。靴にしか存在しないサイズが、シャツのカテゴリーでも表示されます。キャッシュ用語 (Cache terms)がオンの場合は、コードを追加したあとにターム用キャッシュをクリアしてください。FAQ空のタームを非表示にする方法にも、同じスニペットが掲載されています。

大規模カタログで動的再カウントにかかるコスト

フォーム内のすべてのタームは、ページが表示されるたびに、非表示のものも含めて、それぞれ専用のカウントクエリを必要とします。したがって、300個のタームを持つフォームでは、約300回のカウントクエリが実行されます。商品が数千点ならほとんど気になりませんが、数万点になると、すべてのカテゴリーページが遅くなる可能性があります。この機能をオフにする前に、次の対策を試してください。

  • 詳細設定 → オプション (Advanced → Options)で、フィルター内の各アイテムの動的再カウント数をキャッシュする (Cache dynamic recount number for each item in filter)を有効にする。
  • ヘッダーの検索フォームなど、絞り込みが不要なフォームでは、dynamic_recount=0 を使用する。
  • データベースクエリの代わりに、準備済みのデータファイルからフィルタリングと件数の計算を行うターボモードを検討する。

詳細は大規模カタログで商品フィルターを高速化する方法をご覧ください。

無関係なオプションが表示される場合のチェックリスト

  • 件数を表示 (Show count)、動的再カウント (Dynamic recount)、空の用語を非表示 (Hide empty terms)がすべて「はい」になっている(ターボモードが有効な場合は、そのターボモード用のコピー)。
  • 数字は、件数を表示 (Show count)を「いいえ」にするのではなく、用語の件数テキストを非表示 (Hide terms count text)で非表示にしている。
  • ウィジェットの動的再カウント (Dynamic recount)フィールドがデフォルト (Default)またははい (Yes)で、ショートコードに dynamic_recount=0 がない。
  • 実際のカテゴリーアーカイブでテストしているか、カスタムページのショートコードに taxonomies= を指定している。
  • 変更後に、再カウントキャッシュ、ターム用キャッシュ、ページキャッシュをクリアした。
  • 選択後にほかの値を残したい場合、その属性のフィルタリングのロジック (Logic of filtering)がORになっている。

これらをすべて確認しても、カテゴリーに商品のない値が表示される場合は、カテゴリーページへのリンクと、非表示にしたい値を添えて、HUSKYサポートフォーラムでトピックを立ててください。