Soporte » Plugins y Hacks » WooCommerce » Filtro por Marcas no funciona

  • Hola, quiero añadir un filtro por marcas en el Admin de mi web. Ya tengo un filtro por Etiquetas que funciona bien y su código es

    add_filter( 'woocommerce_product_filters', 'OCHOA_filter_by_Tag' );
     
    function OCHOA_filter_by_Tag( $output ) {
       
      global $wp_query;
     
      $output .= wc_product_dropdown_categories( array(
        'show_option_none' => 'Select a Tag',
        'taxonomy' => 'product_tag',
        'name' => 'product_tag',
        'selected' => isset( $wp_query->query_vars['product_tag'] ) ? $wp_query->query_vars['product_tag'] : '',
      ) );
       
      return $output;
    }

    Ahora, si a ese código le cambio el taxonomy product_tag por pa_brand no funciona, entonces hice otro filtro así

    add_action('restrict_manage_posts', 'tsm_filter_post_type_by_taxonomy');
    function tsm_filter_post_type_by_taxonomy() {
        global $typenow;
        $post_type = 'product'; // change to your post type
        $taxonomy  = 'pa_brand'; // change to your taxonomy
        if ($typenow == $post_type) {
            $selected      = isset($_GET[$taxonomy]) ? $_GET[$taxonomy] : '';
            $info_taxonomy = get_taxonomy($taxonomy);
            wp_dropdown_categories(array(
                'show_option_all' => sprintf( __( 'Select a Brand' ), $info_taxonomy->label ),
                'taxonomy'        => $taxonomy,
                'name'            => $taxonomy,
                'orderby'         => 'name',
                'selected'        => $selected,
                'show_count'      => true,
                'hide_empty'      => true,
            ));
        };
    }
    
    add_filter('parse_query', 'tsm_convert_id_to_term_in_query');
    function tsm_convert_id_to_term_in_query($query) {
        global $pagenow;
        $post_type = 'product'; // change to your post type
        $taxonomy  = 'pa_brand'; // change to your taxonomy
        $q_vars    = &$query->query_vars;
        if ( $pagenow == 'edit.php' && isset($q_vars['post_type']) && $q_vars['post_type'] == $post_type && isset($q_vars[$taxonomy]) && is_numeric($q_vars[$taxonomy]) && $q_vars[$taxonomy] != 0 ) {
            $term = get_term_by('id', $q_vars[$taxonomy], $taxonomy);
            $q_vars[$taxonomy] = $term->slug;
        }
    }

    Este ultimo código mantiene la marca seleccionada cuando hago el envío del formulario (clic en el botón filtrar) pero no filtra nada, muestra la lista completa de productos, me pueden decir que debo cambiar para que funcione.

    Imagen de lo que necesito.
    Imagen Filtro

Viendo 7 respuestas - de la 1 a la 7 (de un total de 7)
  • Iniciador del debate ochoasv503

    (@ochoasv503)

    Nadie tiene idea de que puedo hacer para que funcione? 🙁

    Es importante que aclares cómo defines la marca, si es un atributo del producto o una taxanomía. Si es un atributo, la función no encuentra la marca.

    Iniciador del debate ochoasv503

    (@ochoasv503)

    @mjcreativos gracias. En efecto las marcas están definidas en un atributo marcas. La verdad en su momento no encontré otra forma de poner las marcas.

    Cual seria la forma correcta de implementar el filtro con el atributo marca? Pero cabe mencionar que como lo pongo en la imagen, el filtro o el select «si filtra» por marcas y cuantos productos tiene por marca, lo que no hace es que al dar clic en filtrar no trae nada de la DB y tampoco mantiene la opción seleccionada anteriormente.

    Otra cosa, si yo estoy definiendo cada marca como un valor del atributo marcas, en donde se definen propiamente las marcas en woocommerce??

    Gracias

    En ese caso, lo estás haciendo bien. Lo mejor es definir las marcas como un atributo. Productos/Atributos y ahí debes tener marca y todos los términos. Prueba lo siguiente y si no funciona, sigue buscando que seguro en Google encuentras el código, pero siempre teniendo en cuenta que es un atributo:

    function filter_products_by_pa_brand( $query ) {
        if ( ! is_admin() ) {
            return $query;
        }
     
        $screen = get_current_screen();
     
        if ( $screen->post_type == 'product' ) {
            $pa_brand = ( isset( $_GET['pa_brand'] ) ) ? $_GET['pa_brand'] : '';
     
            if ( ! empty( $pa_brand ) ) {
                $query->query_vars['tax_query'][] = array(
                    'taxonomy' => 'pa_brand',
                    'field' => 'slug',
                    'terms' => $pa_brand,
                );
            }
        }
    }
    add_filter( 'parse_query', 'filter_products_by_pa_brand' );
    
    Iniciador del debate ochoasv503

    (@ochoasv503)

    Ufff ese snnipet bota el sitio. No se porque no encuentro una salida. Ya tengo mucho rato buscando y la verdad es que no logro que filtre por marcas.

    Gracias… 🙁

    Moderador José Arcos

    (@josearcos)

    Hola, @ochoasv503.

    Antes que nada, te pido disculpas por la demora en este mensaje. ¿Pudiste solucionar tus dudas? Si es el caso, ¿puedes compartir en este hilo la solución para que el resto de la comunidad se beneficie?

    Un saludo.

    Iniciador del debate ochoasv503

    (@ochoasv503)

    Hola @josearcos

    No, no pude resolver el filtro, intenté de muchas formas y al final no he logrado tener un Snippet que me permita hacer lo que quiero.

Viendo 7 respuestas - de la 1 a la 7 (de un total de 7)
  • El debate ‘Filtro por Marcas no funciona’ está cerrado a nuevas respuestas.