¿Cómo obtener el enlace de una categoría de producto de WooCommerce por ID?
Las categorías de productos de WooCommerce son una taxonomía personalizada llamada product_cat
. En una función que estoy escribiendo, estoy usando get_categories
con el parámetro taxonomy
establecido como product_cat
. Todo funciona bien y puedo obtener el ID del término, el nombre e incluso el slug. Lo que no puedo resolver es cómo obtener el enlace para mostrarlo. Aparentemente get_category_link
no funciona con taxonomías personalizadas y get_term_link
tampoco está funcionando, recibo un error. Esto es lo que tengo:
$prod_cat_args = array(
'taxonomy' => 'product_cat', //woocommerce
'orderby' => 'name',
'empty' => 0
);
$woo_categories = get_categories( $prod_cat_args );
foreach ( $woo_categories as $woo_cat ) {
$woo_cat_id = $woo_cat->term_id; //ID de la categoría
$woo_cat_name = $woo_cat->name; //nombre de la categoría
$return .= '<a href="' . get_category_link( $woo_cat_id ) . '">' . $woo_cat_name . '</a>';
}//fin del foreach de $woo_categories
¿Sugerencias?
Otra actualización (Sept. 2015):
Finalmente puedo usar get_term_link
. El problema era que la cadena necesitaba ser convertida a un entero. Utilicé un consejo de Stack Overflow para la forma más rápida de convertirla usando (int)$value en PHP.
Así que quedaría así si no quieres usar el slug en el bucle foreach:
$woo_cat_id_int = (int)$woo_cat_id; //convertir
Ese valor convertido se usa en lugar del slug en get_term_link
. Espero que le ayude a alguien. :-)
Parece que lo resolví.
Usé get_term_link. Y estaba obteniendo un error porque lo estaba usando de esta manera:
get_term_link( $woo_cat_id, 'product_cat' );
Lo cual me dio este error:
Objeto de clase WP_Error no pudo ser convertido a cadena
Así que en su lugar opté por esta ruta con el slug
y funcionó:
$prod_cat_args = array(
'taxonomy' => 'product_cat', //woocommerce
'orderby' => 'name',
'empty' => 0
);
$woo_categories = get_categories( $prod_cat_args );
foreach ( $woo_categories as $woo_cat ) {
$woo_cat_id = $woo_cat->term_id; //ID de categoría
$woo_cat_name = $woo_cat->name; //nombre de categoría
$woo_cat_slug = $woo_cat->slug; //slug de categoría
$return .= '<a href="' . get_term_link( $woo_cat_slug, 'product_cat' ) . '">' . $woo_cat_name . '</a>';
}//fin del foreach $woo_categories

Aunque todavía no entiendo por qué no toma el ID pero sí el slug. El Codex dice que get_term_link debería tomar el ID...

No tiene ningún sentido - debería funcionar con el ID de hecho... muchas gracias

Term_id es un string en el objeto. Para usarlo con la función get_term_link necesitas convertirlo primero a entero get_term_link( intval($woo_cat->term_id), 'product_cat' )

$prod_cat_args = array(
'taxonomy' => 'product_cat', //woocommerce
'orderby' => 'name',
'empty' => 0
);
$terms = get_categories( $prod_cat_args );
//$term_id=6;
foreach ( $terms as $term ) {
$term_link = get_term_link( $term );
echo '<li><a class="shopping-now" href="' . esc_url( $term_link ) . '">' . $term->name . '</a></li>';
}
La función get_term_link()
funciona correctamente cuando se utiliza el objeto devuelto por get_categories()
.

Probé este código y funciona.
<?php $catTerms = get_terms('product_cat', array('hide_empty' => 0, 'orderby' => 'ASC', 'exclude' => '17,77')); ?>
<?php foreach($catTerms as $catTerm) :
$wthumbnail_id = get_woocommerce_term_meta( $catTerm->term_id,'thumbnail_id', true );
$wimage = wp_get_attachment_url( $wthumbnail_id );
$wcategory =$term_link = get_term_link( $catTerm );
?>
<ul>
<li><a class="tr" href="<?php echo esc_url( $term_link ); ?>"><?php if($wimage!=""):?><img src="<?php echo $wimage?>" alt="<?php echo esc_attr($catTerm->name); ?>" title="<?php echo esc_attr($catTerm->name); ?>"><?php endif;?><?php echo $catTerm->name; ?></a></li>
</ul>
