วิธีการตั้งค่าความสัมพันธ์ระหว่างแม่กับลูกระหว่างประเภทโพสต์ที่กำหนดเอง differents


14

ฉันเพิ่งตั้งค่าความสัมพันธ์ระหว่างโพสต์ / ผู้ปกครองระหว่างประเภทโพสต์ "ตอน" และโพสต์ "การ์ตูนซีรีส์"

ฉันใช้โค้ดนี้เพื่อเพิ่มในกล่องเมตาเพื่อกำหนดพาเรนต์จากประเภทโพสต์อื่น:

add_action('admin_menu', function() {
    remove_meta_box('pageparentdiv', 'episodes', 'normal');
});
add_action('add_meta_boxes', function() {
    add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});

function episodes_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } // end empty pages check
    } // end hierarchical check.
}

ที่ทำงานบนหน้าจอผู้ดูแลระบบในการอนุญาตให้ฉันตั้งชุดเป็นผู้ปกครองตอน แต่เมื่อฉันพยายามดูโพสต์ฉันได้รับ 404 โครงสร้าง url คือ:

domain/episodes/series-name/episode-name

URL สำหรับซีรีย์คือ:

domain/cartoon-series/series-name

ฉันต้องการ URL สำหรับตอนนี้:

domain/cartoon-series/series-name/episode-name

ฉันกำลังคิดถึงอะไร เป็นไปได้ไหมที่จะทำให้โพสต์ทั้งหมดเป็นลูกของโพสต์ประเภทอื่น? ดังนั้นฉันยังสามารถรับ url สำหรับรายการตอนได้:

domain/cartoon-series/series-name/episodes

ขอบคุณ! ด้าน


ตามที่ร้องขอนี่คือรหัสสำหรับประเภทโพสต์ที่กำหนดเองสองประเภทที่เป็นปัญหา:

$labels = array(
    "name" => "Cartoon Series",
    "singular_name" => "Cartoon Series",
    "menu_name" => "Cartoon Series",
    "all_items" => "All Cartoon Series",
    "add_new" => "Add New",
    "add_new_item" => "Add New Cartoon Series",
    "edit" => "Edit",
    "edit_item" => "Edit Cartoon Series",
    "new_item" => "New Cartoon Series",
    "view" => "View",
    "view_item" => "View Cartoon Series",
    "search_items" => "Search Cartoon Series",
    "not_found" => "No Cartoon Series Found",
    "not_found_in_trash" => "No Cartoon Series Found in Trash",
    "parent" => "Parent Cartoon Series",
    );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => true,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
    "query_var" => true,
    "supports" => array( "title", "revisions", "thumbnail" ),           );
register_post_type( "cartoon-series", $args );

$labels = array(
    "name" => "Episodes",
    "singular_name" => "Episode",
    );

$args = array(
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "show_ui" => true,
    "has_archive" => true,
    "show_in_menu" => true,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => true,
    "rewrite" => array( "slug" => "episodes", "with_front" => true ),
    "query_var" => true,
    "supports" => array( "title", "revisions", "thumbnail" ),           );
register_post_type( "episodes", $args );

ฉันใช้ปลั๊กอิน CPT UI ดังนั้นฉันจึงไม่สามารถแก้ไขรหัสนั้นโดยตรง นั่นเป็นเพียงรหัสการส่งออก CPT UI ที่มีให้

ฉันไม่มีรหัสอื่นที่เชื่อมโยง CPT สองรายการ บางทีนั่นอาจเป็นสิ่งที่ฉันขาดไป ฉันเพิ่งพบรหัสออนไลน์ที่วาง metabox บนหน้าเพื่อทำการเชื่อมโยง มันไม่เพียงพอที่จะทำงานหรือไม่ ดูเหมือนว่าจะตั้งค่า post_parent

ขอบคุณ! ด้าน


ฉันขอโทษ แต่ฉันคิดผิด ตั้งค่าความสัมพันธ์พาเรนต์ - ลูกอย่างถูกต้อง กล่องเมตาไม่ได้ใช้เขตข้อมูลเมตา (นั่นคือสิ่งที่ฉันสับสนในครั้งแรก) มันใช้parent_idแบบสอบถาม var และไม่จำเป็นต้องใช้รหัสมากขึ้นเพื่อตั้งค่าความสัมพันธ์ ปัญหาคือว่า WordPress ไม่รู้จัก URL ที่สร้างขึ้น ฉันพยายามค้นหากฎการเขียนซ้ำที่ใช้งานได้ แต่ไม่ประสบความสำเร็จ ฉันกำลังตรวจสอบวิธีแก้ไขปัญหา
cybmeta

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

ฉันคิดว่าประเภทโพสต์ตามลำดับชั้นหนึ่งเหมาะกับสถานการณ์ของคุณอย่างสมบูรณ์แบบ
cybmeta

2
ฉันกำลังพยายามที่จะไม่ซับซ้อนกับสิ่งนี้จริงๆ หากมีวิธีแก้ปัญหาที่หรูหรากว่านี้ฉันก็เป็นได้ ฉันใหม่สำหรับ WP โดยทั่วไปและทำได้ดีมากจนถึงตอนนี้ แต่อันนี้ทำให้ฉันนิ่งงัน โดยปกติแล้วฉันจะทำให้หมวดหมู่การ์ตูนเป็นหมวดหมู่และกำหนดให้ตอน ปัญหาคือฉันยังมีข้อมูลที่ซ้อนกันอื่น ๆ นอกเหนือจากตอนที่จะไปอยู่ภายใต้ซีรีส์การ์ตูน ดังนั้นดูเหมือนว่าซีรีส์การ์ตูนจะต้องเป็น CPT เช่นกัน มันซับซ้อน! :-D คุณช่วยอธิบายให้ฉันหน่อยได้ไหมว่าคุณหมายถึงอะไรโดยใช้โพสต์แบบลำดับชั้นเดียว?
Mattaton

คำตอบ:


9

ในที่สุดฉันก็ได้พบวิธีแก้ปัญหาที่ใช้งานได้ ชุดการ์ตูนสามารถลงทะเบียนได้ตามที่คุณทำ แต่ตอนประเภทโพสต์ที่กำหนดเองไม่สามารถเป็นแบบลำดับขั้น (ฉันคิดว่า WordPress คาดว่าเนื้อหาหลักจะเป็นประเภทเดียวกับเนื้อหาลูกถ้ามีการตั้งค่าความสัมพันธ์post_parentในwp_postsตารางฐานข้อมูล)

cartoon-series/%series_name%เมื่อลงทะเบียนตอนเขียนกฎจะต้องตั้งค่ากระสุนที่คุณต้องการนั่นคือ จากนั้นเราสามารถกรองลิงก์ตอนเพื่อแทนที่%series_name%ด้วยชื่อจริงของcartoon-seriesประเภทโพสต์ของผู้ปกครองและกฎการเขียนซ้ำเพื่อพูดกับ WordPress เมื่อมีการร้องขอประเภทโพสต์การ์ตูนซีรีส์และเมื่อเป็นตอน

add_action('init', function(){
    $labels = array(
        "name" => "Cartoon Series",
        "singular_name" => "Cartoon Series",
        "menu_name" => "Cartoon Series",
        "all_items" => "All Cartoon Series",
        "add_new" => "Add New",
        "add_new_item" => "Add New Cartoon Series",
        "edit" => "Edit",
        "edit_item" => "Edit Cartoon Series",
        "new_item" => "New Cartoon Series",
        "view" => "View",
        "view_item" => "View Cartoon Series",
        "search_items" => "Search Cartoon Series",
        "not_found" => "No Cartoon Series Found",
        "not_found_in_trash" => "No Cartoon Series Found in Trash",
        "parent" => "Parent Cartoon Series",
    );

    $args = array(
        "labels" => $labels,
         "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true,
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => true,
        "rewrite" => array( "slug" => "cartoon-series", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "revisions", "thumbnail" )
    );

    register_post_type( "cartoon-series", $args );

    $labels = array(
        "name" => "Episodes",
        "singular_name" => "Episode",
    );

    $args = array(
        "labels" => $labels,
        "description" => "",
        "public" => true,
        "show_ui" => true,
        "has_archive" => true,
        "show_in_menu" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => array( "slug" => "cartoon-series/%series_name%", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "revisions", "thumbnail" )
    );

    register_post_type( "episodes", $args );

});

add_action('add_meta_boxes', function() {
    add_meta_box('episodes-parent', 'Cartoon Series', 'episodes_attributes_meta_box', 'episodes', 'side', 'default');
});

function episodes_attributes_meta_box($post) {
        $pages = wp_dropdown_pages(array('post_type' => 'cartoon-series', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } // end empty pages check
}

add_action( 'init', function() {

    add_rewrite_rule( '^cartoon-series/(.*)/([^/]+)/?$','index.php?episodes=$matches[2]','top' );

});

add_filter( 'post_type_link', function( $link, $post ) {
    if ( 'episodes' == get_post_type( $post ) ) {
        //Lets go to get the parent cartoon-series name
        if( $post->post_parent ) {
            $parent = get_post( $post->post_parent );
            if( !empty($parent->post_name) ) {
                return str_replace( '%series_name%', $parent->post_name, $link );
            }
        } else {
            //This seems to not work. It is intented to build pretty permalinks
            //when episodes has not parent, but it seems that it would need
            //additional rewrite rules
            //return str_replace( '/%series_name%', '', $link );
        }

    }
    return $link;
}, 10, 2 );

หมายเหตุ : อย่าลืมล้างกฎการเขียนซ้ำหลังจากบันทึกรหัสข้างต้นและก่อนที่จะลอง ไปที่wp-admin/options-permalink.phpและคลิกบันทึกเพื่อลงทะเบียนกฎการเขียนซ้ำอีกครั้ง

หมายเหตุ 2 : อาจเป็นไปได้ว่าต้องมีการเพิ่มกฎการเขียนซ้ำให้มากขึ้นตัวอย่างเช่นการทำงานกับการให้เลขหน้า นอกจากนี้อาจต้องใช้งานเพิ่มเพื่อให้มีโซลูชันที่สมบูรณ์ตัวอย่างเช่นเมื่อลบการcartoon-seriesลบตอนเด็กทั้งหมดด้วยหรือไม่ เพิ่มตัวกรองในหน้าจอแก้ไขของผู้ดูแลระบบเพื่อกรองตอนโดยผู้ปกครองโพสต์? แก้ไขชื่อตอนในหน้าจอแก้ไขของผู้ดูแลระบบเพื่อแสดงชื่อชุดข้อมูลหลักหรือไม่


ขอบคุณที่ตรวจดูสิ่งนี้! ดูเหมือนว่ารหัสที่คุณโพสต์นั้นจะทำให้ชื่อของซีรีย์การ์ตูนลดลงจาก url แทนที่จะแทนที่% series_name% ด้วยชื่อตอนตอน% series_name% ควรเป็นชื่อของแม่ของตอนนั้น ชื่อตอนจะเป็นหลังจากนั้น ด้วยเหตุผลบางอย่างกล่องการ์ตูนซีรี่ส์ไม่ได้ถูกบรรจุเพื่อให้ฉันเลือกผู้ปกครอง นั่นเป็นเหตุผลที่ฉันคิดว่าตอนจำเป็นต้องเป็นลำดับชั้น พยายามคิดดูว่าทำไม
Mattaton

ใช่ตอนจะต้องเป็นลำดับขั้นเพื่อให้กล่องเมตาการ์ตูนซีรี่ส์จะได้รับการบรรจุ
Mattaton

ด้วยลำดับขั้นตอนเพื่อให้ฉันสามารถตั้งค่าผู้ปกครอง URL ก็แย่ลง ด้วยกระสุนตามที่คุณแนะนำฉันได้รับชื่อชุดใน URL สองครั้ง ดังนั้นแทนที่จะเป็นdomain/episodes/series-name/episode-nameแบบก่อนหน้านี้ฉันได้domain/episodes/series-name/series-name/episode-name
แมตตัน

ดังที่ฉันพูดตอนไม่สามารถเป็นลำดับชั้น ฉันแก้ไขโค้ดกล่องเมตาให้มีประเภทโพสต์ที่ไม่ใช่แบบลำดับชั้น ใช้รหัสที่แน่นอนที่ฉันโพสต์ฉันทดสอบและใช้งานได้ หากคุณใช้รหัสอื่นฉันไม่สามารถรู้สิ่งที่ผิด เพียงแค่คัดลอกและวางรหัสจากคำตอบและทดสอบ คุณอาจต้องปิดการใช้งานปลั๊กอิน CPT UI หรืออย่างน้อยก็ลบประเภทโพสต์ที่กำหนดเองจากปลั๊กอินเมื่อพวกเขาลงทะเบียนในรหัส
cybmeta

อาขอโทษฉันสแกนอย่างรวดเร็วและคิดว่าส่วนนั้นเหมือนกัน คุณพูดถูกเพจจะโหลดทันทีและ URL ดูถูกต้อง
Mattaton


-1

คุณจะต้องเขียนโค้ดการแยกวิเคราะห์ URL ของคุณเองเนื่องจากเวิร์ดเพรสจำเป็นต้องทราบประเภทของโพสต์ที่จะพยายามดึงจากฐานข้อมูลตามโครงสร้าง URL และโครงสร้าง URL ของคุณไม่ให้คำแนะนำใด ๆ

นี่ไม่ใช่สิ่งที่ง่ายมากที่จะทำกับกฎการเขียน API ใหม่ของ wordpress แต่ไม่มีอะไรที่ป้องกันไม่ให้คุณข้ามกลไกการเขียนซ้ำและแยกวิเคราะห์ URL ด้วยตัวเอง สิ่งที่ชอบ 1. เรียกใช้ wordpress rewite กฎ หากพบเนื้อหาที่แสดงและออกจาก 2 รับส่วนแรกของ url ตรวจสอบว่ามีการจับคู่โพสต์ที่กระสุนกับโพสต์ประเภทที่ 3 คาดห่วงในส่วนที่เหลือของ URL ตรวจสอบว่ามีอยู่และเป็น ในประเภทที่เหมาะสม 4. หากทุกอย่างตรงกันแสดงโพสต์ล่าสุดที่พบมิฉะนั้นจะแสดงหน้า 404

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