Сделал эту пользовательскую таксономию, которая будет управлять макетом на отдельных сообщениях, в основном я хочу добавить две опции, Layout 1 и Layout 2.
// Register Custom Taxonomy
function custom_taxonomy() {
$labels = array(
'name' => _x( 'Layout', 'Taxonomy General Name', 'text_domain' ),
'singular_name' => _x( 'Layout', 'Taxonomy Singular Name', 'text_domain' ),
'menu_name' => __( 'Taxonomy', 'text_domain' ),
'all_items' => __( 'All Items', 'text_domain' ),
'parent_item' => __( 'Parent Item', 'text_domain' ),
'parent_item_colon' => __( 'Parent Item:', 'text_domain' ),
'new_item_name' => __( 'New Item Name', 'text_domain' ),
'add_new_item' => __( 'Add New Item', 'text_domain' ),
'edit_item' => __( 'Edit Item', 'text_domain' ),
'update_item' => __( 'Update Item', 'text_domain' ),
'separate_items_with_commas' => __( 'Separate items with commas', 'text_domain' ),
'search_items' => __( 'Search Items', 'text_domain' ),
'add_or_remove_items' => __( 'Add or remove items', 'text_domain' ),
'choose_from_most_used' => __( 'Choose from the most used items', 'text_domain' ),
'not_found' => __( 'Not Found', 'text_domain' ),
);
$capabilities = array(
'manage_terms' => 'foobar',
'edit_terms' => 'foobar',
'delete_terms' => 'foobar',
'assign_terms' => 'foobar'
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => false,
'show_in_nav_menus' => false,
'show_tagcloud' => false,
'capabilities' => $capabilities,
);
register_taxonomy( 'Layout', array( 'post' ), $args );
}
// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );
Возможности установлены на недопустимые значения, чтобы запретить редактирование терминов, но я не могу заставить работать wp_insert_term.
Добавление двух терминов в мою пользовательскую таксономию не может быть таким сложным, верно?
Использование этого для вставки термина не работает, хотя, если я изменил свое имя пользовательской таксономии на «категория», то есть WP по умолчанию, он работает просто отлично. Что дает?
function example_insert_category() {
$parent_term = term_exists( 'layout' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id
wp_insert_term(
'Example Category',
'layout',
array(
'description' => 'This is an example category created with wp_insert_term.',
'slug' => 'example-category'
)
);
}
add_action( 'after_setup_theme', 'example_insert_category' );
custom-taxonomy
Энди
источник
источник
Ответы:
РЕДАКТИРОВАТЬ 2
Как и было обещано, вот код для плагина.
Известно, что пользовательские таксономии и пользовательские типы сообщений должны входить в плагин, а не в вашу тему. Я удалил части из моего плагина.
КАК ЭТО РАБОТАЕТ
Таксономия регистрируется как обычно через плагин. Для любой информации, касающейся этого, вы можете пойти и проверить
register_taxonomy
. Часть, которую мне нужно было выделить и что относится к этому вопросу, - это как вставить новые термины.Вставить термины
wp_insert_terms
быстро и легко, но этот код может также повредить время загрузки, если не используется правильно. Идея состоит в том, чтобы запустить эту функцию один раз, а потом никогда, почти так же, как удалить ее после первого запуска.Для этого вам нужно подключить свою функцию
register_activation_hook
. Этот хук запускается один раз, то есть когда плагин активирован, он не будет перезапущен при обновлении страницы. Единственный раз, когда он будет срабатывать снова, это когда плагин деактивируется и снова активируетсяПоэтому сначала необходимо зарегистрировать свою таксономию, поскольку вы не можете назначить термины таксономии, которая не существует. Как только ваша таксономия зарегистрирована, вы можете вставить свои условия. Помните, что это действие будет происходить только один раз, и именно тогда плагин активируется. Если вам нужно добавить термины, вам нужно деактивировать плагин и снова активировать его
Вы также должны сначала проверить, существует ли термин, прежде чем пытаться его создать и вставить.
Вот код плагина
РЕДАКТИРОВАТЬ 1
Ваша проблема с введением терминов - ваш крючок.
after_setup_theme
выполняется раньшеinit
, это означает, что вы пытаетесь вставить термин в таксономию, которая еще не зарегистрирована.Я бы посоветовал вам переместить свою
wp_insert_term
функцию внутрь функции инициализации, чуть нижеregister_taxonomy
Также желательно сначала проверить, существует ли термин (
term_exists
), прежде чем вставлять егоПример:
Пожалуйста, обратите внимание, это не проверено
ОРИГИНАЛЬНЫЙ ОТВЕТ
Имена пользовательских таксономий (и имена пользовательских типов записей) должны соответствовать очень специфическому набору правил, в противном случае вы столкнетесь с ловушками, для которых нет обходного пути.
Вот руководство при выборе имен для пользовательских таксономий (и пользовательских типов записей)
Следующее не допускается в именах пользовательских таксономий и именах пользовательских типов записей
Заглавные буквы или верблюд
Любой тип специального символа, кроме подчеркивания (
_
)пространства
Более 32 символов для таксономий и 20 для типов записей
Любые зарезервированные имена , и, пожалуйста, обратите внимание, что это касается любого пользовательского соглашения об именах, а не только имен таксономии.
Если в названии таксономии более одного слова, они должны быть разделены подчеркиванием, а не дефисами (
-
). Меня оспаривают, что дефисы - это путь для SEO в URL для названий таксономии. Это правда, поэтому существуют правила переписывания для соответствующей корректировки вашего URL. Никогда не меняйте названия таксономии или названия типов записей для целей SEO.Кроме того, вы должны удалить эти странные возможности. Это также может создать проблему
Если это не решает вашу проблему, пожалуйста, добавьте код, который вы используете с
wp_insert_term
Ссылка:
register_taxonomy
register_post_type
источник
$taxonomy
параметр не очищается вообще, если дляquery_var
аргумента установлено значениеtrue
. Это на самом деле невероятно. Иначе это очищается черезsanitize_title_with_dashes()
, который, номенклатурно, заменяет вещи с черточками повсюду. Что тоже невероятно, так как их не следует использовать.register_post_type()
.