การผสมประเภทโพสต์ที่กำหนดเองและโครงสร้างการเขียนอนุกรมวิธานใหม่


30

โดยทั่วไปฉันต้องการบรรลุอภิธานศัพท์โดยใช้ประเภทโพสต์ที่กำหนดเองและมีปัญหาบางอย่างในการตั้งค่าการเขียนใหม่ในแบบที่ฉันต้องการ ฉันต้องการแบบนั้น:

URL อภิธานศัพท์หลัก: http://example.com/glossary/

คำศัพท์ที่ขึ้นต้นด้วยตัวอักษรA : http://example.com/glossary/a/

URL สำหรับคำศัพท์คำเดียว: http://example.com/glossary/a/atomic/

ฉันทำได้โดยใช้โค้ดด้านล่าง แต่ฉันแน่ใจว่ามันเป็นวิธีที่น่าอึดอัดใจมากที่จะทำมันและฉันรู้ว่ามันทำงานผิดปกติที่ไหนสักแห่งเนื่องจากมีการเรียกแม่แบบที่ไม่ถูกต้องเมื่อดูหน้าเว็บ ยกเว้นhttp://example.com/glossary/โดยที่ archive-sumo-glossary-term.php ถูกเรียกใช้อย่างที่คาดไว้อีกสองรายการจะเปิดใช้งาน index.php ในชุดรูปแบบของฉัน

ไปที่นี่ ( functions.phpในชุดรูปแบบ):

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

คำตอบ:


30

คุณสามารถลบล้างเทมเพลตที่จะถูกเรียกด้วยtemplate_includeหรือตัวกรองที่เกี่ยวข้องได้ แต่สิ่งนี้อาจซ่อนปัญหาที่ลึกกว่าของที่เก็บถาวรแบบกำหนดเอง

ตามที่ฉันเข้าใจคุณต้องการใช้โครงสร้างต่อไปนี้:

  • /glossary/ควรเป็นหน้าเก็บถาวรสำหรับsumo-glossary-termโพสต์ทั้งหมด
  • /glossary/[letter]/ควรเป็นหน้าเก็บถาวรสำหรับโพสต์ที่มีคำว่า taxonomy [letter]ในsumo-glossary-lettertaxonomy
  • /glossary/[letter]/[term-name]/ควรเป็นsumo-glossary-termโพสต์ของแต่ละบุคคล

ซึ่งหมายความว่าครั้งแรกที่จะโหลดแม่แบบarchive-sumo-glossary-term.phpที่สองจะโหลดและโหลดประสงค์ที่สามtaxonomy-sumo-glossary-letter.phpsingle-sumo-glossary-term.php

ฉันได้รับสิ่งนี้ใน WordPress 3.2 โดยการตั้งค่า taxonomy reugite reckite และทั้ง reugite slug และ slug เก็บถาวรสำหรับประเภทโพสต์และไม่มีกฎการเขียนใหม่อื่น ๆ นอกจากนี้ฉันลงทะเบียนอนุกรมวิธานก่อนและประเภทโพสต์หลังจากนั้นเพื่อให้แน่ใจว่าลำดับความสำคัญถูกต้อง (มิฉะนั้น URL เช่น/glossary/f/page/2ไปที่คำศัพท์pageแทนหน้า 2 ของตัวอักษรอภิธานศัพท์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;
}

ฉันจะลองในวันพรุ่งนี้และดูว่ามันหลอกลวงและกลับมาที่นี่ได้ไหม ขอบคุณ!
maryisdead

ตกลงไม่ใช่พรุ่งนี้เลย…มันใช้ได้เกือบสมบูรณ์แบบ! ขอขอบคุณ! สิ่งที่ไม่ทำงานคือ/glossary/อะไร ทำให้ฉัน 404 ( archive-sumo-glossary-term.phpตั้งค่า) ความคิดใด ๆ ต้องบอกว่าฉันติดกับ WP 3.0.1 และอาจเป็นปัญหารุ่น ต้องทดสอบอีกครั้งเมื่อฉันสามารถอัพเกรดได้ อย่างไรก็ตามส่วนใหญ่ก็ใช้งานได้และตอนนี้ฉันไม่จำเป็นต้องใช้/glossary/และเพียงแค่เปลี่ยนเส้นทางไปที่ตัวอักษร A ขอบคุณอีกครั้ง!
maryisdead

เฮ้ @maryisdead ฉันมีปัญหาเดียวกันที่แน่นอนและมาพร้อมกับวิธีการแก้ปัญหาที่เหมือนกัน แต่ถูกทิ้งไว้กับปัญหาเดียวกันของคุณแน่นอน - คุณจะรับ / คำศัพท์เพื่อไปที่แม่แบบเก็บถาวร - glossery.php ได้อย่างไร? ฉันเพิ่งพบคำตอบ - ใช้'has_archive' => 'glossary'แทนhas_archive => true ฉันเพิ่งสังเกตเห็นว่าแจนมีวิธีนั้นในคำตอบของเขา แต่คุณไม่มีวิธีนั้นในรหัสดั้งเดิมของคุณ - คุณอัพเดตส่วนนั้นหรือไม่ มันเริ่มทำงานสำหรับฉันทันทีที่ฉันทำการเปลี่ยนแปลงนั้น
Jeff

เฮ้เจฟฟ์! ใช่อัปเดตส่วนนั้นแล้ว เพิ่งตรวจสอบอีกครั้งยังคงไม่ทำงาน การติดตั้ง WordPress ที่เป็นปัญหายังไม่เป็นปัจจุบัน (3.0.1) ดังนั้นบางทีนั่นอาจเป็นสาเหตุของปัญหา
maryisdead

ปัญหาเดียวกันที่นี่โดยใช้ WP 3.2.1 ยังไม่มีวิธีแก้ปัญหา?
Richard B

0

ฉันไม่ได้ใช้สิ่งนี้เป็นการส่วนตัว แต่สิ่งที่คุณอาจต้องการดูคือ "add_rewrite_rule"

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

และอย่าลืมบันทึกลิงก์ถาวรเมื่อคุณทำการเปลี่ยนแปลง


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