web-dev-qa-db-ja.com

Woocommerce商品カテゴリウィジェット - 商品が在庫のないカテゴリを非表示にする

私は私のWordpressサイトでWooCommerceを使用していて、サイドバーにすべての製品カテゴリを示すウィジェットを持っています。空のカテゴリを隠すように設定されているので、うまくいきます。ただし、在庫切れの商品のみを含むカテゴリがまだ表示されています。変更したいのですが。

技術的な説明:WooCommerce商品はカスタム投稿タイプ(product)、商品カテゴリはカスタム分類法(product_cat)、在庫数は商品のカスタムフィールド(_stock)です。 WooCommerce商品カテゴリウィジェットは、それらをwp_list_categories()を使って表示します。私はフックすることができるいくつかのフィルタ呼び出しを探すためにコードを掘り下げようとしましたが、それを見つけることができませんでした。

コアコードやWooCommerceコードを変更せずにこれを実行する良い方法はありますか?たぶん私が見逃したフック/フィルターがカスタムフィールド値をチェックすることを可能にするでしょうか?

3
olex

カスタム関数でwoocommerce_product_categories_widget_argsおよびwoocommerce_get_availabilityフィルターを使用して、在庫切れ商品の商品カテゴリー・ウィジェットをフィルターに掛けます。

あなたがこれらのフィルタを使って思いつくことができるものを見て、あなたが動けなくなったらここにコードを投稿してください。

これが私のサイトからあなたが始めるのを助けるかもしれないいくつかのコードです。

add_filter( 'woocommerce_product_categories_widget_args', 'wpsites_exclude_product_cat_widget' );

function wpsites_exclude_product_cat_widget( $args ) {

$args['exclude'] = array('16','46');

return $args;
}

これがWooCommerceのすべての フックです

4
Brad Dalton

私はこれが可能であるかどうか私は今までカテゴリ内の投稿/商品のステータスをチェックする場所がwp_list_categories()にあるとは思わないので私はそうしません。たとえあったとしても、あなたは非常に非効率的になるであろうすべてのカテゴリーにおいて多くの製品を質問しなければならないでしょう。

たぶん WC_Product_Cat_Dropdown_Walkerを置き換えて、そこでチェックすることができます。

責任ある関数は、別のWalkerを受け入れるかのように見えます。

/**
 * Walk the Product Categories.
 *
 * @return mixed
 */
function wc_walk_category_dropdown_tree() {
    global $woocommerce;

    if ( ! class_exists( 'WC_Product_Cat_Dropdown_Walker' ) )
        include_once( WC()->plugin_path() . '/includes/walkers/class-product-cat-dropdown-walker.php' );

    $args = func_get_args();

    // the user's options are the third parameter
    if ( empty( $args[2]['walker']) || !is_a($args[2]['walker'], 'Walker' ) )
        $walker = new WC_Product_Cat_Dropdown_Walker;
    else
        $walker = $args[2]['walker'];

    return call_user_func_array(array( &$walker, 'walk' ), $args );
}

あなたがウィジェットを複製したのであれば、あなたは明らかに変更することができます

// Stuck with this until a fix for http://core.trac.wordpress.org/ticket/13258
            wc_product_dropdown_categories( array(
                'show_counts'        => $c,
                'hierarchical'       => $h,
                'show_uncategorized' => 0,
                'orderby'            => $o
            ) );

// Stuck with this until a fix for http://core.trac.wordpress.org/ticket/13258
            wc_product_dropdown_categories( array(
                'show_counts'        => $c,
                'hierarchical'       => $h,
                'show_uncategorized' => 0,
                'orderby'            => $o,
                                'walker'             => 'InStock_Categories'
            ) );

そして、あなたはInStock_Categories Walkerクラスを作成して含める責任があります。まったくテストされていませんが、いくつかのアイデアを公開しているだけです。

2
helgatheviking

WooCommerce =>設定に進み、 '在庫'タブを選択すると、 'カタログから在庫切れのアイテムを隠す'オプションが表示されます。このオプションを有効にすると、在庫切れ商品は表示されず、カテゴリに販売可能(在庫切れまたは価格なし)の商品が含まれていない場合も非表示になります。

アップデート

Ok私は 'widget'を読み、私の答えではそれを完全に無視しました。

WooCommerceの商品カテゴリウィジェットは、私の知る限り商品/カテゴリのフィルタリングをサポートしていません。だから私は知っているフックやフィルタはありません。

しかし、単一のファイルを簡単にコピーして、WooCommerceのアップグレードで上書きされないようにするスタンドアロンのウィジェットとして変更することもできます。

それが役立つことを願っています。

0
Steve