¿Obtener categoría principal si se selecciona más de una?

4 minutos de lectura

En WordPress, ¿cómo puedo volver a la categoría principal?

Estoy usando el siguiente ciclo, si los tres están marcados, simplemente vuelve al último término. Quiero asegurarme de que sea la categoría principal.

<?php $term_list = wp_get_post_terms($post->ID, 'category', array("fields" => "names"));
foreach ($term_list as $term) {
    $name = $term;
} ?>

ingrese la descripción de la imagen aquí

  • la primaria estará siempre en la cima

    – perezoso114

    30 de marzo de 2017 a las 10:32

  • @ lazyme114 No necesariamente, puedo ver a dónde ibas con eso. Supongo que para estar seguro no debería hacerse de esa manera.

    – robo

    30 de marzo de 2017 a las 10:36

  • vale la pena intentarlo, estaba pensando en esto foreach ($term_list as $term) { $name[] = $término; } echo $nombre[0];

    – perezoso114

    30 de marzo de 2017 a las 10:42

  • @ lazyme114 Lo intentaré, realmente no hay muchas opciones.

    – robo

    30 de marzo de 2017 a las 10:45

  • aquí una solución a una pregunta similar: https://stackoverflow.com/a/57996959/6036169

    – Fellipe Sanches

    18 sep 2019 a las 17:26

avatar de usuario
david vielhuber

Esta no es una característica nativa de wordpress, sino una característica de Yoast SEO (mira aquí).

Puede verificar el estado principal de la siguiente manera:

<?php
$term_list = wp_get_post_terms($post->ID, 'category', ['fields' => 'all']);
foreach($term_list as $term) {
   if( get_post_meta($post->ID, '_yoast_wpseo_primary_category',true) == $term->term_id ) {
     // this is a primary category
   }
}
?>

Si está utilizando taxonomías personalizadas, use meta_key

_yoast_wpseo_primary_CUSTOM_TAXONOMY

en cambio.

  • ¡Ah, eso explicaría la falta de documentación! Le daré una oportunidad a ver si funciona. Gracias.

    – robo

    7 abr 2017 a las 14:55

  • ¡Gracias por este útil fragmento de código! Si no me equivoco al obtener la lista de términos, el tercer parámetro debe ser una matriz (“campos” => “todos”), de lo contrario, solo obtiene los nombres de todos los términos y no puede comparar el term_id cuando recorre $term_list. Al menos cuando lo probé fue así.

    – Luckyfella

    22 de febrero de 2018 a las 11:16

  • El comentario de @Luckyfella es correcto: el código anterior no funcionará como está. Debe cambiar array(“fields” => “names”) a array(“fields” => “all”). No puede comparar una cadena con un valor de ID

    –Charlie Stanard

    13 de julio de 2018 a las 17:42

  • Gracias por el aviso, arreglado.

    –David Vielhuber

    13 de julio de 2018 a las 21:32

  • No creo que esta solución funcione más en la nueva versión de Yoast SEO.

    – WPZA

    14/11/2018 a las 21:31

Si está utilizando el complemento “The SEO Framework” en lugar de “Yoast SEO”:

$taxonomy = 'category'; 

$post_id = get_the_ID();

$terms = wp_get_post_terms($post_id, $taxonomy, ['fields' => 'all']);

$primary_term = intval(get_post_meta( $post_id, '_primary_term_' . $taxonomy, true ));

foreach($terms as $term) {

   if( $primary_term == $term->term_id ) {

        // this is a primary category
   }
}

Referencias:

https://github.com/sybrew/the-seo-framework/blob/4262ea703eaaa50813d8cd4ac13f4537b5c6a4cc/inc/classes/post-data.class.php#L633

La respuesta aceptada no funcionará si usó la indexación y optimización del complemento Yoast.

$wpseo_primary_term = new WPSEO_Primary_Term( 'category', get_the_id() );
$wpseo_primary_term = $wpseo_primary_term->get_primary_term();
$term = get_term( $wpseo_primary_term );

Esta sería la forma correcta de hacerlo.

Para asegurarse de que el sitio no se rompa si Yoast se deshabilita, debe envolver el código en

if ( class_exists('WPSEO_Primary_Term') ) { }

  • Este método funcionó para mí con la versión más nueva de Yoast. Parece mucho más limpio que ejecutar un for each para verificar cada categoría en cada publicación. Mi única adición sería incluir: if (is_wp_error($term)) { } para que pueda saber si no hay un conjunto primario.

    – Jared Arroz

    24 de marzo de 2021 a las 15:46

  • Este tutorial también puede valer la pena echarle un vistazo: joshuawinn.com/using-yoasts-primary-category-in-wordpress-theme

    – Jared Arroz

    24 de marzo de 2021 a las 15:53

Si está utilizando el complemento “Yoast SEO”:

yoast_get_primary_term_id( 'product_cat', $post->id );

Para cualquiera que use Posicionamiento SEO matemático complemento, puede usar:

get_post_meta( $post_id, 'rank_math_primary_category', true );

Publicación relacionada: https://wordpress.org/support/topic/get-primary-category-2/

avatar de usuario
Mahfuzul Hasan

Puede usar esta función para obtener la categoría principal

<?php
function prefix_get_primary_category($post_id) {
  if(class_exists('WPSEO_Primary_Term')) {
    $wpseo_primary_term = new WPSEO_Primary_Term( 'category', $post_id );
    $wpseo_primary_term = $wpseo_primary_term->get_primary_term();
    $the_primary_term = get_term( $wpseo_primary_term );

    if(!empty($the_primary_term) && !is_wp_error($the_primary_term)) {
      return $the_primary_term;
    }
  }

  return false;
}

¿Ha sido útil esta solución?