Adán Fletcher
No deseo usar ningún complemento para completar esta tarea, ya que recientemente experimenté conflictos con un proyecto similar que rompió un sitio. Así que deseo crear esta funcionalidad desde lo básico.
Necesito una lista desplegable en las páginas de categorías de productos para seleccionar productos por marca. La lista desplegable mostraría todas las marcas. Cuando selecciona uno, el sitio muestra solo aquellos productos asignados a la marca. No necesitamos usar el menú desplegable incorporado que permite ver por novedad, precio, popularidad, etc.
Usando WooCommerce 'Brands
taxonomía He configurado mis marcas y asignado a cada producto un marca.
Puedo ver la matriz de todas las marcas y sus atributos con el siguiente código:
$brands = get_terms('brand');
print_r($brands);
Lo que genera lo siguiente:
matriz (
[0] => Objeto WP_Term ( [term_id] => 978 [name] => Imari Sometsuke [slug] => imari-sometsuke [term_group] => 0 [term_taxonomy_id] => 978 [taxonomy] => marca WooCommerce Brand taxonomy terms list in a dropdown selector => [parent] => 0 [count] => 1 [filter] => crudo)
[1] => Objeto WP_Term ( [term_id] => 982 [name] => Kutani [slug] => kutani [term_group] => 0 [term_taxonomy_id] => 982 [taxonomy] => marca WooCommerce Brand taxonomy terms list in a dropdown selector => [parent] => 0 [count] => 2 [filter] => crudo)
[2] => Objeto WP_Term ( [term_id] => 977 [name] => Kutani Shoza [slug] => kutani-shoza [term_group] => 0 [term_taxonomy_id] => 977 [taxonomy] => marca WooCommerce Brand taxonomy terms list in a dropdown selector => [parent] => 0 [count] => 4 [filter] => crudo)
[3] => Objeto WP_Term ( [term_id] => 979 [name] => Kutani Tokkuri [slug] => kutani-tokkuri [term_group] => 0 [term_taxonomy_id] => 979 [taxonomy] => marca WooCommerce Brand taxonomy terms list in a dropdown selector => [parent] => 0 [count] => 2 [filter] => crudo)
[5] => Objeto WP_Term ( [term_id] => 985 [name] => Nishikawa Sukenobu [slug] => nishikawa-sukenobu [term_group] => 0 [term_taxonomy_id] => 985 [taxonomy] => marca WooCommerce Brand taxonomy terms list in a dropdown selector => [parent] => 0 [count] => 1 [filter] => crudo)
[6] => Objeto WP_Term ( [term_id] => 984 [name] => Shinsui Ito [slug] => shinsui-ito [term_group] => 0 [term_taxonomy_id] => 984 [taxonomy] => marca WooCommerce Brand taxonomy terms list in a dropdown selector => [parent] => 0 [count] => 2 [filter] => crudo)
[7] => Objeto WP_Term ( [term_id] => 976 [name] => Takeji Asano [slug] => Takeji-asano [term_group] => 0 [term_taxonomy_id] => 976 [taxonomy] => marca WooCommerce Brand taxonomy terms list in a dropdown selector => [parent] => 0 [count] => 2 [filter] => crudo)
[8] => Objeto WP_Term ( [term_id] => 980 [name] => Toshusai Sharaku [slug] => toshusai-sharaku [term_group] => 0 [term_taxonomy_id] => 980 [taxonomy] => marca WooCommerce Brand taxonomy terms list in a dropdown selector => [parent] => 0 [count] => 3 [filter] => crudo)
)
¿Cómo se haría para construir la lista desplegable (seleccionar) para crear esto? Me imagino que tendría el marco algo así, que he comenzado:
<?php
$brands = get_terms('brand');
//print_r($brands);
?>
<select name="orderby" class="orderby">
<?php foreach ( $brands as ??? ) : ?>
<option value="<?php echo esc_attr( $??? ); ?>" <?php selected( $orderby, $??? ); ?>><?php echo esc_html( $??? ); ?></option>
<?php endforeach; ?>
</select>
LoicTheAztec
Como puede ver, es una matriz de objetos de término (Objeto WP_Term), y debe usar la sintaxis de objeto para cada atributo de ese término, en el ciclo, de esta manera:
<?php
$brands = get_terms( 'brand', array(
'orderby' => 'name' // orderby arguments ('name', 'slug','term_group', 'term_id', 'id', 'description')
) );
//print_r($brands);
?>
<select name="orderby" class="orderby">
<?php
foreach ( $brands as $key => $brand ) :
$brand_id = $brand->term_id;
$brand_name = $brand->name;
$brand_slug = $brand->slug;
$brand_term_group = $brand->term_group;
$brand_term_taxonomy = $brand->term_taxonomy_id;
$brand_taxonomy = $brand->taxonomy;
$brand_description = $brand->description;
$brand_parent = $brand->parent;
$brand_count = $brand->count;
$brand_filter = $brand->filter;
$number = $key+1;
$option = 'option-' . $number;
?>
<option value="<?php echo $option; ?>"><?php echo $brand->name; ?></option>
<?php endforeach; ?>
</select>
Este código está probado y funciona.
En la nueva versión de WooCommerce, el
terms
ha sido prefijado por Pensilvania_por lo que la marca ha sido reemplazada por pa_brand
El código de trabajo para la última versión sería
<?php $brands = get_terms('pa_brand', ['orderby' => 'name']); ?>
<select name="orderby" class="orderby">
<?php
if (!empty($brands) && !is_wp_error($brands)):
foreach ($brands as $brand) :
?>
<option value="<?= $brand->term_id; ?>">
<?= $brand->name; ?>
</option>
<?php
endforeach;
endif;
?>
</select>
Referencia: https://developer.wordpress.org/reference/functions/get_terms/