Спеціальні типи публікацій, таксономії та постійні посилання


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але вони не повинні бути конкретними категоріями.

Хтось може мені допомогти?

Відповіді:


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 );

Варто зазначити, що це просто захопить першу категорію продуктів для посади, упорядкованої по імені . Якщо ви присвоюєте кілька категорій одному продукту, я можу легко змінити, як він визначає, яку з них використовувати в постійній посилання.

Лемме знаємо, як ти в цьому справи, і ми можемо вирішити інші проблеми!


О Я Я в захваті! Це РОБОТИ! Нарешті! Я ніколи не думав, що нічого б !!! велике спасибі SOOOOOO !!! ............ Тепер, як би я створив посилання (щось на зразок the_permalink), щоб самостійно схопити URL-адресу таксономії? / товари / мій продукт-кот /
RodeoRamsey

Я думаю, що це я опрацював ^^^ ............ але тепер я застряг на Пагинації. Здається, зламається при використанні будь-якої сторінки розширення (користувацька функція або вбудований) як / products / my-product-cat / виглядає нормально, але / products / my-product-cat / page / 2 / повертає файл 404 і скидає файл таксономії.php у користь файлу index.php. Я спробував усе, що міг знайти, і все ще нічого.
RodeoRamsey

1
Чи можете ви змінити перезапис одного продукту на product/cat-name/product-name? (зверніть увагу на особливість) Проблема в тому, що правило переписання для таксономії розбиття сторінок не спрацьовує, тому що воно потрапляє в попереднє правило для окремих продуктів!
TheDeadMedic

Я відкритий для цього. Але якщо обернути мою голову, чи означає це, що продукти мають інший шлях до URL-адреси, якщо ви переглядаєте одну сторінку продукту та сторінку "категорії"? Таким чином, єдиним буде продукт / ім'я кота / ім'я продавця, але коти будуть продуктами / котяче ім'я / ? Хіба це не поразка з метою "доброзичливих до людини" адрес? Мені важко допомагати своїм клієнтам дізнатись панель керування wp, не кажучи вже про цю різницю ... Якщо я нерозумію, будь ласка, повідомте мене! Я також може бути задоволений відсутністю фронтального каталогу, наприклад 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, це життєздатний варіант? Або я повинен дотримуватися переписувань у файлі function.php?
RodeoRamsey

0

Насправді це досить просто. Вам потрібен лише один рядок. Ось мій код

функція create_product_taxonomies ()
{
// Додайте нову систематику, зробіть її ієрархічною (як категорії)
    $ labels = масив (
        'name' => _x ('Категорії', 'Загальна назва таксономії'),
        'singular_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', масив ('product_listing'), масив (
        'ієрархічний' => правда,
        'мітки' => $ мітки,
        'show_ui' => вірно,
        'query_var' => вірно,
        'rewrite' => масив ('ієрархічний' => true),
    ));

І застосовано до створеної систематики для моїх оглядів CPT від GenerateWP.com. Я використовую це на власному веб-сайті WordPress https://www.wpstarters.com

функція огляд_категорія_таксономія () {

    $ labels = масив (
        'name' => _x ('Категорії відгуків', 'Загальна назва таксономії', 'відгуки_категорії'),
        'singular_name' => _x ('Категорія відгуків', 'Сингулярне ім'я таксономії', 'Відгуки_категорії'),
        'menu_name' => __ ("Категорія відгуків", "відгуки_категорія"),
        'all_items' => __ ("Усі категорії оглядів", "відгуки_категорії"),
        'parent_item' => __ ("Категорія батьківського огляду", "відгуки_категорія"),
        'parent_item_colon' => __ ('Категорія батьківського огляду:', 'відгуки_категорії'),
        'new_item_name' => __ ("Нова назва категорії огляду", "відгуки_категорії"),
        'add_new_item' => __ ("Додати нову категорію оглядів", "відгуки_категорії"),
        'edit_item' => __ ('Редагувати категорію огляду', 'огляди_категорії'),
        'update_item' => __ ('Оновити категорію огляду', 'огляди_категорії'),
        'view_item' => __ ('Переглянути категорію огляду', 'відгуки_категорії'),
        'sepa_items_with_commas' => __ ("Окремі елементи з комами", "Відгуки_категорії"),
        'add_or_remove_items' => __ ('Додати або видалити елементи', 'reviews_category'),
        'select_from_most_used' => __ ('Виберіть із найбільш використовуваних', 'reviews_category'),
        'popular_items' => __ ("Популярні категорії оглядів", "Відгуки_категорія"),
        'search_items' => __ ('Пошукові об'єкти', 'відгуки_категорії'),
        'not_found' => __ ('Не знайдено', 'Відгуки_категорія'),
        'no_terms' => __ ('Без категорій огляду', 'відгуки_категорії'),
        'items_list' => __ ('Список категорій огляду', 'відгуки_категорії'),
        'items_list_navigation' => __ ('Навігація зі списку категорій переглядів', 'відгуки_категорії'),
    );
    $ args = масив (
        'мітки' => $ мітки,
        'ієрархічний' => правда,
        'public' => правда,
        'show_ui' => вірно,
        'show_admin_column' => вірно,
        'show_in_nav_menus' => правда,
        'show_tagcloud' => помилково,
        'show_in_rest' => вірно,
        'rewrite' => масив ('ієрархічний' => true),
    );
    register_taxonomy ('reviews_category', array ('wps_reviews'), $ args);

}
добавлення ('init', 'reviews_category_taxonomy', 0);

Все, що вам потрібно, покладіть масив 'rewrite' => ('hierarchical' => true),

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.