получить сообщение типа множественного числа


В настоящее время я пытаюсь получить метки типа post во множественном числе. Подробнее:

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

Вот как я пытаюсь получить его - в пользовательском интерфейсе администратора - с помощью общедоступных функций 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

Проблема в том, что метки объектов типа post также являются объектом, в то время как get_post_type_labels() вызывает _get_custom_object_labels() внутренне и, похоже, ожидает массив.

Забавными являются последние две строки _get_custom_object_labels() функция:

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

Итак, я использую неправильные функции? Является ли основная функция неправильной? Предназначена ли эта основная функция только для использования во время регистрации пользовательского типа записи?


Примечание: В настоящее время в версии WP 3.3.2.

Author: kaiser, 2012-05-13

3 answers

Изменить:

Get_post_type_labels никогда не предназначался для публичной функции. Он используется только внутри компании при регистрации типа записи. Смотрите эти билеты на транспорт:


Как вы упомянули в своем вопросе, вы можете получить метки непосредственно из глобалов:

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

После выполнения нескольких тестов я пришел к выводу, что невозможно использовать метки get_post_type_labels, передающие объект $post_type_object как , указанный в кодексе. Таким образом, кажется, что единственное использование get_post_type_labels находится внутри ядра, когда зарегистрирован тип записи.

 6
Author: Chris_O, 2020-06-15 08:21:38

Это работает...

$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

Упаковка вашего кода в функцию также является решением если ваш вариант использования позволяет или гарантирует это.

Любое из вышеперечисленного вполне приемлемо, независимо от того, входит оно в функцию или нет, они все еще выполняют ту же механику и подвержены тем же проблемам, если ядро изменится.

 4
Author: Adam, 2012-05-13 23:44:34

У меня есть несколько различных типов событий, и я хотел отобразить тип события рядом с каждым заголовком в цикле, поэтому я внес очень незначительные изменения в код пользователя:

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

И это работает просто отлично. После каждого заголовка отображается дефис и тип события во множественном числе.

 1
Author: ApocalypseLater, 2014-05-21 13:33:59