Các loại bài đăng tùy chỉnh, phân loại và permalinks


62

Điều này đang khiến tôi phát điên và tôi chắc chắn nó đơn giản nhưng không có gì tôi tìm kiếm được với một cấu trúc đơn giản (mọi thứ đều rất phức tạp).

Tôi có một loại bài đăng tùy chỉnh product_listingvà phân loại tùy chỉnh của product_cat(đó là phân cấp và nên có thể loại như).

Tôi chỉ đơn giản muốn các URL của mình trông như thế này:

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2

Nhưng đối với cuộc sống của tôi, bất kể tôi làm gì, tôi đang gặp phải vấn đề 404 đáng sợ. Các trang hoạt động tốt và Bài viết hoạt động tốt nhưng các bài đăng tùy chỉnh của tôi không hoạt động chính xác. Họ đang hiển thị như:

mysite.com/products/product-name1
mysite.com/products/product-name2

Mà thực sự hoạt động ! Chỉ là tôi muốn thấy phân loại tùy chỉnh của mình trong đó cộng với tôi muốn có thể truy cập vào taxonomy.phpmẫu mà tôi đã thiết lập bằng cách truy cập:

mysite.com/products/category1/
mysite.com/products/category2/

Không có con sên nào của tôi giống nhau, tôi cũng không muốn chúng giống như vậy. Đây là loại bài đăng và phần phân loại trong functions.phptệp của tôi :

///// 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' ),
    ) );
}

Tôi cũng có một phân loại tùy chỉnh khác về scentslý tưởng mà tôi muốn có một số loại url thân thiện nhưng tôi cởi mở hơn về điều này. Tôi muốn truy cập danh sách tất cả các mùi hương bằng cách truy cập mysite.com/products/scentsnhưng chúng không phải là danh mục cụ thể.

Ai có thể giúp tôi?

Câu trả lời:


63

Thay đổi slugcác đối số loại bài đăng của bạn thành products/%product_cat%slugtrong các đối số phân loại của bạn thành chỉ products, sau đó xóa các quy tắc viết lại của bạn. WordPress nên xử lý ngay /products/my-product-cat/post-name/!

Cuối cùng, chúng ta cần giúp WordPress một chút với việc tạo permalinks (ngoài hộp, nó sẽ không nhận ra thẻ 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 );

Một điều cần lưu ý, điều này sẽ chỉ lấy danh mục sản phẩm đầu tiên cho bài đăng theo thứ tự tên . Nếu bạn đang chỉ định nhiều danh mục cho một sản phẩm, tôi có thể dễ dàng thay đổi cách xác định danh mục nào sẽ sử dụng trong permalink.

Hãy biết làm thế nào bạn có được điều này, và chúng tôi có thể giải quyết các vấn đề khác!


Ôi, tôi đang kinh ngạc! Điều này làm việc! Cuối cùng! Tôi đã không bao giờ nghĩ bất cứ điều gì sẽ !!! cảm ơn SOOOOOO nhiều !!! ............ Bây giờ, làm cách nào tôi có thể tạo một liên kết (giống như the_permalink) để tự mình lấy url phân loại? / sản phẩm / my-sản phẩm-mèo /
RodeoRamsey

Tôi nghĩ rằng tôi đã giải quyết được điều đó ^^ ^ ............ nhưng bây giờ tôi bị mắc kẹt trên Pagination. Có vẻ bị hỏng khi sử dụng bất kỳ phân trang nào (chức năng tùy chỉnh hoặc dựng sẵn) dưới dạng / sản phẩm / my-sản phẩm-mèo / có vẻ ổn nhưng / sản phẩm / my-sản phẩm-mèo / trang / 2 / trả về 404 và thả tệp taxonomy.php ủng hộ tập tin index.php. Tôi đã thử mọi thứ tôi có thể tìm thấy và vẫn không có gì.
RodeoRamsey

1
Bạn có muốn thay đổi viết lại sản phẩm duy nhất thành product/cat-name/product-name? (lưu ý điểm kỳ dị) Vấn đề là quy tắc viết lại cho phân trang phân loại không được kích hoạt, bởi vì nó bị bắt bởi một quy tắc trước đó cho các sản phẩm đơn lẻ!
TheDeadMedic

Tôi mở cho nó. Nhưng để xoay quanh nó, điều đó có nghĩa là các sản phẩm sẽ có đường dẫn URL khác nếu bạn đang xem một trang sản phẩm so với trang 'danh mục'? Vì vậy, độc thân sẽ là sản phẩm / tên mèo / tên prod nhưng mèo sẽ là sản phẩm / tên mèo / ? Điều đó có làm thất bại mục đích của các url "thân thiện với con người" không? Tôi có một thời gian khó khăn để giúp khách hàng của mình tìm hiểu bảng điều khiển wp chứ đừng nói đến sự khác biệt đó ... Nếu tôi hiểu nhầm xin vui lòng cho tôi biết! Tôi cũng có thể hài lòng với KHÔNG thư mục phía trước, chẳng hạn như sản phẩm-cat / sản phẩm-nam và chỉ sản phẩm-cat / . Có thể làm việc đó?
RodeoRamsey

2
Bạn hiểu rồi - mặc dù tôi nói nó "thân thiện với con người", vì có sự phân biệt rõ ràng giữa tài liệu lưu trữ ( products/) và số ít ( product/). Và không, tôi sẽ giữ 'thư mục phía trước' - nó giúp phân biệt rõ ràng với các bài đăng và trang, cộng với nếu không bạn có thể gặp phải các vấn đề về hiệu suất (ví dụ: quy tắc viết lại dài dòng).
TheDeadMedic

6

Cảm ơn @TheDeadMechanic, câu trả lời của bạn đã giúp tôi, nhưng chỉ một phần. Tôi muốn làm điều tương tự @RodeoRamsey yêu cầu, nhưng với các danh mục lồng nhau (ví dụ mysite.com/products/category1/child-category-1/grandchild-category-1/product-name:) và giải pháp của bạn không hoạt động cho điều đó.

Cuối cùng tôi đã đưa ra một giải pháp mở rộng cho câu hỏi của mình có hiệu quả, vì vậy nếu bất kỳ ai khác cần các danh mục / danh mục con lồng nhau, bạn có thể thấy một giải pháp chi tiết cho câu hỏi của riêng tôi. Hy vọng nó sẽ giúp người khác, và cảm ơn cho các bước ban đầu.


4

Tôi không chắc wp hỗ trợ cấu trúc đó ra khỏi hộp - nhưng bạn có thể dễ dàng tạo quy tắc viết lại của riêng mình để làm như vậy.

Kiểm tra một câu trả lời trước đây ở đây Tác giả viết lại url .

Bạn có thể thay đổi dòng

$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';

đến một cái gì đó như

$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';

phần sản phẩm ở đây có thể là không cần thiết - tôi không chắc có cần thiết không.

Bạn có thể thêm bất kỳ quy tắc nào bạn thích và chúng sẽ được ưu tiên hơn các quy tắc sẵn có.


Chà điều đó không thú vị. Oh boy, tôi nghĩ rằng các quy tắc viết lại tùy chỉnh là ngoài tôi. Tôi đã thử đoạn mã trên (và phần còn lại của nó từ bài đăng khác) và không có gì thay đổi. Tôi đã xóa tất cả mọi thứ và sau đó thử lại mà vẫn không thay đổi, vì vậy tôi đã nhận xét tất cả các quy tắc viết lại được đặt trong các loại bài đăng và phân loại tùy chỉnh và tuôn ra và VẪN không có gì.
RodeoRamsey

2

Vâng, nó đã khiến tôi phát điên trước khi đặt permalink cho loại bài đăng tùy chỉnh. Tôi tìm thấy một plugin để xử lý loại bài tùy chỉnh. Nó rất dễ sử dụng. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP nên thêm tính năng này làm tính năng cốt lõi! Sư Tử


Tôi đã thấy cái này trước đây và không sử dụng nó bởi vì nó nói "cho các nguyên tắc phân loại" không phân cấp ". Tôi đã có một cái được thiết lập theo thứ bậc nên tôi không nghĩ nó sẽ hoạt động, nhưng cho đến nay, nó dường như đã thực hiện được mánh khóe! Thêm vào đó, nó dường như đang làm việc để hoàn thành / sản phẩm / tên mèo / tên sản phẩm / cấu trúc mà tôi đang cố gắng đạt được (xem bình luận cho câu trả lời khác). @TheDeadMedic, đây có phải là một lựa chọn khả thi không? Hoặc tôi có nên gắn bó với các ghi lại trong tệp tin.php không?
RodeoRamsey

0

Thật ra, nó khá dễ. Bạn chỉ cần một dòng. Đây là mã của tôi

hàm created_product_taxonomies ()
{
// Thêm phân loại mới, làm cho nó phân cấp (như thể loại)
    $ nhãn = mảng (
        'name' => _x ('Thể loại', 'tên chung phân loại'),
        'singular_name' => _x ('Danh mục', 'tên số ít phân loại'),
        'search_items' => __ ('Danh mục tìm kiếm'),
        'all_items' => __ ('Tất cả danh mục'),
        'Parent_item' => __ ('Danh mục phụ huynh'),
        'Parent_item_colon' => __ ('Danh mục phụ huynh:'),
        'edit_item' => __ ('Chỉnh sửa danh mục'),
        'update_item' => __ ('Danh mục cập nhật'),
        'add_new_item' => __ ('Thêm danh mục mới'),
        'new_item_name' => __ ('Tên danh mục mới'),
        'menu_name' => __ ('Danh mục'),
    );

    register_taxonomy ('sản phẩm_cat', mảng ('sản phẩm_listing'), mảng (
        'phân cấp' => đúng,
        'nhãn' => $ nhãn,
        'show_ui' => đúng,
        'query_var' => đúng,
        'viết lại' => mảng ('phân cấp' => đúng),
    ));

Và áp dụng cho phân loại được tạo cho CPT Nhận xét của tôi từ GenerateWP.com. Tôi đang sử dụng trang này trên trang web WordPress của riêng tôi, https://www.wpstarters.com

chức năng review_carget_taxonomy () {

    $ nhãn = mảng (
        'name' => _x ('Danh mục đánh giá', 'Tên chung phân loại', 'review_carget'),
        'singular_name' => _x ('Đánh giá danh mục', 'Tên phân loại đơn', 'review_carget'),
        'menu_name' => __ ('Đánh giá danh mục', 'review_carget'),
        'all_items' => __ ('Tất cả danh mục đánh giá', 'review_carget'),
        'Parent_item' => __ ('Danh mục đánh giá của phụ huynh', 'review_carget'),
        'Parent_item_colon' => __ ('Danh mục đánh giá của phụ huynh:', 'review_carget'),
        'new_item_name' => __ ('Tên danh mục đánh giá mới', 'review_carget'),
        'add_new_item' => __ ('Thêm danh mục đánh giá mới', 'review_carget'),
        'edit_item' => __ ('Chỉnh sửa danh mục đánh giá', 'review_carget'),
        'update_item' => __ ('Cập nhật danh mục đánh giá', 'review_carget'),
        'view_item' => __ ('Xem danh mục đánh giá', 'review_carget'),
        'riêng_items_with_commas' => __ ('Các mục riêng biệt bằng dấu phẩy', 'review_carget'),
        'add_or_remove_items' => __ ('Thêm hoặc xóa các mục', 'review_carget'),
        'select_from_ Maximum_use' => __ ('Chọn từ những thứ được sử dụng nhiều nhất', 'review_carget'),
        'common_items' => __ ('Danh mục đánh giá phổ biến', 'review_carget'),
        'search_items' => __ ('Mục tìm kiếm', 'review_carget'),
        'not_found' => __ ('Không tìm thấy', 'review_carget'),
        'no_terms' => __ ('Không có danh mục đánh giá', 'review_carget'),
        'items_list' => __ ('Danh sách danh mục đánh giá', 'review_carget'),
        'items_list_navulation' => __ ('Đánh giá danh mục điều hướng danh sách', 'review_carget'),
    );
    $ args = mảng (
        'nhãn' => $ nhãn,
        'phân cấp' => đúng,
        'công khai' => đúng,
        'show_ui' => đúng,
        'show_admin_column' => đúng,
        'show_in_nav_menus' => đúng,
        'show_tagcloud' => sai,
        'show_in_rest' => đúng,
        'viết lại' => mảng ('phân cấp' => đúng),
    );
    register_taxonomy ('review_carget', mảng ('wpsć'), $ args);

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

Tất cả những gì bạn cần là vậy, hãy đặt 'viết lại' => mảng ('phân cấp' => đúng),

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.