web-dev-qa-db-fra.com

obtenir le type de post pluriel

Actuellement, j'essaie d'obtenir le pluriel des étiquettes de type de publication. En détail:

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

Voici comment j'essaie de le récupérer - dans l'interface utilisateur de l'administrateur - à l'aide des fonctions publiques de l'API 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 );

Le résultat est l'erreur suivante:

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

Le problème est que les étiquettes des objets de type post sont également un objet, alors que get_post_type_labels() appelle _get_custom_object_labels() en interne et semble attendre un tableau.

Fun sont les deux dernières lignes de la fonction _get_custom_object_labels():

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

Alors, est-ce que j'utilise les mauvaises fonctions? La fonction principale est-elle fausse? Cette fonction principale est-elle uniquement destinée à être utilisée lors de l'enregistrement de type de publication personnalisé?


Remarque: actuellement sur WP version 3.3.2.

2
kaiser

Modifier:

get_post_type_labels n'a jamais été conçu pour être une fonction publique. Il est uniquement utilisé en interne lors de l'enregistrement d'un type de publication. Voir ces billets de trac:


Comme vous l'avez mentionné dans votre question, vous pouvez obtenir les étiquettes directement auprès des globals:

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

Lancer la fonction:

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

Résultats:

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' 

Autre utilisation sans avoir besoin de $ wp_post_types global:

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

Lancer la fonction:

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

Après avoir effectué plusieurs tests, j'ai conclu qu'il était impossible d'utiliser get_post_type_labels en passant le $ post_type_object comme spécifié dans le codex . Il semble donc que la seule utilisation de get_post_type_labels soit interne au noyau lorsqu'un type de publication est enregistré.

3
Chris_O

Cela marche...

$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-> ??? -> ???`

Cela marche...

$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

Cela fonctionne aussi (mais pourquoi voudriez-vous déranger ...)

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

echo $object->name;

// returns plural name = posts

Cela fonctionne aussi,

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

echo $object->name;

// returns plural name = posts

... et prouve qu'il est tout à fait possible d'utiliser get_post_type_labels dans les thèmes/plugins en passant le post_type_object, mais comme je l'ai déjà dit, le codex ne vous dit pas de spécifier le ->attributes dans l'objet auquel vous souhaitez accéder. Erreur;

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

Envelopper votre code dans une fonction est également une solution si votre cas d'utilisation le permet ou le garantit.

Tout ce qui précède est parfaitement acceptable, que ce soit dans une fonction ou non, ils effectuent toujours les mêmes mécanismes et sont susceptibles aux mêmes problèmes si le noyau devait changer.

3
userabuser

J'ai un certain nombre de types d'événements différents et je voulais afficher le type d'événement à côté de chaque titre de la boucle. J'ai donc apporté une modification très mineure au code de userabuser:

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

Donc, mon code complet ressemble maintenant à ceci:

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

Et ça marche très bien. Après chaque titre, il affiche un trait d'union et le type d'événement pluriel.

0
ApocalypseLater