2017-09-21 7 views
0

J'ai une catégorie avec des produits non visibles par tous. J'ai déjà un script en place, qui supprime cette catégorie du widget sidebar, quand aucun élément de la catégorie n'est visible par l'utilisateur.Woocommerce: masquer catégorie dans la boutique

J'ai créé une fonction qui place l'ID d'exclusion term_id dans une variable globale. Maintenant, j'ai besoin de quelque chose qui les exclut de la vue dans la boutique.

$GLOBALS['cat_exclude'] = NULL; 

    function getExcludedCats() { 

     //if(! is_admin() && (is_product_category() || is_shop())){  

      $current_tax = get_query_var('product_cat'); 
      $term =get_term_by('slug', $current_tax, 'product_cat'); 
      $parentid = $term->term_id; 

      $args = array(
       'hide_empty' => true, 
       'parent' => $parentid 
      ); 

      $product_categories = get_terms('product_cat', $args); 

      $exclude = array(); 
      foreach ($product_categories as $category) { 

       $posts   = get_posts(array('post_type' => 'product', 'posts_per_page' => -1, 'product_cat' => $category->slug, 'fields' => 'ids')); 
       $show_category = false; 

       foreach ($posts as $post) { 

        $product   = new WC_Product($post); 
        $visible_product = $product->is_visible(); 

        if (true === $visible_product) { 
         $show_category = true; 
         break; 
        } 

       } 

       if (false === $show_category) { 
        $exclude[] = $category->term_id; 
       } 

      } 

      if (! empty($exclude)) { 
       $GLOBALS['cat_exclude'] = implode(',', $exclude); 
      } 
     //} 
    } 

    add_action('wp_head', 'getExcludedCats'); 

Cependant, dans la vue de magasin, la catégorie est toujours visible. Comment puis-je l'enlever là, quand aucun élément dans cette catégorie n'est visible à l'utilisateur.

J'ai essayé: https://gist.github.com/rynaldos/a9d357b1e3791afd9bea48833ff95994 Mais il supprime TOUJOURS la catégorie, à la fois dans le widget et la boutique.

Les produits sont affichés par les membres du groupe du client: https://wordpress.org/plugins/groups/

Répondre

1

Je pense que je réussi à créer un script qui a rendu cela possible: https://gist.github.com/DarkAllMan/cffb114eb97c6f26882e54793e023587

<?php 
    /** 
    Plugin Name: WooCommerce - Hide categories where no products are visible to user 
    Plugin URI: https://www.randall.nl 
    Description: Excludes categories with no visible products from the WooCommerce category overview in shop 
    Version: 0.1 
    Author: Randall Kam 
    Author URI: https://www.randall.nl 
    */ 

    if (! defined('ABSPATH')) { 
     exit; // Exit if accessed directly 
    } 

    if (!class_exists('ExcludeCats')) : 

    class ExcludeCats { 

     public $version = '0.1', 
       $exclude = array(); 

     protected static $_instance = null; 

     /** 
     * Main Plugin Instance 
     * 
     * Ensures only one instance of plugin is loaded or can be loaded. 
     */ 
     public static function instance() { 
      if (is_null(self::$_instance)) { 
       self::$_instance = new self(); 
      } 
      return self::$_instance; 
     } 

     /** 
     * Constructor 
     */ 
     public function __construct() { 
      // CHECK CATEGORIES FOR VISIBLE PRODUCTS 
      add_action('wp_head', array($this, 'get_excluded_cats'), 10, 3); 

      // ADD THE WIDGET SIDEBAR FILTER 
      add_filter('woocommerce_product_categories_widget_args', array($this, 'kfg_exclude_categories_from_widget'), 10, 1); 

      // ADD THE SHOP FILTER 
      add_filter('woocommerce_product_subcategories_args', array($this, 'filter_woocommerce_product_subcategories_args'), 10, 1); 
     } 

     // GET CATEGORIES WITH NO VISIBLE PRODUCTS AND PUT IN GLOBAL IF GLOBAL FALSE 
     public function get_excluded_cats($terms, $taxonomies, $args) { 

      $current_tax = get_query_var('product_cat'); 
      $term =get_term_by('slug', $current_tax, 'product_cat'); 
      $term_id = $term->term_id; 

      $args = array(
       'parent' => $term_id, 
       'hide_empty' => false, 
       'hierarchical' => false, 
      ); 

      $product_categories = get_terms('product_cat', $args);   

      // if a product category and on the shop page 
      //if (in_array('product_cat', $taxonomies) && ! is_admin() && is_shop()) { 
      if (! is_admin() && is_shop()) { 

       foreach ($product_categories as $key => $term) { 

        unset($this->exclude); 

        if($term->taxonomy=='product_cat'){ 

         $posts   = get_posts(array('post_type' => 'product', 'posts_per_page' => -1, 'product_cat' => $term->slug, 'fields' => 'ids')); 
         $show_category = false; 

         foreach ($posts as $post) { 

          $product   = new WC_Product($post); 
          $visible_product = $product->is_visible(); 

          if (true === $visible_product) { 
           $show_category = true; 
           break; 
          } 

         } 


        } 

        if (false === $show_category) { 
         $this->exclude[] = $term->term_id; 
        } 
       } 
      } 
     } 

     public function get_parent_cats ($cat_termid, $found = array()) { 
      array_push ($found, $cat_termid); 
      $term =get_term_by('term_id', $cat_termid, 'product_cat'); 

      if($term->parent > 0){ 
       return get_parent_cats($term->parent, $found); 
      } 
      return $found; 
     } 

     // ADD FILTERS FOR CATEGORIES AND EXCLUDE EMPTY 
     public function filter_woocommerce_product_subcategories_args($temp_args = array()) { 

      $current_tax = get_query_var('product_cat'); 
      $term =get_term_by('slug', $current_tax, 'product_cat'); 
      $term_id = $term->term_id; 

      $temp_args = array(
       'parent'  => $term_id, 
       'menu_order' => 'ASC', 
       'hide_empty' => 1, 
       'hierarchical' => 1, 
       'taxonomy'  => 'product_cat', 
       'pad_counts' => 1, 
       'include'  => NULl, 
       'exclude'  => $this->exclude, 
      ); 

      return $temp_args; 
     } 

     public function kfg_exclude_categories_from_widget($category_list_args) { 

      $current_tax = get_query_var('product_cat'); 
      $term   = get_term_by('slug', $current_tax, 'product_cat'); 
      $term_id  = $term->term_id; 

      $parents = $this->get_parent_cats($term_id); 

      $args = array(
       'hide_empty' => false, 
       'hierarchical' => true, 
      ); 

      $product_categories = get_terms('product_cat', $args); 
      $wexclude = array(); 

      foreach ($product_categories as $category) { 
       $posts   = get_posts(array('post_type' => 'product', 'posts_per_page' => -1, 'product_cat' => $category->slug, 'fields' => 'ids')); 
       $show_category = false; 
       foreach ($posts as $post) { 
        $product   = new wC_Product($post); 
        $visible_product = $product->is_visible(); 
        if (true === $visible_product) { 
         $show_category = true; 
         break; 
        } 
       } 
       if (false === $show_category || ($category->parent > 0 && !in_array($category->parent,$parents))) { 
        $wexclude[] = $category->term_id; 
       } 
      } 
      if (! empty($wexclude)) { 
       $category_list_args['exclude'] = implode(',', $wexclude); 
       unset($category_list_args['include']); 
      } 
      return $category_list_args; 
     } 

    } // class ExcludeCats 

    endif; // class_exists 

    /** 
    * Returns the main instance of the plugin class to prevent the need to use globals. 
    * 
    * @since 2.0 
    * @return WooCommerce_PostcodeAPInu 
    */ 
    function ExcludeCats() { 
     return ExcludeCats::instance(); 
    } 

    ExcludeCats(); // load plugin