Термины пользовательской таксономии не отображаются списком в редакторе Gutenberg
Я создал пользовательскую таксономию, которую связал с моим CPT. Оба элемента отображаются в админ-панели, но проблема в том, что при добавлении контента и попытке выбрать термин из списка пользовательской таксономии нет никаких значений (нет списка, чекбоксов...). Я использую WordPress 5.1. Вот код, добавленный в functions.php:
function type_custom_taxonomy() {
$labels = array(
'name' => _x( 'Типы', 'общее название таксономии' ),
'singular_name' => _x( 'Тип', 'название таксономии в единственном числе' ),
'menu_name' => __( 'Типы' ),
);
register_taxonomy('types',array('action'), array(
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_rest' => true,
'show_tagcloud' => false,
));
}
add_action( 'init', 'type_custom_taxonomy', 0 );
// CPT (Пользовательский тип записи)
function action_post_type() {
register_post_type( 'action',
array(
'labels' => array(
'name' => __( 'Действия' ),
'singular_name' => __( 'Действие' )
),
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'supports' => array('title', 'editor','thumbnail'),
'taxonomies' => array('types')
)
);
}
add_action( 'init', 'action_post_type' );

Я столкнулся с такой же проблемой и решил её следующим образом:
Необходимо добавить 'show_in_rest' => true,
как для типа записи, так и для таксономий в последней строке массива, например:
register_post_type(
'portfolio',
array(
'labels' => $labels,
'exclude_from_search' => false,
'has_archive' => true,
'public' => true,
'publicly_queryable' => false,
'rewrite' => false,
'can_export' => true,
'show_in_nav_menus' => true,
'supports' => array('title', 'editor', 'thumbnail', 'comments', 'page-attributes','excerpt'),
'show_in_rest' =>true,
)
);
Для таксономии:
register_taxonomy(
'portfoliocat',
'portfolio',
array(
'hierarchical' => true,
'show_in_nav_menus' => true,
'labels' =>array(),
'query_var' => true,
'rewrite' => array('slug' => 'portfoliocat'),
'show_in_rest' => true,
)
);

У меня это было в моем CPT, но не в регистрации таксономии, это решило мою проблему.

ты имеешь в виду, что я должен добавить 'rewrite' => array( 'slug' => 'type' ), у меня это не сработало, можешь, пожалуйста, показать код

Нет, я не пробовал использовать rewrite, но я изменил slug в вызове register_taxonomy вот так: register_taxonomy( 'kt-types', array('action'), $args). Я попробовал это локально, и у меня сработало.

Да, это работает, когда я меняю types на action-types. Большое спасибо, mahmood. Можешь написать свой ответ как решение, чтобы я мог принять его?

Рад, что всё работает. Я уже добавил свой ответ в качестве решения. Хотите, чтобы я объяснил его подробнее?

Я также могу воспроизвести эту проблему. Добавление параметра show_in_rest
в функцию register_taxonomy
, как предлагают многие, обычно было бы правильным решением, но не полным в вашем случае. Это происходит потому, что конечная точка REST types
уже используется самим WordPress. Запрос к https://example.com/wp-json/wp/v2/types
возвращает зарегистрированные типы записей, и поэтому Gutenberg не понимает его. Смотрите https://developer.wordpress.org/rest-api/reference/post-types/
Таким образом, изменение слага (slug) — вероятно, лучший выход. Если ваш сайт уже работает, возможно, стоит рассмотреть правила перезаписи (rewrite rules), чтобы не пострадала SEO-оптимизация.
Тем не менее, даже если вы измените слаг, вам всё равно нужно добавить параметр show_in_rest
при использовании Gutenberg.

Мое предположение — это может быть связано с приоритетами...
Оба ваших действия используют одинаковый приоритет. Поэтому если функция type_custom_taxonomy
вызывается первой, то тип записи action
в этот момент еще не существует.
Я бы попробовал так:
function action_post_type() {
register_post_type( 'action',
array(
'labels' => array(
'name' => __( 'Actions' ),
'singular_name' => __( 'Action' )
),
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'supports' => array('title', 'editor','thumbnail'),
)
);
$labels = array(
'name' => _x( 'Types', 'taxonomy general name' ),
'singular_name' => _x( 'Type', 'taxonomy singular name' ),
'menu_name' => __( 'Types' ),
);
register_taxonomy('types',array('action'), array(
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_rest' => true,
'show_tagcloud' => false,
));
}
add_action( 'init', 'action_post_type' );
Таким образом вы можете быть уверены, что CPT регистрируется до таксономии, и вы можете привязать эту таксономию к этому CPT.

да, это именно та проблема, с которой я столкнулся - не отображается список терминов, которые я уже добавил. То есть я могу добавить новый термин, но если я хочу изменить свой CPT, у меня нет списка моих терминов

Я проверил ваш код в своей среде, и он работает без проблем. Смотрите здесь. Возможно, какая-то другая часть вашего кода вызывает эту проблему.

Я могу воспроизвести ту же проблему.
Он видит вкладку, но без записей. Таким образом, show_in_rest
не является решением и уже был настроен правильно.
Проблема в пустом ответе Rest-API. На чистой установке этого не происходит.
Пройдитесь (на локальном экземпляре) по вашим плагинам, отключайте их по одному.
Проверяйте http://domain.test/wp-json/wp/v2/taxonomyname
в отдельном окне, чтобы увидеть, влияет ли это на вывод.
В моем случае проблему вызвал плагин "User Access Manager" с настройкой по умолчанию "Taxonomies settings" → "Hide empty Taxonomies" установленной в "Да"!
В этом случае выберите вашу таксономию в разделе "Object type" и установите опцию в "Нет".

В случае проблемы с UAM: https://wordpress.org/support/topic/hide-empty-taxonomy-option-is-breaking-gutenberg-tabs/
