現在、私は投稿タイプのラベルを複数形にしようとしています。詳細に:
$GLOBALS['wp_post_types'][ get_current_screen()->post_type ]->labels->name
これが、私が管理UIで公開wp API関数を使って取得しようとしている方法です。
$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 );
結果は以下のエラーです。
Fatal error: Cannot use object of type stdClass as array in D:\development\xampp\htdocs\wp_inst\wp-includes\post.php on line 1209
問題は、get_post_type_labels()
が内部的に_get_custom_object_labels()
を呼び出し、配列を期待しているように見えるのに対し、post型のオブジェクトラベルもオブジェクトであることです。
_get_custom_object_labels()
関数の最後の2行は楽しいです。
$labels = array_merge( $defaults, $object->labels );
return (object)$labels;
それで、私は間違った機能を使っていますか?コア機能が間違っていますか?このコア機能は、カスタム投稿タイプの登録時にのみ使用されることを意図していますか?
注:現在WPバージョン3.3.2にあります。
get_post_type_labelsは決してパブリック関数になることを目的としていませんでした。投稿タイプを登録するときに内部的にのみ使用されます。これらのTracのチケットを見る:
質問で述べたように、グローバルから直接ラベルを取得できます。
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;
}
機能を実行する:
$labels = c3m_get_labels();
var_dump($labels);
戻り値:
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'
グローバルな$ wp_post_typesを必要とせずに代替使用:
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;
}
機能を実行する:
$labels = c3m_get_labels();
$labels = $labels->labels;
var_dump($labels);
いくつかのテストを行った後、$ post_type_objectを として指定されたコーデックスに渡してget_post_type_labelsを使用することは不可能であると結論づけました 。そのため、投稿タイプが登録されたときにget_post_type_labels
の唯一の使用目的は内部的にコアにあるようです。
これは動作します...
$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-> ??? -> ???`
これは動作します...
$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
これも機能します(しかし、なぜあなたは気にしませんか...)
$post_type_obj = get_post_type_object( 'post' )->labels;
$object = get_post_type_labels( $post_type_obj );
echo $object->name;
// returns plural name = posts
これもうまくいきます、
$post_type_obj = get_post_type_object( 'post' );
$object = get_post_type_labels( $post_type_obj->labels );
echo $object->name;
// returns plural name = posts
...そして、get_post_type_labels
を渡すテーマ/プラグインでpost_type_object
を使うことは完全に可能であることを証明しますが、私が言っているようにCodexはあなたがアクセスしたいオブジェクト内の->attributes
を指定するようにあなたに指示しません。エラー;
Fatal error: Cannot use object of type stdClass as array in C:\xampp\htdocs\wp-includes\post.php on line 1209
コードを関数にラップすることも、ユースケースが許可または保証する場合の解決策です。
上記のどれもが機能的であろうとなかろうと完全に受け入れられます、それらはまだ同じメカニズムを実行していて、コアが変更されるならば同じ問題を受けやすいです。
さまざまなイベントタイプがあり、ループ内の各タイトルの横にイベントタイプを表示したいので、ユーザーのコードを使用するように非常に小さな変更を加えました。
$object = get_post_type_object( get_post_type() )->labels;
echo $object->name;
だから私の完全なコードは今このようになります:
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> - <?php $object = get_post_type_object( get_post_type() )->labels;
echo $object->name; ?></h3>
そしてそれはうまく機能します。各タイトルの後にはハイフンと複数形のイベントタイプが表示されます。