Maison  >  Questions et réponses  >  le corps du texte

Afficher uniquement les catégories Woocommerce avec des produits avec une méta-valeur spécifique

Je développe la partie b2b de ma boutique Woocommerce. J'ai réussi à filtrer woocommerce_product_query_meta_query pour afficher uniquement les produits pour lesquels la section b2b est activée pour les utilisateurs b2b.

Cependant, je ne trouve pas de moyen de masquer une catégorie de produits qui affiche 0 résultat dans le widget des catégories Woocommerce (car il n'y a aucun produit dans cette catégorie avec la partie b2b activée).

J'ai envisagé de réécrire le code du widget Woocommerce par défaut et d'exécuter une requête wp pour chaque catégorie (et sous-catégorie) qui renvoie le nombre de produits dans cette catégorie avec le b2b activé. Mais pour un grand nombre de produits et de catégories, cela semble très inefficace.

Existe-t-il un moyen de masquer les catégories « vides » (aucun produit compatible b2b dans la catégorie) dans le widget de catégories Woocommerce ?

Merci pour tout conseil.

Modifier

Pour clarifier ma question : c'est la fonction que j'utilise pour filtrer les requêtes de produits afin d'afficher uniquement les produits avec _eda_display_in_b2b元设置为yes : 

function show_only_b2b_products( $meta_query, $query ) {
    if ( is_admin() || ! is_user_logged_in() || ! is_b2b_user() ) {
        return $meta_query;
    }

    $meta_query[] = array(
        'key'     => '_eda_display_in_b2b',
        'value'   => 'yes',
        'compare' => '='
    );

    return $meta_query;
}

add_filter( 'woocommerce_product_query_meta_query', 'show_only_b2b_products', 10, 2 );

Exemple : https://klon.vozikyprozivot.cz/kategorie-produktu/pridavne-pohony/

Cette catégorie n'est pas vide pour les clients réguliers et les utilisateurs non connectés. Mais pour les clients b2b, il n’y a aucun produit à afficher. Je dois donc masquer ce widget de catégorie pour les clients b2b.

P粉037215587P粉037215587306 Il y a quelques jours378

répondre à tous(2)je répondrai

  • P粉466909449

    P粉4669094492024-01-11 14:57:57

    Si vous faites référence au widget des catégories de produits, il existe un paramètre permettant de masquer les catégories vides :

    Si vous faites référence à autre chose, veuillez fournir une URL vers un exemple de page et l'état du système de votre site. Vous pouvez le trouver via WooCommerce > Statut. Sélectionnez Obtenir le rapport système, puis Copier pour obtenir de l'aide. Une fois terminé, veuillez le coller dans votre réponse.

    J'espère que cela vous aidera.

    ======Modifier======

    Je pense que pour le problème ci-dessus, vous pouvez utiliser le crochet de catégorie wc et supprimer la catégorie. Veuillez vérifier le code ci-dessous :

    //* 当小部件以下拉列表显示时使用
        add_filter( 'woocommerce_product_categories_widget_dropdown_args', 'rv_exclude_wc_widget_categories' );
        //* 当小部件以列表显示时使用
        add_filter( 'woocommerce_product_categories_widget_args', 'rv_exclude_wc_widget_categories' );
        function rv_exclude_wc_widget_categories( $cat_args ) {
        //添加逻辑来检查类别是否有产品,并创建ID数组,并用该数组替换下面的数组。
            $cat_args['exclude'] = array('55','68'); // 插入您希望排除的产品类别ID
            return $cat_args;
        }

    Dans le code ci-dessus, je pense que vous pouvez faire la logique et vérifier si la catégorie contient des produits et créer un tableau d'identifiants pour les catégories non-produits.

    De cette façon, vous pouvez exclure la catégorie des listes et des listes déroulantes.

    J'espère que cela vous aidera.

    répondre
    0
  • P粉766520991

    P粉7665209912024-01-11 10:00:56

    Avec beaucoup d'aide de Harshit Vaid, j'ai réussi à résoudre ce problème :

    add_filter( 'woocommerce_product_categories_widget_dropdown_args', 'eda_exclude_wc_widget_categories' );
    add_filter( 'woocommerce_product_categories_widget_args', 'eda_exclude_wc_widget_categories' );
    
    function eda_exclude_wc_widget_categories( $cat_args ) {
    
        $args = array(
            'taxonomy'   => 'product_cat',
            'hide_empty' => 0
        );
    
        $all_categories        = get_categories( $args );
        $category_exclude_list = array();
    
        foreach ( $all_categories as $cat ) {
            if ( $cat->category_parent == 0 ) {
                $category_id = $cat->term_id;
    
                $product_args = array(
                    'posts_per_page' => - 1,
                    'post_type'      => 'product',
                    'tax_query'      => array(
                        array(
                            'taxonomy' => 'product_cat',
                            'terms'    => $category_id,
                            'field'    => 'term_id',
                            'operator' => 'IN'
                        )
                    ),
                    'meta_query'     => array(
                        array(
                            'key'   => '_eda_display_in_b2b',
                            'value' => 'yes'
                        )
                    )
                );
    
                $query = new WP_Query( $product_args );
                $count = $query->post_count;
    
                if ( $count == 0 ) {
                    array_push( $category_exclude_list, $category_id );
                }
            }
        }
    
        $cat_args['exclude'] = $category_exclude_list;
    
        return $cat_args;
    }

    répondre
    0
  • Annulerrépondre