obtener tipo de publicación plural

2

Actualmente estoy tratando de obtener las etiquetas de tipo de publicación plural. En detalle:

$GLOBALS['wp_post_types'][ get_current_screen()->post_type ]->labels->name

Así es como estoy intentando recuperarlo, en la interfaz de usuario de administración, usando las funciones públicas de la API de wp:

$post_type_name = get_current_screen()->post_type;
$post_type_obj = get_post_type_object( $post_type_name );
get_post_type_labels( $post_type_obj );

El resultado es el siguiente error:

  

Fatal error: Cannot use object of type stdClass as array in D:\development\xampp\htdocs\wp_inst\wp-includes\post.php on line 1209

El problema es que las etiquetas de objetos de tipo de publicación también son un objeto, mientras que get_post_type_labels() llama a _get_custom_object_labels() internamente y parece esperar una matriz.

Diversión son las dos últimas líneas de la función _get_custom_object_labels() :

$labels = array_merge( $defaults, $object->labels );
return (object)$labels;

Entonces, ¿estoy usando las funciones incorrectas? ¿Está mal la función central? ¿Esta función principal solo debe utilizarse durante el registro personalizado de tipo de publicación?

Nota: Actualmente en la versión 3.3.2 de WP.

    
pregunta kaiser 13.05.2012 - 18:11

3 respuestas

3

Editar:

get_post_type_labels nunca fue pensado para ser una función pública. Solo se usa internamente cuando se registra un tipo de publicación. Vea estos boletos de trac:

Como mencionó en su pregunta, puede obtener las etiquetas directamente de los globales:

function c3m_get_labels() {
    global $wp_post_types;
    $post_type_name = get_current_screen ()->post_type;
    $labels = &$wp_post_types[$post_type_name]->labels;
    return $labels;
}

Ejecutando la función:

$labels = c3m_get_labels();
    var_dump($labels);

Devoluciones:

object(stdClass)[232]
  public 'name' => string 'Posts' (length=5)
  public 'singular_name' => string 'Post' (length=4)
  public 'add_new' => string 'Add New' (length=7)
  public 'add_new_item' => string 'Add New Post' (length=12)
  public 'edit_item' => string 'Edit Post' (length=9)
  public 'new_item' => string 'New Post' (length=8)
  public 'view_item' => string 'View Post' (length=9)
  public 'search_items' => string 'Search Posts' (length=12)
  public 'not_found' => string 'No posts found.' (length=15)
  public 'not_found_in_trash' => string 'No posts found in Trash.' (length=24)
  public 'parent_item_colon' => null
  public 'all_items' => string 'All Posts' (length=9)
  public 'menu_name' => string 'Posts' (length=5)
  public 'name_admin_bar' => string 'Post' 

Uso alternativo sin necesidad de $ wp_post_types globales:

function c3m_get_labels() {
    $post_type_name = get_current_screen ()->post_type;
    $post_type_obj = get_post_type_object ( $post_type_name );
    return $post_type_obj;
}

Ejecutando la función:

$labels = c3m_get_labels();
    $labels = $labels->labels;
    var_dump($labels);

Después de realizar varias pruebas, he llegado a la conclusión de que es imposible usar get_post_type_labels pasando el $ post_type_object como especificado en el códice . Así que parece que el único uso para get_post_type_labels es internamente en el núcleo cuando se registra un tipo de publicación.

    
respondido por el Chris_O 14.05.2012 - 00:15
3

Esto funciona ...

$object = get_post_type_object( 'post' );

echo $object->labels->name;
echo $object->label;

// returns plural name = posts

// var_dump ( $object ); to return all items within the object
// In this instance you can access anything within the class by '$object-> ??? -> ???'

Esto funciona ...

$object = get_post_type_object( 'post' )->labels;

echo $object->name;

// returns plural name = posts
// in this instance you have access to the labels array only within the object

Esto también funciona (pero ¿por qué te molesta ...)

$post_type_obj = get_post_type_object( 'post' )->labels;
$object = get_post_type_labels( $post_type_obj );

echo $object->name;

// returns plural name = posts

Esto también funciona,

$post_type_obj = get_post_type_object( 'post' );
$object = get_post_type_labels( $post_type_obj->labels );   

echo $object->name;

// returns plural name = posts

... y prueba que es completamente posible usar get_post_type_labels en temas / complementos que pasan el post_type_object pero como he dicho, el Codex no le dice que especifique qué ->attributes dentro del objeto desea acceder, por lo que recibe el error;

Fatal error: Cannot use object of type stdClass as array in C:\xampp\htdocs\wp-includes\post.php on line 1209

La inclusión de su código en una función también es una solución si su caso de uso lo permite o lo garantiza.

Cualquiera de los anteriores es perfectamente aceptable, ya sea que esté en una función o no, todavía están realizando la misma mecánica y son susceptibles a los mismos problemas si el núcleo cambiara.

    
respondido por el userabuser 13.05.2012 - 19:12
0

Tengo varios tipos de eventos diferentes y quería mostrar el tipo de evento al lado de cada título en el bucle, por lo que hice una modificación muy pequeña en el código del usuario:

$object = get_post_type_object( get_post_type() )->labels;
echo $object->name;

Así que mi código completo ahora se ve así:

<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> - <?php $object = get_post_type_object( get_post_type() )->labels;
echo $object->name; ?></h3>

Y funciona bien. Después de cada título muestra un guión y el tipo de evento plural.

    
respondido por el ApocalypseLater 21.05.2014 - 15:33

Lea otras preguntas en las etiquetas