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

62

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

У меня есть собственный тип записи 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 the new post type
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Products' ),
        'singular_name'      => __( 'Product' ),
        'add_new'            => __( 'Add New' ),
        'add_new_item'       => __( 'Create New Product' ),
        'edit'               => __( 'Edit' ),
        'edit_item'          => __( 'Edit Product' ),
        'new_item'           => __( 'New Product' ),
        'view'               => __( 'View Products' ),
        'view_item'          => __( 'View Product' ),
        'search_items'       => __( 'Search Products' ),
        'not_found'          => __( 'No products found' ),
        'not_found_in_trash' => __( 'No products found in trash' ),
        'parent'             => __( 'Parent Product' ),
    ),
    'description'           => __( 'This is where you can create new products on your site.' ),
    'public'                => true,
    'show_ui'               => true,
    'capability_type'       => 'post',
    'publicly_queryable'    => true,
    'exclude_from_search'   => false,
    'menu_position'         => 2,
    'menu_icon'             => get_stylesheet_directory_uri() . '/images/tag_orange.png',
    'hierarchical'          => true,
    '_builtin'              => false, // It's a custom post type, not built in!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name'              => _x( 'Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
        'search_items'      =>  __( 'Search Categories' ),
        'all_items'         => __( 'All Categories' ),
        'parent_item'       => __( 'Parent Categories' ),
        'parent_item_colon' => __( 'Parent Categories:' ),
        'edit_item'         => __( 'Edit Category' ), 
        'update_item'       => __( 'Update Category' ),
        'add_new_item'      => __( 'Add New Category' ),
        'new_item_name'     => __( 'New Category Name' ),
        'menu_name'         => __( 'Category' ),
    );  

    register_taxonomy( 'product_cat', array( 'product_listing' ), array(
        'hierarchical'  => true,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => true,
        'rewrite'       => array( 'slug' => '%category%', 'with_front' => true ),
    ) );

    // Add new taxonomy, NOT hierarchical (like tags)
    $labels = array(
        'name'                       => _x( 'Scents', 'taxonomy general name' ),
        'singular_name'              => _x( 'Scent', 'taxonomy singular name' ),
        'search_items'               =>  __( 'Search Scents' ),
        'popular_items'              => __( 'Popular Scents' ),
        'all_items'                  => __( 'All Scents' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Edit Scent' ), 
        'update_item'                => __( 'Update Scent' ),
        'add_new_item'               => __( 'Add New Scent' ),
        'new_item_name'              => __( 'New Scent Name' ),
        'separate_items_with_commas' => __( 'Separate scents with commas' ),
        'add_or_remove_items'        => __( 'Add or remove scents' ),
        'choose_from_most_used'      => __( 'Choose from the most used scents' ),
        'menu_name'                  => __( 'Scents' ),
    ); 

    register_taxonomy( 'scent', 'product_listing', array(
        'hierarchical'  => false,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => array( 'slug' => 'scents' ),
    ) );
}

У меня также есть другая специальная таксономия, в scentsкоторой я бы хотел иметь какой-нибудь дружественный URL, но я более открыт в этом. Я хотел бы получить доступ к списку всех ароматов, перейдя на страницу, mysite.com/products/scentsно они не обязательно должны быть специфичны для конкретной категории.

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

RodeoRamsey
источник

Ответы:

63

Измените slugаргументы типа записей на products/%product_cat%, а slugв аргументах таксономии - просто products, а затем сбросьте правила перезаписи. WordPress теперь должен обрабатывать /products/my-product-cat/post-name/!

Теперь, наконец, нам нужно немного помочь WordPress с генерацией постоянных ссылок (из коробки он не распознает тег permastruct %product_cat%):

/**
 * Inject term slug into custom post type permastruct.
 * 
 * @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 );

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

Позвольте мне знать, как вы справляетесь с этим, и мы можем решить другие вопросы!

TheDeadMedic
источник
Ух ты, я в восторге! Это работало! В заключение! Я никогда не думал, что что-нибудь будет !!! большое спасибо SOOOOOO !!! ............ Теперь, как мне сгенерировать ссылку (что-то вроде the_permalink) для самостоятельного получения URL-адреса таксономии? / products / my-product-cat /
RodeoRamsey
Я думаю, у меня получилось, что ^^^ ............ но теперь я застрял на нумерации страниц. Кажется, ломается при использовании любой нумерации страниц (пользовательская функция или встроенная функция), поскольку / products / my-product-cat / выглядит нормально, но / products / my-product-cat / page / 2 / возвращает 404 и удаляет файл taxonomy.php в пользу файла index.php. Я перепробовал все, что смог найти и до сих пор ничего.
RodeoRamsey
1
Рассматриваете ли вы возможность замены одного продукта на новые product/cat-name/product-name? (обратите внимание на особенность) Проблема в том, что правило перезаписи таксономии не запускается, потому что оно попадает под действие более раннего правила для отдельных продуктов!
TheDeadMedic
Я открыт для этого. Но, если подумать, значит ли это, что у продуктов будет другой путь URL, если вы просматриваете страницу с одним продуктом и страницу с категорией? Таким образом, один будет product / cat-name / prod-name, а кошки будут product / cat-name / ? Разве такого рода поражение не будет целью "дружественных человеку" URL? Мне трудно помогать моим клиентам изучать wp dashboard, не говоря уже об этой разнице ... Если я неправильно понимаю, пожалуйста, дайте мне знать! Я мог бы также быть счастливым без фронт-каталога, такого как product-cat / product-nam и просто product-cat / . Может ли это работать?
RodeoRamsey
2
Вы получили это - хотя я бы сказал , что это «человек дружелюбный», так как существует четкое различие между архивами ( products/) и особые элементы ( product/). И нет, я бы оставил «передний каталог» - он помогает четко отличать посты и страницы, в противном случае у вас могут возникнуть проблемы с производительностью (например, подробные правила перезаписи).
TheDeadMedic
6

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

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

Джефф
источник
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]&name=$matches[2]';

часть product_cat здесь может быть излишней - я не уверен, нужна ли она.

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

Крис
источник
Ну, это не так интересно. О, мальчик, я думаю, что обычай переписать правила за мной. Я попробовал вышеупомянутый код (и остальную часть этого от другого поста), и ничего не изменилось. Я сбросил все, а затем повторил попытку, но без изменений, так что я закомментировал все правила перезаписи, установленные в пользовательских типах записей и таксономиях, и сбросил и ничего не изменил.
RodeoRamsey
2

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


источник
Я видел это раньше и воздерживался от его использования, потому что он говорил «для неиерархических» таксономий. У меня был один, который был настроен на иерархию, поэтому я не думал, что это сработает, но пока, похоже, все получилось! Кроме того, похоже, что он работает над созданием структуры / products / cat-name / prod-name /, которую я пытался достичь (см. Комментарий к другому ответу). @TheDeadMedic, это жизнеспособный вариант? Или я должен придерживаться переписывает в файле functions.php?
RodeoRamsey
0

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

функция create_product_taxonomies ()
{
// Добавить новую таксономию, сделать ее иерархической (например, категории)
    $ метки = массив (
        'name' => _x ('Категории', 'Общее название таксономии'),
        'singular_name' => _x ('Category', 'таксономическое единственное имя'),
        'search_items' => __ ('Поиск по категориям'),
        'all_items' => __ ('Все категории'),
        'parent_item' => __ ('Родительские категории'),
        'parent_item_colon' => __ ('Parent Categories:'),
        'edit_item' => __ ('Редактировать категорию'),
        'update_item' => __ ('Обновить категорию'),
        'add_new_item' => __ ('Добавить новую категорию'),
        'new_item_name' => __ ('Имя новой категории'),
        'menu_name' => __ ('Category'),
    );

    register_taxonomy ('product_cat', массив ('product_listing'), массив (
        'иерархический' => правда,
        'ярлыки' => $ метки,
        'show_ui' => true,
        'query_var' => true,
        'переписать' => массив ('иерархический' => истина),
    ));

И применяется к сгенерированной таксономии для моего CPT Отзывы от GenerateWP.com. Я использую это на моем собственном сайте WordPress, https://www.wpstarters.com

function reviews_category_taxonomy () {

    $ метки = массив (
        'name' => _x ('Категории отзывов', 'Общее название таксономии', 'reviews_category'),
        'singular_name' => _x ('Категория отзывов', 'Таксономия Singular Name', 'reviews_category'),
        'menu_name' => __ ('Reviews Reviews', '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'),
        'Отдельные_сайты_with_commas' => __ ('Разделять элементы запятыми', 'reviews_category'),
        'add_or_remove_items' => __ ('Добавить или удалить элементы', 'reviews_category'),
        'choose_from_most_used' => __ («Выбрать из наиболее часто используемых», «reviews_category»),
        'popular_items' => __ («Категории популярных обзоров», «reviews_category»),
        'search_items' => __ ('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 (
        'ярлыки' => $ метки,
        'иерархический' => правда,
        'public' => true,
        'show_ui' => true,
        'show_admin_column' => true,
        'show_in_nav_menus' => true,
        'show_tagcloud' => false,
        'show_in_rest' => true,
        'переписать' => массив ('иерархический' => истина),
    );
    register_taxonomy ('reviews_category', массив ('wps_reviews'), $ args);

}
add_action ('init', 'reviews_category_taxonomy', 0);

Все, что вам нужно, так что поместите массив «rewrite» => («иерархический» => true),

Лео Ку
источник