ประเภทโพสต์ที่กำหนดเอง taxonomies และ Permalinks


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/

ไม่มีทากของฉันเหมือนกันหรือฉันไม่ต้องการให้มันเป็น นี่คือประเภทโพสต์และ taxonomy ใน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ในอาร์กิวเมนต์ taxonomy ของคุณเป็นเพียงproductsแล้วล้างกฎการเขียนซ้ำของคุณ WordPress ควรจัดการ/products/my-product-cat/post-name/!

ในที่สุดเราต้องช่วย WordPress ด้วยการสร้าง Permalinks (นอกกรอบมันจะไม่รู้จักแท็ก 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 อนุกรมวิธานเองได้อย่างไร / products / my-product-cat /
RodeoRamsey

ฉันคิดว่าฉันได้ผลแล้ว ^^^ ............ แต่ตอนนี้ฉันติดอยู่กับการแบ่งหน้า ดูเหมือนว่าจะแตกเมื่อใช้การแบ่งหน้าใด ๆ (ฟังก์ชั่นที่กำหนดเองหรือ builtin) เป็น / products / my-product-cat / ดูโอเค แต่ / products / my-product-cat / หน้า / 2 / ส่งคืน 404 และวางไฟล์ taxonomy.php ใน ความโปรดปรานของไฟล์ index.php ฉันลองทุกอย่างที่หาแล้วยังไม่เหลืออะไรเลย
RodeoRamsey

1
คุณจะพิจารณาเปลี่ยนผลิตภัณฑ์เดียวเขียนใหม่เพื่อproduct/cat-name/product-name? (สังเกตความแปลกประหลาด) ปัญหาคือกฎการเขียนซ้ำสำหรับการแบ่งหน้าอนุกรมวิธานไม่ได้ถูกกระตุ้นเพราะมันถูกจับโดยกฎก่อนหน้านี้สำหรับผลิตภัณฑ์เดียว!
TheDeadMedic

ฉันเปิดให้มัน แต่เพื่อให้ครอบคลุมหัวของฉันนั่นหมายความว่าผลิตภัณฑ์จะมีเส้นทาง URL ที่แตกต่างกันหากคุณกำลังดูหน้าผลิตภัณฑ์เดียวกับหน้า 'หมวดหมู่' หรือไม่ ดังนั้นซิงเกิลจะเป็นผลิตภัณฑ์ / cat-name / prod-nameแต่แมวจะเป็นผลิตภัณฑ์ / cat-name / ? จะไม่เอาชนะจุดประสงค์ของ URL ที่ "เป็นมิตรของมนุษย์" หรือไม่? ฉันมีเวลาที่ยากลำบากในการช่วยให้ลูกค้าของฉันเรียนรู้ wp dashboard แตกต่างอย่างนั้น ... หากฉันเข้าใจผิดกรุณาแจ้งให้เราทราบ! ฉันยังอาจจะมีความสุขกับไดเรกทอรีด้านหน้า NO เช่นสินค้าแมว / ผลิตภัณฑ์น้ำและเพียงแค่สินค้าแมว / สามารถใช้งานได้
RodeoRamsey

2
คุณได้รับ - แม้ว่าฉันจะบอกว่ามันเป็น "มนุษย์ที่เป็นมิตร" เนื่องจากมีความแตกต่างที่ชัดเจนระหว่างจดหมายเหตุ ( products/) และรายการเอกพจน์ ( product/) และไม่ฉันจะเก็บ 'ไดเรกทอรีด้านหน้า' ไว้ - ช่วยแยกความแตกต่างอย่างชัดเจนจากโพสต์และหน้ารวมทั้งมิฉะนั้นคุณอาจพบปัญหาด้านประสิทธิภาพ (เช่นกฎการเขียนซ้ำแบบ verbose)
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 ที่นี่อาจฟุ่มเฟือย - ฉันไม่แน่ใจว่าจำเป็นหรือไม่

คุณสามารถเพิ่มกฎใด ๆ ที่คุณชอบและพวกเขาจะมีความสำคัญมากกว่าคนที่ inbuilt


ก็ไม่น่าสนใจ โอ้เด็กฉันคิดว่ากฎการเขียนใหม่ที่กำหนดเองอยู่นอกเหนือฉัน ฉันลองโค้ดข้างต้น (และส่วนที่เหลือจากโพสต์อื่น) และไม่มีอะไรเปลี่ยนแปลง ฉันล้างข้อมูลทุกอย่างแล้วลองอีกครั้งและยังคงไม่มีการเปลี่ยนแปลงดังนั้นฉันจึงแสดงความคิดเห็นกฎการเขียนซ้ำทั้งหมดที่ตั้งค่าในประเภทโพสต์ที่กำหนดเองและ taxonomies และล้างและไม่มีอะไรเลย
RodeoRamsey

2

ใช่มันทำให้ฉันบ้าก่อนที่จะตั้งค่าลิงก์สำหรับประเภทโพสต์ที่กำหนดเอง ฉันพบปลั๊กอินเพื่อจัดการประเภทโพสต์ที่กำหนดเอง มันใช้งานง่ายมาก http://wordpress.org/extend/plugins/custom-post-permalinks/ WP ควรเพิ่มสิ่งนี้เป็นคุณสมบัติหลัก! สิงห์


ฉันเคยเห็นสิ่งนี้มาก่อนและงดการใช้เพราะบอกว่า "สำหรับอนุกรมวิธานที่ไม่ใช่แบบลำดับชั้น" ฉันมีหนึ่งชุดที่ถูกกำหนดเป็นลำดับชั้นดังนั้นฉันจึงไม่คิดว่ามันจะใช้งานได้ แต่จนถึงตอนนี้ดูเหมือนว่าจะทำเคล็ดลับแล้ว! นอกจากนี้ดูเหมือนว่าจะทำงานเพื่อให้บรรลุ/ ผลิตภัณฑ์ / cat-name / prod-name /โครงสร้างที่ฉันพยายามบรรลุ (ดูความเห็นต่อคำตอบอื่น ๆ ) @TheDeadMedic นี้เป็นตัวเลือกที่ทำงานได้หรือไม่ หรือฉันควรติดกับ rewrites ในไฟล์ functions.php
RodeoRamsey

0

จริงๆแล้วมันค่อนข้างง่าย คุณต้องการเพียงหนึ่งบรรทัด นี่คือรหัสของฉัน

ฟังก์ชั่น create_product_taxonomies ()
{
// เพิ่มอนุกรมวิธานใหม่ทำให้เป็นลำดับชั้น (เช่นหมวดหมู่)
    $ labels = array (
        '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'), อาร์เรย์ (
        'ลำดับชั้น' => จริง
        'labels' => $ ป้ายกำกับ
        'show_ui' => จริง
        'query_var' => จริง
        'rewrite' => array ('ลำดับชั้น' => จริง)
    ));

และนำไปใช้กับอนุกรมวิธานที่สร้างขึ้นสำหรับรีวิว CPT ของฉันจาก GenerateWP.com ฉันใช้สิ่งนี้ในเว็บไซต์ WordPress ของฉันเองhttps://www.wpstarters.com

ฟังก์ชั่น reviews_category_taxonomy () {

    $ labels = array (
        'name' => _x ('หมวดหมู่คำวิจารณ์', 'ชื่อสามัญอนุกรมวิธาน', 'reviews_category'),
        'singular_name' => _x ('หมวดหมู่คำวิจารณ์', 'ชื่ออนุกรมวิธานอนุกรมวิธาน', 'reviews_category'),
        'menu_name' => __ ('หมวดหมู่คำวิจารณ์', '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'),
        'split_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' => __ ('ไม่พบ', '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' => false
        'show_in_rest' => จริง
        'rewrite' => array ('ลำดับชั้น' => จริง)
    );
    register_taxonomy ('reviews_category', อาร์เรย์ ('wps_reviews'), $ args);

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

เพียงคุณใส่ 'rewrite' => array ('hierarchical' => true)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.