Пользовательские типы сообщений, таксономии и постоянные ссылки
Это сводит меня с ума, и я уверен, что это просто, но ничего, что я ищу, придумывает простую структуру (все очень сложно).
У меня есть пользовательский тип сообщения product_listing
и пользовательская таксономия product_cat
(которая является иерархической и должна иметь похожие категории).
Я просто хочу, чтобы мои URL-адреса выглядели следующим образом:
mysite.com/products/category1/product-name1
mysite.com/products/category2/product-name2
Но для жизни меня, независимо от того, что я делаю, я получаю страшный 404 вопрос. Страницы работают нормально, а сообщения работают нормально, но мои пользовательские сообщения работают неправильно. Они отображаются как:
mysite.com/products/product-name1
mysite.com/products/product-name2
На самом деле работает ! Просто я хочу видеть свою обычную таксономию, плюс я хочу иметь доступ к шаблону taxonomy.php
, который я установил, перейдя к:
mysite.com/products/category1/
mysite.com/products/category2/
Ни один из моих слизней не то же самое, и я не хочу, чтобы они были. Ниже приведено описание типа почтового типа и таксономии моего файла functions.php
:
/////CUSTOM POST TYPES /////
//регистрируем новый тип сообщения
register_post_type ('product_listing', array (
'labels' => массив (
'name' => __( 'Продукты' ),
'unique_name' => __( 'Продукт' ),
'add_new' => __( 'Добавить новое' ),
'add_new_item' => __ («Создать новый продукт»),
'edit' => __( 'Редактировать' ),
'edit_item' => __ («Редактировать продукт»)
'new_item' => __( 'Новый продукт' ),
'view' => __ («Просмотр продуктов»)
'view_item' => __ ('Просмотр продукта'),
'search_items' => __ («Поиск продуктов»),
'not_found' => __ («Не найдено продуктов»),
'not_found_in_trash' => __ («Нет продуктов, найденных в корзине»),
'parent' => __ («Родительский продукт»),
),
'description' => __ («Здесь вы можете создавать новые продукты на своем сайте».)
'public' => правда,
'show_ui' => правда,
'capability_type' => 'после',
'publicly_queryable' => правда,
'exclude_from_search' => ложный,
'menu_position' => 2,
'menu_icon' => get_stylesheet_directory_uri (). '/images/tag_orange.png',
«Иерархический» => правда,
'_builtin' => false, //Это настраиваемый тип сообщения, а не встроенный!
'rewrite' => array ('slug' => 'products', 'with_front' => true),
'query_var' => правда,
'поддерживает' => массив ('title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions'),
));
//вставляем в действие init и вызываем create_book_taxonomies, когда он срабатывает
add_action ('init', 'create_product_taxonomies', 0);
//add_action ('admin_init', 'flush_rewrite_rules');
//создаем две таксономии, жанры и писатели для типа "книга"
function create_product_taxonomies () {
//Добавьте новую таксономию, сделайте ее иерархической (например, категории)
$ labels = array (
'name' => _x ('Категории', 'Общее имя таксономии'),
'unique_name' => _x («Категория», «синхронное название таксономии»),
'search_items' => __ («Категории поиска»),
'all_items' => __( 'Все категории' ),
'parent_item' => __ («Родительские категории»),
'parent_item_colon' => __ ('Родительские категории:'),
'edit_item' => __ ('Изменить категорию'),
'update_item' => __ ('Обновить категорию'),
'add_new_item' => __ ('Добавить новую категорию'),
'new_item_name' => __ («Новое название категории»),
'menu_name' => __ («Категория»),
);
register_taxonomy ('product_cat', array ('product_listing'), array (
«Иерархический» => правда,
'labels' => $ этикетки,
'show_ui' => правда,
'query_var' => правда,
//'rewrite' => правда,
'rewrite' => array ('slug' => '% category%', 'with_front' => true),
));
//Добавить новую таксономию, не иерархическую (например, теги)
$ labels = array (
'name' => _x ('Запахи', 'Общее имя таксономии'),
'unique_name' => _x ('Scent', 'таксономия сингулярного имени'),
'search_items' => __ («Аспекты поиска»),
'popular_items' => __ («Популярные ароматы»)
'all_items' => __ («Все запахи»)
'parent_item' => ноль,
'parent_item_colon' => ноль,
'edit_item' => __ ('Редактировать запах'),'update_item' => __ («Обновить запах»),
'add_new_item' => __ ('Добавить новый аромат'),
'new_item_name' => __ («Новое имя запаха»),
'separate_items_with_commas' => __ («Отдельные запахи с запятыми»)
'add_or_remove_items' => __ ('Добавить или удалить ароматы'),
'choose_from_most_used' => __ ('Выберите один из самых используемых ароматов'),
'menu_name' => __ («Запахи»)
);
register_taxonomy ('scent', 'product_listing', array (
«Иерархический» => ложный,
'labels' => $ этикетки,
'show_ui' => правда,
'query_var' => правда,
//'rewrite' => array ('slug' => 'scents'),
));
}
У меня также есть еще одна пользовательская таксономия scents
, в которой я хотел бы иметь какой-то дружелюбный URL-адрес, но я более откровенен в этом. Я хотел бы получить доступ к списку всех ароматов, перейдя в mysite.com/products/scents
, но они не обязательно должны быть категории.
Может кто-нибудь мне помочь?
5 ответов
Измените slug
в аргументах типа post на products /% product_cat%
и slug
в ваших аргументах таксономии только для продуктов
, затем очистите свои правила перезаписи. Теперь WordPress должен обрабатывать /products /my-product-cat /post-name /
!
Теперь, наконец, нам нужно немного помочь WordPress с генерацией постоянных ссылок (из коробки он не будет распознавать тег permastruct % product_cat%
):
/**
* Inject term slug в настраиваемый тип шрифта post.
*
* @link http://wordpress.stackexchange.com/a/5313/1685
*
* @param string $ link
* @param WP_Post $ post
* @return array
* /
function wpse_5308_post_type_link ($ link, $ post) {
if ($ post-> post_type === 'product_listing') {
if ($ terms = get_the_terms ($ post-> ID, 'product_cat'))
$ link = str_replace ('% product_cat%', current ($ terms) -> slug, $ link);
}
return $ link;
}
add_filter ('post_type_link', 'wpse_5308_post_type_link', 10, 2);
Следует отметить, что это просто возьмет первую категорию продукта за пост , упорядоченный по имени . Если вы назначаете несколько категорий для одного продукта, я могу легко изменить, как он определяет, какой из них использовать в постоянной ссылке.
Lemme знает, как вы справляетесь с этим, и мы можем решить другие проблемы!
Спасибо @ TheDeadMechanic, ваш ответ помог мне, но только частично. Я хотел сделать то же самое, о чем просил RodeoRamsey, но с вложенными категориями (например: mysite.com/products/category1/child-category-1/grandchild-category-1/product-name
) и ваше решение не сработало для этого.
Наконец-то я придумал расширенное решение моего вопроса, который работает, поэтому, если кому-то еще нужны вложенные категории /подкатегории, вы можете увидеть подробное решение по моему собственному вопросу. Надеюсь, что это поможет другим, и спасибо за начальные шаги.
Я не уверен, что wp поддерживает эту структуру из коробки, но вы можете легко создать свои собственные правила перезаписи для этого.
Ознакомьтесь с предыдущим ответом здесь Автор url переписать .
Вы можете изменить строку
$ newrules ['author /([^ /] +) /songs /? $'] = 'index.php? post_type = songs & author = $ matches [1]';
к чему-то вроде
$ newrules ['products /([^ /] +) /([^ /] +) /? $'] = 'index.php? post_type = product_listing & product_cat = $ matches [1] & ; имя = $ соответствует [2];
часть product_cat здесь может быть излишней - я не уверен, что это необходимо.
Вы можете добавить любые правила, которые вам нравятся, и они будут иметь приоритет над встроенными.
Да, это сводило меня с ума, прежде чем устанавливать постоянную ссылку для пользовательского типа сообщения. Я нашел плагин для обработки настраиваемого типа сообщений. Он очень прост в использовании. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP должен добавить это как основную функцию! Лео
На самом деле, это довольно легко. Вам просто нужна одна строка. Вот мой код
функция create_product_taxonomies () { //Добавьте новую таксономию, сделайте ее иерархической (например, категории) $ labels = array ( 'name' => _x ('Категории', 'Общее имя таксономии'), 'unique_name' => _x («Категория», «синхронное название таксономии»), 'search_items' => __ («Категории поиска»), 'all_items' => __('Все категории'), 'parent_item' => __ («Родительские категории»), 'parent_item_colon' => __ ('Родительские категории:'), 'edit_item' => __ ('Изменить категорию'), 'update_item' => __ ('Обновить категорию'), 'add_new_item' => __ ('Добавить новую категорию'), 'new_item_name' => __ («Новое название категории»), 'menu_name' => __ ( 'Category'), ); register_taxonomy ('product_cat', array ('product_listing'), array ( «Иерархический» => правда, 'labels' => $ этикетки, 'show_ui' => правда, 'query_var' => правда, 'rewrite' => array ('hierarchical' => true), ));
И применительно к сгенерированной таксономии для моих отзывов CPT от GenerateWP.com. Я использую это на своем собственном сайте WordPress, https://www.wpstarters.com
function reviews_category_taxonomy () { $ labels = array ( 'name' => _x ('Обзоры категорий', 'Общее имя таксономии', 'reviews_category'), 'unique_name' => _x ('Reviews Category', 'Taxonomy Singular Name', 'reviews_category'), 'menu_name' => __ ('Reviews Category', 'reviews_category'), 'all_items' => __ ('Все категории обзора', 'reviews_category'), 'parent_item' => __ («Категория просмотра родителя», «reviews_category»), 'parent_item_colon' => __ ('Родительский обзор Категория:', 'reviews_category'), 'new_item_name' => __ ('Новое название категории обзора', 'reviews_category'), 'add_new_item' => __ ('Добавить новую категорию обзора', 'reviews_category'), 'edit_item' => __ ('Изменить категорию обзора', 'reviews_category'), 'update_item' => __ ('Обновить категорию обзора', 'reviews_category'), 'view_item' => __ ('Просмотр категории обзора', 'reviews_category'), 'separate_items_with_commas' => __ («Отдельные элементы с запятыми», «reviews_category») 'add_or_remove_items' => __ ('Добавить или удалить элементы', 'reviews_category'), 'choose_from_most_used' => __ ('Выберите из наиболее используемых', 'reviews_category'), 'popular_items' => __ ('Популярные категории обзора', 'reviews_category'), 'search_items' => __ ('Поиск предметов', 'reviews_category'), 'not_found' => __ ('Not Found', 'reviews_category'), 'no_terms' => __ ('Нет категорий обзора', 'reviews_category'), 'items_list' => __ ('Список категорий категорий', 'reviews_category'), 'items_list_navigation' => __ ('Обзор категорий навигации списка', 'reviews_category'), ); $ args = array ( 'labels' => $ этикетки, «Иерархический» => правда, 'public' => правда, 'show_ui' => правда, 'show_admin_column' => правда, 'show_in_nav_menus' => правда, 'show_tagcloud' => ложный, 'show_in_rest' => правда, 'rewrite' => array ('hierarchical' => true), ); register_taxonomy ('reviews_category', array ('wps_reviews'), $ args); } add_action ('init', 'reviews_category_taxonomy', 0);
Все, что вам нужно, так что поставьте 'rewrite' => array ('hierarchical' => true),