Post type và taxonomy có slug giống nhau

Cập nhật lần cuối vào

Nếu bạn muốn chuyên mục của custom taxonomy có slug trên đường dẫn giống với bài viết trong custom post type mà không bị lỗi 404 thì bài viết này mình sẽ hướng dẫn cho bạn làm điều đó. Việc này sẽ khó nếu như bạn không biết code PHP và WordPress, nhưng nó sẽ dễ hơn nếu như bạn đã biết căn bản trước đó.

Lấy tất cả post type và post ra trang chủ

Trước khi bắt tay vào công việc thì mình xin ghi chú với các bạn rằng, để chức năng này hoạt động thì bạn phải sử dụng đường dẫn đẹp cho WordPress, nghĩa là phải sử dụng tính năng rewrite chứ không phải dùng kiểu permalink mặc định. Bạn phải biết code PHP căn bản cũng như code WordPress, bạn phải biết tự chỉnh sửa giao diện hoặc thêm code vào chỗ nào đó mà blog có thể hoạt động được.

Tạo custom post type và custom taxonomy

Dĩ nhiên, bạn phải tạo custom post typecustom taxonomy trước. Trong yêu cầu của ví dụ này, mình sẽ tạo custom post type là product, sau đó tạo custom taxonomy là product_cat nhưng có chung slug với product chứ không phải slug riêng của chuyên mục. Đường dẫn của post type và taxonomy của bạn sẽ giống như sau:

http://domain.com/product/
http://domain.com/product/ram/
http://domain.com/product/cpu/
http://domain.com/product/mainboard/

Bạn mở tập tin functions.php của giao diện lên hoặc bất kỳ tập tin .php nào khác trong giao diện hoặc plugin. Sau đó thêm đoạn code tạo post type và taxonomy mới.

function hocwp_create_post_types_and_taxonomies() {
    register_post_type('product', array(
        'labels' => array(
            'name' => 'Products'
        ),
        'public' => true
    ));

    register_taxonomy('product_cat', array('product'), array(
        'labels' => array(
            'name' => 'Product Categories'
        ),
        'hierarchical' => true,
        'rewrite' => array('slug' => 'product')
    ));
}
add_action('init', 'hocwp_create_post_types_and_taxonomies');

Bạn chú ý tên của post type phải trùng với slug của taxonomy nhé. Nếu bạn làm khác thì sẽ không được, điều này rất quan trọng cho các bước phía dưới.

function hocwp_taxonomy_slug_rewrite($wp_rewrite) {
    $rules = array();
    $taxonomies = get_taxonomies(array('_builtin' => false), 'objects');
    $post_types = get_post_types(array('public' => true, '_builtin' => false), 'objects');
    foreach($post_types as $post_type) {
        foreach($taxonomies as $taxonomy) {
            foreach($taxonomy->object_type as $object_type) {
                if($object_type == $post_type->rewrite['slug']) {
                    $terms = get_categories(array('type' => $object_type, 'taxonomy' => $taxonomy->name, 'hide_empty' => 0));
                    foreach($terms as $term) {
                        $rules[$object_type . '/' . $term->slug . '/?$'] = 'index.php?' . $term->taxonomy . '=' . $term->slug;
                    }
                }
            }
        }
    }
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'hocwp_taxonomy_slug_rewrite');

Bạn tiếp tục chèn đoạn code bên trên vào bên dưới đoạn code trước đó, nhiệm vụ của đoạn code này là kiểm tra và thay đổi đường dẫn của chuyên mục để không gặp lỗi 404.

Custom post type và custom taxonomy trong WordPress

Sau khi thực hiện xong thì bạn nhớ lưu lại, và vào cập nhật lại permalink để hệ thống lưu rewrite rules của bạn vừa tạo. Như vậy là bạn đã có thể tạo được chuyên mục và post type có slug giống nhau. Chúc bạn thành công.