Cómo obtener el nombre de la categoría principal en la nueva versión de WordPress
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.

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();
}
}

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.

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];

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

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;

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 '';
}
}

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);
}

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

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

> 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
