Cómo obtener el nombre de la categoría principal en la nueva versión de WordPress

5 jun 2016, 11:02:52
Vistas: 41.2K
Votos: 4

Existe una nueva característica en WordPress que introduce la categoría principal. Cuando seleccionas una categoría, se puede especificar cuál es la categoría principal.

Mi pregunta es ¿cómo puedo obtener el nombre de esa categoría principal usando las funciones del núcleo de WordPress?

Si no existe una función específica, ¿pueden ayudarme a obtener la primera categoría hija de la categoría principal?

por ejemplo:
- categoría principal
-- categoría hija 1
-- categoría hija 2
-- categoría hija 3

Necesito obtener -- categoría hija 1.

Gracias por su ayuda.

6
Comentarios

¿Categoría principal? ¿Puedes ayudarme a encontrar un artículo sobre este nuevo concepto de categoría principal?

Sumit Sumit
5 jun 2016 11:23:33

Instala la última versión de WordPress, luego añade una nueva entrada, selecciona múltiples categorías y una de ellas puede ser elegida como categoría principal

MMTDesigner MMTDesigner
5 jun 2016 12:00:37

¿O tal vez me equivoco y es un plugin el que me está dando esta opción?

MMTDesigner MMTDesigner
5 jun 2016 12:01:38

No lo veo. ¿Te refieres a esto https://yoast.com/yoast-seo-3-1/ ?

Sumit Sumit
5 jun 2016 12:15:51

@MMTdesigner Es Yoast SEO el que proporciona la función de 'categoría principal'. Lo están usando para las migas de pan. No es parte del núcleo de WordPress. :)

Mayeenul Islam Mayeenul Islam
5 jun 2016 12:18:58

¿podrías responder la segunda pregunta?

MMTDesigner MMTDesigner
5 jun 2016 12:52:34
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 7
0

He editado la función MMT Designer. Esto funciona mejor para mí:

if ( ! function_exists( 'get_primary_taxonomy_id' ) ) {
    function get_primary_taxonomy_id( $post_id, $taxonomy ) {
        $prm_term = '';
        if (class_exists('WPSEO_Primary_Term')) {
            $wpseo_primary_term = new WPSEO_Primary_Term( $taxonomy, $post_id );
            $prm_term = $wpseo_primary_term->get_primary_term();
        }
        if ( !is_object($wpseo_primary_term) || empty( $prm_term ) ) {
            $term = wp_get_post_terms( $post_id, $taxonomy );
            if (isset( $term ) && !empty( $term ) ) {
                return $term[0]->term_id;
            } else {
                return '';
            }
        }
        return $wpseo_primary_term->get_primary_term();
    }
}
1 oct 2018 02:38:59
0

Veo que esta pregunta ha recibido mucha atención desde el año pasado, así que pensé en responderla de la manera correcta.

No existe una categoría principal en WordPress por defecto, pero si tienes instalado el plugin Yoast SEO, aparecerá una nueva función en la selección de categorías de Entradas individuales en el área de administración para elegir una categoría principal.

Para obtener esa categoría principal, puedes usar la siguiente función que he creado:

if ( ! function_exists( 'get_primary_taxonomy_id' ) ) {
function get_primary_taxonomy_id( $post_id, $taxonomy ) {
    $prm_term = '';
    if (class_exists('WPSEO_Primary_Term')) {
        $wpseo_primary_term = new WPSEO_Primary_Term( $taxonomy, $post_id );
        $prm_term = $wpseo_primary_term->get_primary_term();
    }
    if ( !is_object($wpseo_primary_term) && empty( $prm_term ) ) {
        $term = wp_get_post_terms( $post_id, $taxonomy );
        if (isset( $term ) && !empty( $term ) ) {
            return wp_get_post_terms( $post_id, $taxonomy )[0]->term_id;
        }
        return '';

    }
    return $wpseo_primary_term->get_primary_term();
}
}

Primero verificará si Yoast SEO está instalado y activado, luego intentará obtener la categoría principal. Si Yoast no está instalado, obtendrá todas las categorías y devolverá la primera.

Observa cómo esta función también funciona para tipos de contenido personalizados con taxonomías personalizadas.

Al final, esta función devuelve el ID de la categoría (término). Si deseas obtener el objeto de la categoría (término), puedes usar get_term($ID, $taxonomy) y pasarle el ID.

Nueva edición:

Si estás usando Rank Math y quieres obtener la taxonomía principal configurada con este plugin, el siguiente fragmento de código podría ayudarte:

   if (class_exists('RankMath')) {
        $primary_tax = get_post_meta( $post_id, 'rank_math_primary_category', true );
        if (!empty($primary_tax)) {
            return get_term( $primary_tax, $taxonomy );
        }
    }

Sugiero agregar esto después del condicional if de Yoast.

21 may 2018 17:12:38
1

Para responder a tu segunda pregunta: get_categories() te permite pasar muchos argumentos, uno de los cuales son las categorías hijas.

Primero obtén la categoría padre. He usado get_category_by_slug aquí, pero podrías usar cualquier otra forma de obtenerla, por ejemplo la función de Yoast para recuperar la categoría principal.

$category = get_category_by_slug( 'nombre-de-la-categoria' );

Luego obtén todas las categorías hijas:

$args = array(
'type'                     => 'post',
'child_of'                 => $category->term_id,
'orderby'                  => 'name',
'order'                    => 'ASC', // o cualquier orden que prefieras
'hide_empty'               => FALSE,
'hierarchical'             => 1,
'taxonomy'                 => 'category',
); 
$child_categories = get_categories($args );

Finalmente selecciona el primer elemento si existe alguno:

if !empty($child_categories) $first_child = $child_categories[0];
5 jun 2016 18:13:37
Comentarios

Gracias, esta es una buena manera de hacerlo, he encontrado otras formas pero supongo que tu método es más eficiente. Muchas gracias.

MMTDesigner MMTDesigner
6 jun 2016 07:42:22
0

esto no es para WordPress sino para un plugin de SEO, podrías usar la siguiente función

function get_post_primary_category($post_id, $term='category', 
   $return_all_categories=false){
   $return = array();

if (class_exists('WPSEO_Primary_Term')){
    // Mostrar la categoría primaria de Yoast si está habilitada y configurada
    $wpseo_primary_term = new WPSEO_Primary_Term( $term, $post_id );
    $primary_term = get_term($wpseo_primary_term->get_primary_term());

    if (!is_wp_error($primary_term)){
        $return['primary_category'] = $primary_term;
    }
}

if (empty($return['primary_category']) || $return_all_categories){
    $categories_list = get_the_terms($post_id, $term);

    if (empty($return['primary_category']) && !empty($categories_list)){
        $return['primary_category'] = $categories_list[0];  //obtener la primera

    }
    if ($return_all_categories){
        $return['all_categories'] = array();

        if (!empty($categories_list)){
            foreach($categories_list as &$category){
                $return['all_categories'][] = $category->term_id;
            }
        }
    }
}

return $return;
}

esta función fue escrita por lab21.gr

13 ago 2018 16:36:53
0

Una solución nativa de WordPress para devolver la categoría padre actual.

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 otra salida en lugar del slug cambia esto: return $primary_category-> slug;
18 sept 2019 19:24:04
0

Acabo de refactorizar la respuesta de Eqhes. Un código un poco más limpio :)

if (!function_exists('get_primary_taxonomy_id')) {
    function get_primary_taxonomy_id($post_id, $taxonomy) {
        $prm_term = '';
        $wpseo_primary_term = '';

        // Verifica si existe la clase WPSEO_Primary_Term de Yoast SEO
        if (class_exists('WPSEO_Primary_Term')) {
            $wpseo_primary_term = new WPSEO_Primary_Term($taxonomy, $post_id);
            $prm_term = $wpseo_primary_term->get_primary_term();
        }

        // Si hay un término primario definido en Yoast SEO, lo retorna
        if (is_object($wpseo_primary_term) && !empty($prm_term)) {
            return $wpseo_primary_term->get_primary_term();
        }

        // Si no hay término primario en Yoast, obtiene el primer término de la taxonomía
        $term = wp_get_post_terms($post_id, $taxonomy);

        // Si hay términos asociados, retorna el ID del primer término
        if (isset($term) && !empty($term)) {
            return $term[0]->term_id;
        }

        // Si no hay términos, retorna cadena vacía
        return '';
    }
}
12 feb 2022 10:19:39
4
-1

Utilizo el plugin sCategory Permalink https://wordpress.org/plugins/scategory-permalink/

$category_primary_id = get_post_meta(get_the_ID(), '_category_permalink', true);
if (!empty($category_primary_id)) {
    $category = get_category($category_primary_id);
    var_dump($category->name);
}
31 mar 2017 16:24:14
Comentarios

¿Qué es _category_permalink? No estoy familiarizado con esa metaclave. ¿Dónde coloco este código? ¿Podrías editar tu respuesta usando el enlace de edición de arriba y agregar más detalles a tu respuesta, por favor?

Howdy_McGee Howdy_McGee
31 mar 2017 17:26:07

> ¿Qué es category_permalink ? Cada categoría principal para la publicación se guarda como _category_permalink

Serge Andreev Serge Andreev
4 abr 2017 11:26:31

> No estoy familiarizado con esa metaclave. Usa una consulta SQL para encontrar todas las metaclaves de la publicación: SELECT * FROM postmeta WHERE post_id = ID

Serge Andreev Serge Andreev
4 abr 2017 11:27:19

> ¿Dónde coloco este código? Por ejemplo, puedes insertar este código en wp-content/themes/<tu-tema>/single.php o en algún archivo PHP diferente, donde muestres el nombre de la categoría Principal para la entrada

Serge Andreev Serge Andreev
4 abr 2017 11:27:24