Trộn loại bài tùy chỉnh và cấu trúc viết lại phân loại?


30

Về cơ bản tôi muốn đạt được một thuật ngữ bằng cách sử dụng các loại bài đăng tùy chỉnh và có một số vấn đề thiết lập viết lại theo cách tôi muốn. Tôi muốn nó như thế:

URL bảng chú giải chính: http://example.com/glossary/

Thuật ngữ bắt đầu bằng chữ A : http://example.com/glossary/a/

URL cho một thuật ngữ duy nhất: http://example.com/glossary/a/atomic/

Tôi thực sự đã đạt được điều này bằng cách sử dụng mã dưới đây nhưng tôi chắc chắn rằng đó là một cách rất khó thực hiện và tôi biết nó bị trục trặc ở đâu đó vì các mẫu sai được gọi khi xem các trang. Ngoại trừ http://example.com/glossary/ , trong đó archive-sumo-glossary-term.php được gọi như mong đợi, hai cái còn lại chỉ kích hoạt index.php trong chủ đề của tôi.

Ở đây đi ( functions.phptrong chủ đề):

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => true
        )
    );

    register_taxonomy
    (
        'sumo-glossary-letter',
        'sumo-glossary-term',
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => false
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ($post->post_type == 'sumo-glossary-term')
    {
        $permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
    }
    return $permalink;
}

add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');

Câu trả lời:


30

Bạn luôn có thể ghi đè lên mẫu sẽ được gọi bằng template_includehoặc bộ lọc liên quan, nhưng điều này có thể ẩn các vấn đề sâu hơn với kho lưu trữ tùy chỉnh.

Theo tôi hiểu, bạn muốn sử dụng cấu trúc sau:

  • /glossary/nên là một trang lưu trữ cho tất cả các sumo-glossary-termbài viết
  • /glossary/[letter]/phải là một trang lưu trữ cho các bài đăng có thuật ngữ phân loại [letter]trong sumo-glossary-letterphân loại
  • /glossary/[letter]/[term-name]/nên là một sumo-glossary-termbài cá nhân

Điều này có nghĩa là cái đầu tiên sẽ tải mẫu archive-sumo-glossary-term.php, cái thứ hai sẽ tải taxonomy-sumo-glossary-letter.phpvà cái thứ ba sẽ tải single-sumo-glossary-term.php.

Tôi đã đạt được điều này trong WordPress 3.2 bằng cách đặt rõ ràng sên viết lại phân loại và cả sên viết lại và sên lưu trữ cho loại bài đăng và không có quy tắc viết lại nào khác. Ngoài ra, tôi đã đăng ký phân loại đầu tiên và loại bài đăng sau nó, để đảm bảo các ưu tiên là đúng (nếu không, một URL như /glossary/f/page/2đi đến thuật ngữ thuật ngữ pagethay vì trang 2 của thư chú giải f).

add_action('init', 'create_glossary');
function create_glossary()
{

    register_taxonomy
    (
        'sumo-glossary-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary/%sumo-glossary-letter%',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => 'glossary',
            'taxonomies' => array( 'sumo-glossary-letter' ),
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
        $glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
        $post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
    }
    return $post_link;
}

Tôi sẽ thử điều đó vào ngày mai và xem liệu nó có lừa hay không và quay lại đây. Cảm ơn!
maryonomead

Ok, không chính xác đến ngày mai. Nó hoạt động, gần như hoàn hảo! Cảm ơn bạn! Những gì không làm việc là /glossary/. Cung cấp cho tôi 404 ( archive-sumo-glossary-term.phpđược thiết lập). Có ý kiến ​​gì không? Phải nói rằng tôi bị mắc kẹt với WP 3.0.1 và đó có thể là vấn đề về phiên bản. Phải kiểm tra lại khi tôi có thể nâng cấp. Dù sao, đối với hầu hết các phần nó hoạt động và bây giờ tôi không nhất thiết cần /glossary/và chỉ cần chuyển hướng đến chữ A. Cảm ơn bạn một lần nữa!
maryonomead

này @mary thẩm, tôi có cùng một vấn đề và đưa ra cùng một giải pháp, nhưng lại gặp vấn đề chính xác như vậy - làm thế nào để bạn có được / bảng chú giải để đi đến mẫu archive-glossery.php? Tôi vừa tìm thấy câu trả lời - sử dụng 'has_archive' => 'glossary', thay vì has_archive => true tôi chỉ nhận thấy Jan có câu trả lời như vậy trong câu trả lời của anh ấy, nhưng bạn không có nó theo cách đó trong mã gốc của mình - bạn đã cập nhật phần đó chưa? Nó bắt đầu làm việc cho tôi ngay khi tôi thực hiện thay đổi đó
Jeff

Này Jeff! Có, cập nhật phần đó. Chỉ cần kiểm tra lại, vẫn không hoạt động. Việc cài đặt WordPress trong câu hỏi không phải là cập nhật (3.0.1) vì vậy có lẽ đó vẫn là gốc rễ của vấn đề.
tài chính

Vấn đề tương tự ở đây, sử dụng WP 3.2.1. Vẫn không có giải pháp?
Richard B

0

Cá nhân tôi chưa sử dụng cái này, nhưng cái bạn có thể muốn xem là "add_rewrite_rule"

http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

cũng đừng quên lưu permalinks sau khi bạn thay đổi chúng.


Tôi thực sự sử dụng add_rewrite_rule, chỉ cần cuộn mã của tôi xuống dưới cùng. :-) Nó hoạt động tốt cho đến nay, chỉ có các mẫu sai được gọi với cách làm này.
maryonomead
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.