WordPress Rewrite กฎสำหรับประเภทโพสต์ที่กำหนดเองและ Taxonomy


9

ฉันพบว่าสถานที่นี้เป็นแหล่งข้อมูลที่ดีในอดีตผ่าน Googling มากมายสำหรับปัญหาที่ฉันพบ คำถามของฉันเกี่ยวกับกฎการเขียนซ้ำอย่างละเอียดใช้ WordPress

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

โดยทั่วไปนี่คือโครงสร้างที่ฉันต้องการบรรลุ:

  • example.com/work/%taxonomy%/%post_name%/ (สำหรับโพสต์)
  • example.com/work/%taxonomy%/ (โพสต์รายการที่เป็นของคำเฉพาะอนุกรมวิธาน)
  • example.com/work/ (ไปที่ page-work.php ซึ่งรวมถึง taxonomy.php เพื่อแสดงรายการโพสต์ทั้งหมดที่เกี่ยวข้องกับ taxonomy นั้น)

นี่คือรหัสที่ฉันมีมา แต่ฉันต้องการความช่วยเหลือในการเขียนกฎ WP_Rewrite เนื่องจากนี่เป็นบิตที่ฉันนิ่งเงียบเล็กน้อย

$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => ''
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'hierarchical' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // It's a custom post type, not built in!
    'capability_type' => 'post',
    'query_var' => "project", // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type('project' , $args);

// Showcase Taxonomy
register_taxonomy('projects', array('project'), array(
    'public' => true,
    'hierarchical' => true,
    'label' => 'Project Categories', 
    'singular_label' => 'Project Category',
    'query_var' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false, 'hierarchical'=>true)
    )
);

ขอบคุณมากสำหรับความช่วยเหลือของคุณ! :-)


1
ฉันพบบางสิ่งที่จะช่วยให้คุณเริ่มต้น: codex.wordpress.org/Class_Reference/WP_Rewriteและcodex.wordpress.org/Rewrite_API/add_rewrite_ruleและcodex.wordpress.org/Rewrite_API/add_rewrite_tag
chrisguitarguy

@ChristopherDavis ขอบคุณฉันจะตรวจสอบอีกเล็กน้อยและดูว่าฉันจะไปได้อย่างไร
matt_d_rat

1
ฉันคิดว่าคำถามนี้สามารถตอบได้โดยดูที่การผสมประเภทโพสต์ที่กำหนดเองและโครงสร้างการเขียน taxonomy ใหม่? หากคำถามนั้นไม่ได้ช่วยคุณโปรดแก้ไขคำถามนี้เพื่อระบุว่ามันแตกต่างกันอย่างไร
Jan Fabry

คำตอบ:


1

หวังว่านี่จะช่วยแก้ปัญหาของคุณได้

function my_custom_post_type() {
$labels = array(
    'name' => _x('Projects', 'post type general name'),
    'singular_name' => _x('Project', 'post type singular name'),
    'add_new' => _x('Add New', 'project item'),
    'add_new_item' => __('Add New Project'),
    'edit_item' => __('Edit Project'),
    'new_item' => __('New Project'),
    'view_item' => __('View Project'),
    'search_items' => __('Search Projects'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => '',
    'menu_name' => 'Projects' 
);

$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
        'hierarchical' => false,
        'has_archive' => true,
    'rewrite' => array('slug'=>'work', 'with_front'=>false),
    'show_ui' => true,
    '_builtin' => false, // It's a custom post type, not built in!
    'capability_type' => 'post',
        'query_var' => true, // This goes to the WP_Query schema
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
);

register_post_type( 'work' , $args );

}
function my_custom_taxonomies() {

    $labels = array(
        'name' => __( 'Taxonomy', 'taxonomy general name' ),
        'singular_name' => __( 'Taxonomy', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Taxonomy' ),
        'all_items' => __( 'All Taxonomy' ),
        'parent_item' => __( 'Parent Taxonomy' ),
        'parent_item_colon' => __( 'Parent Taxonomy:' ),
        'edit_item' => __( 'Edit Taxonomy' ), 
        'update_item' => __( 'Update Taxonomy' ),
        'add_new_item' => __( 'Add New Taxonomy' ),
        'new_item_name' => __( 'New Taxonomy Name' ),
        'menu_name' => __( 'Taxonomy' ),
    );  

    register_taxonomy( 'taxonomy', array('work'), array (
                    'labels' => $labels,
                    'hierarchical' =>false,
                    'show_ui' => true,
                    'rewrite' => array( 'slug' => 'work/taxonomy'),
                    'query_var' => true,
                    'show_in_nav_menus' => true,
                    'public' => true,
            ));
}

add_action('init', 'my_custom_post_type', 0);
add_action('init', 'my_custom_taxonomies', 10);

สิ่งที่คุณต้องสร้างคือ archive-work.php (ไฟล์เก็บถาวรชนิดโพสต์ของคุณ) และ taxonomy.php ซึ่งจะใช้เพื่อแสดงไฟล์เก็บถาวร taxonomy แบบกำหนดเองของคุณ


อย่าลืมเปลี่ยน "taxonomy" เป็นชื่อ taxonomy ของคุณเอง อย่าใช้ค่าเดียวกับ post_type ของคุณ ลองใช้หมวดหมู่สำหรับการลองครั้งแรก work / category, register_taxonomy ('category, array (' work '), array (......
nonsensecreativity

1

ฉันมีปัญหาเดียวกันและหลังจากการดิ้นรนมากมายฉันลงเอยด้วยวิธีแก้ปัญหานี้
เพียงเพิ่มรหัสนี้ในรหัสของคุณ

global $wp_rewrite;
$wp_rewrite->flush_rules(); 

function my_custom_post_type() {
    $labels = array(
        'name' => _x('Projects', 'post type general name'),
        'singular_name' => _x('Project', 'post type singular name'),
        'add_new' => _x('Add New', 'project item'),
        'add_new_item' => __('Add New Project'),
        'edit_item' => __('Edit Project'),
        'new_item' => __('New Project'),
        'view_item' => __('View Project'),
        'search_items' => __('Search Projects'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => '',
        'menu_name' => 'Projects' 
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
            'hierarchical' => false,
            'has_archive' => true,
        'rewrite' => array('slug'=>'work', 'with_front'=>false),
        'show_ui' => true,
        '_builtin' => false, // It's a custom post type, not built in!
        'capability_type' => 'post',
            'query_var' => true, // This goes to the WP_Query schema
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail', 'comments', 'author', 'excerpt')
    );

    register_post_type( 'work' , $args );

    global $wp_rewrite;   
    $wp_rewrite->flush_rules();    // this should help 
}

5
$ wp_rewrite-> flush_rules () ไม่ควรรันบ่อยๆมันควรจะรันเมื่อเปิดใช้งานหรือยกเลิกการใช้งาน hooks หรือเท่าที่จะทำได้ มันบอกอย่างนั้นที่นี่: codex.wordpress.org/Rewrite_API/flush_rules ALSO ค่อนข้างฟังก์ชั่นเดียวกับตัวนี้: codex.wordpress.org/Function_Reference/flush_rewrite_rules
Jared

ในบันทึกอื่นนี่คือวิธีที่ฉันประสบความสำเร็จ: pastebin.com/k7QvxKLi
Jared

@ Jared ขอบคุณสำหรับการชี้ แต่ฉันไม่สามารถหาวิธีที่จะประกอบสิ่งนี้เมื่อสิ่งนี้ถูกรวมเข้ากับธีมของเรา (เช่นไม่ใช่ผ่านปลั๊กอิน) กรุณาแนะนำ
Dipesh KC

รหัสจะเข้าไปในfunctions.phpกรณีนั้น รหัสสำหรับปลั๊กอินและชุดรูปแบบเหมือนกันความแตกต่างเพียงอย่างเดียวคือในชุดรูปแบบที่จะใส่เข้าไปเสมอfunctions.phpหรือไฟล์ที่รวมอยู่ในfunctions.php
Jared

2
ฉันขอแนะนำให้ใช้after_switch_themeตะขอมันใหม่สำหรับ 3.3 (IIRC)
Cristian

0

คำอธิบายโดยละเอียดเพิ่มเติมอยู่ที่โพสต์อื่นแต่นี่คือส่วนพื้นฐานที่คุณต้องเพิ่ม:

  1. ลงทะเบียน taxonomies และ cpt ที่คุณทำ ตรวจสอบให้แน่ใจว่ากระสุนของคุณเขียนใหม่สำหรับ taxo คือ "basename" และกระสุนที่เขียนใหม่สำหรับ cpt คือ "basename /% tax_name%"

  2. บอก wordpress ว่าจะทำอย่างไรกับ "% tax_name%" ดังนี้:

    function filter_post_type_link($link, $post)
    {
    if ($post->post_type != 'custom_post_type_name')
        return $link;
    
    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%',array_pop($cats)->term_id, link); // see custom function defined below
    }
    return $link;
    }
    add_filter('post_type_link', 'filter_post_type_link', 10, 2);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.