Пользовательские типы сообщений, таксономии и постоянные ссылки

Это сводит меня с ума, и я уверен, что это просто, но ничего, что я ищу, придумывает простую структуру (все очень сложно).

У меня есть пользовательский тип сообщения 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, но они не обязательно должны быть категории.

Может кто-нибудь мне помочь?

60 голосов | спросил RodeoRamsey 14 TueEurope/Moscow2010-12-14T02:56:21+03:00Europe/Moscow12bEurope/MoscowTue, 14 Dec 2010 02:56:21 +0300 2010, 02:56:21

5 ответов


60

Измените 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 знает, как вы справляетесь с этим, и мы можем решить другие проблемы!

ответил TheDeadMedic 14 TueEurope/Moscow2010-12-14T04:50:16+03:00Europe/Moscow12bEurope/MoscowTue, 14 Dec 2010 04:50:16 +0300 2010, 04:50:16
6

Спасибо @ TheDeadMechanic, ваш ответ помог мне, но только частично. Я хотел сделать то же самое, о чем просил RodeoRamsey, но с вложенными категориями (например: mysite.com/products/category1/child-category-1/grandchild-category-1/product-name) и ваше решение не сработало для этого.

Наконец-то я придумал расширенное решение моего вопроса, который работает, поэтому, если кому-то еще нужны вложенные категории /подкатегории, вы можете увидеть подробное решение по моему собственному вопросу. Надеюсь, что это поможет другим, и спасибо за начальные шаги.

ответил Jeff 23 Jpm1000000pmMon, 23 Jan 2012 22:39:23 +040012 2012, 22:39:23
4

Я не уверен, что 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 здесь может быть излишней - я не уверен, что это необходимо.

Вы можете добавить любые правила, которые вам нравятся, и они будут иметь приоритет над встроенными.

ответил Chris 14 TueEurope/Moscow2010-12-14T03:07:03+03:00Europe/Moscow12bEurope/MoscowTue, 14 Dec 2010 03:07:03 +0300 2010, 03:07:03
2

Да, это сводило меня с ума, прежде чем устанавливать постоянную ссылку для пользовательского типа сообщения. Я нашел плагин для обработки настраиваемого типа сообщений. Он очень прост в использовании. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP должен добавить это как основную функцию! Лео

ответил 14 TueEurope/Moscow2010-12-14T13:13:59+03:00Europe/Moscow12bEurope/MoscowTue, 14 Dec 2010 13:13:59 +0300 2010, 13:13:59
0

На самом деле, это довольно легко. Вам просто нужна одна строка. Вот мой код

функция 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),

ответил Leo Koo 6 WedEurope/Moscow2017-12-06T22:15:00+03:00Europe/Moscow12bEurope/MoscowWed, 06 Dec 2017 22:15:00 +0300 2017, 22:15:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132