Obtener solo las categorías de nivel superior usando get_categories() sin bucle foreach

28 dic 2013, 20:47:00
Vistas: 33.7K
Votos: 7

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í?

2
Comentarios

votado negativo porque el Codex http://codex.wordpress.org/Function_Reference/get_categories debería haberte dado la respuesta

Michael Michael
29 dic 2013 02:01:58

@Michael No puedo votar negativo tu comentario. :( Si fuera así, me temo que no lo señalaste. :(

Mayeenul Islam Mayeenul Islam
29 dic 2013 08:32:40
Todas las respuestas a la pregunta 3
0
14

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.

28 dic 2013 21:20:18
0

establecer parent a 0

$args = array(
  'parent' => 0,       // Establece el padre como 0 (sin padre)
  'hide_empty' => 0    // Muestra términos aunque estén vacíos
);
3 oct 2014 17:21:39
0

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;
18 sept 2019 19:18:12