Obtener solo las categorías de nivel superior usando get_categories() sin bucle foreach
Pregunta muy simple: Aquí está mi código de get_categories()
:
<?php $args = array(
'show_option_all' => '',
'show_option_none' => '',
'orderby' => 'ID',
'order' => 'ASC',
'show_count' => 0,
'hide_empty' => 0,
'exclude' => '1',
'hierarchical' => 0,
'depth' => 1,
'number' => 12,
'parent' => 0 // Agregar este parámetro para obtener solo categorías principales
);
?>
<?php $categories = get_categories( $args ); ?>
<div class="middle-left">
<ul>
<?php for( $i=0; $i<4; $i++ ) {
echo "<li>" . $categories[$i]->{'name'} . "</li>";
} ?>
</ul>
</div>
<div class="middle-middle">
<ul>
<?php for( $i=4; $i<8; $i++ ) {
echo "<li>" . $categories[$i]->{'name'} . "</li>";
} ?>
</ul>
</div>
<div class="middle-right">
<ul>
<?php for( $i=8; $i<12; $i++ ) {
echo "<li>" . $categories[$i]->{'name'} . "</li>";
} ?>
</ul>
</div>
Después de una larga búsqueda, encontré la manera de acceder al objeto stdClass sin el bucle foreach y quiero continuar de esta manera. Pero solo quiero las categorías de nivel superior, sin subcategorías.
¿Cómo puedo modificar el argumento aquí?

Utiliza get_terms
con un argumento parent
. De la página del Codex para esa función, énfasis mío:
parent (entero) Obtiene hijos directos de este término (solo términos cuyo padre explícito es este valor). Si se pasa 0, solo se devuelven términos de nivel superior. Por defecto es una cadena vacía.
No probado, pero esto debería funcionar.
$categories = get_terms(
'category',
array('parent' => 0)
);
Por supuesto, necesitas añadir cualquier otro argumento que requieras.

Una solución nativa de WordPress para devolver la categoría padre ACTUAL.
No necesitas usar foreach fuera de la función...
function primary_categories($arr_excluded_cats) {
if($arr_excluded_cats == null) {
$arr_excluded_cats = array();
}
$post_cats = get_the_category();
$args = array(
'orderby' => 'name',
'order' => 'ASC',
'parent' => 0
);
$primary_categories = get_categories($args);
foreach ($primary_categories as $primary_category) {
foreach ($post_cats as $post_cat) {
if(($primary_category->slug == $post_cat->slug) && (!in_array($primary_category->slug, $arr_excluded_cats))) {
return $primary_category->slug;
}
}
}
}
//si tienes más de dos categorías padres asociadas al post, puedes eliminar las que no quieras aquí
$dont_return_these = array(
'receitas','enciclopedico'
);
//usa la función así:
echo primary_categories($dont_return_these);
Comentarios:
- si solo tienes una categoría padre por post, pasa null en lugar de un array
- si quieres otro output en lugar del slug cambia esto: return $primary_category->slug;
