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.
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é.
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.
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.