目前,我正在尝试获取post type标签的复数形式。详细内容:
$GLOBALS[\'wp_post_types\'][ get_current_screen()->post_type ]->labels->name
这就是我尝试使用公共wp API函数在管理UI中检索它的方式:
$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
问题是,post type对象标签也是一个对象,而
get_post_type_labels()
呼叫
_get_custom_object_labels()
内部,似乎需要一个数组。
“乐趣”是_get_custom_object_labels()
功能:
$labels = array_merge( $defaults, $object->labels );
return (object)$labels;
那么,我是否使用了错误的函数?核心功能是否错误?此核心功能是否仅用于自定义post类型注册?
注:目前在WP版本3.3.2上
最合适的回答,由SO网友:Chris_O 整理而成
编辑:
get\\u post\\u type\\u标签从未打算成为公共功能。它仅在注册帖子类型时在内部使用。查看这些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\\u post\\u类型即可替代使用:
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);
在做了几次测试之后,我得出结论,不可能使用get\\u post\\u type\\u标签将$post\\u type\\u对象传递为
specified in the codex. 所以它似乎是
get_post_type_labels
在注册post类型时,位于核心内部。
SO网友:Adam
这很有效。。。
$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
但正如我所说,法典没有告诉你
->attributes
在您想要访问的对象中,因此您会收到错误;
Fatal error: Cannot use object of type stdClass as array in C:\\xampp\\htdocs\\wp-includes\\post.php on line 1209
如果您的用例允许或保证,将代码包装到函数中也是一种解决方案。
上述任何一项都是完全可以接受的,无论其是否在功能中,它们仍在执行相同的机制,并且如果核心发生变化,则容易出现相同的问题。