ลบกระสุนออกจาก URL โพสต์ประเภทโพสต์ที่กำหนดเอง


48

ดูเหมือนว่าแหล่งข้อมูลบนเว็บทั้งหมดตามหัวข้อของการลบทากประเภทโพสต์ที่กำหนดเองเช่น

yourdomain.com/CPT-SLUG/post-name 

ตอนนี้เป็นโซลูชันที่ล้าสมัยมากซึ่งมักอ้างอิงการติดตั้ง WP รุ่น 3.5 ล่วงหน้า สิ่งที่พบได้ทั่วไปคือ:

'rewrite'   => array( 'slug' => false, 'with_front' => false ),  

ภายในฟังก์ชัน register_post_type ของคุณ สิ่งนี้ไม่ทำงานอีกต่อไปและทำให้เข้าใจผิด ดังนั้นฉันถามชุมชนในไตรมาสที่ 3 ปี 2018 ที่ขอบของ WordPress 5 ...

อะไรคือวิธีที่ทันสมัยและมีประสิทธิภาพในการลบ Post Type Slug ออกจาก URL ของ Post Post Type ที่กำหนดเองจากภายในอาร์กิวเมนต์ที่เขียนใหม่หรือที่อื่นใด?

UPDATE: ดูเหมือนว่ามีหลายวิธีในการบังคับให้ทำงานกับ regex โดยเฉพาะคำตอบจาก Jan Beck หากคุณเต็มใจที่จะตรวจสอบการสร้างเนื้อหาอย่างสม่ำเสมอเพื่อให้แน่ใจว่าไม่มีการสร้างชื่อหน้า / โพสต์ที่ขัดแย้งกัน .... อย่างไรก็ตามฉันเชื่อว่านี่เป็นจุดอ่อนที่สำคัญใน WP core ที่ควรจัดการกับเรา . ทั้งสองเป็นตัวเลือก / เบ็ดเมื่อสร้าง CPT หรือชุดตัวเลือกขั้นสูงสำหรับ Permalinks กรุณาสนับสนุนตั๋วติดตาม

เชิงอรรถ: โปรดสนับสนุนตั๋ว trac นี้โดยดู / ส่งเสริม: https://core.trac.wordpress.org/ticket/34136#ticket


ฉันเดาว่าฉันเกาหัวของฉันว่าทำไมคุณต้องการทำเช่นนั้น? สับสน.
Michael Ecklund

3
@MichaelEcklund เนื่องจาก CPT ใด ๆ ที่ใช้ในการสร้างหน้าเว็บสาธารณะซึ่งมีชื่อกระสุนบังคับใน URL ในความเป็นจริงมี devs wp จำนวนมากที่ต้องการถอดตัวกระสุนอย่างปลอดภัย
Ben Racicot

คำตอบ:


60

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

ก่อนอื่นเราจะลบตัวบุ้งออกจากลิงก์ถาวร:

function na_remove_slug( $post_link, $post, $leavename ) {

    if ( 'events' != $post->post_type || 'publish' != $post->post_status ) {
        return $post_link;
    }

    $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

    return $post_link;
}
add_filter( 'post_type_link', 'na_remove_slug', 10, 3 );

เพียงแค่เอากระสุนไม่พอ ตอนนี้คุณจะได้รับ 404 หน้าเนื่องจาก WordPress คาดว่าโพสต์และหน้าเว็บจะทำงานแบบนี้เท่านั้น คุณจะต้องเพิ่มสิ่งต่อไปนี้:

function na_parse_request( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
        return;
    }

    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'events', 'page' ) );
    }
}
add_action( 'pre_get_posts', 'na_parse_request' );

เพียงแค่เปลี่ยน "กิจกรรม" เป็นประเภทโพสต์ที่คุณกำหนดเองและคุณก็พร้อมแล้ว คุณอาจต้องรีเฟรช Permalink ของคุณ


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

1
มันล้มเหลวด้วย Nginx 2 != count( $query->query )เพราะสภาพ ด้วย Nginx คุณสามารถมี $ query-> array('page' => '', 'name' => '...', 'q' => '...')แบบสอบถามเป็น ดังนั้น @NateAllen ความหมายของเงื่อนไขนั้นคืออะไร?
Fabio Montefuscolo

3
เราต้องการสิ่งที่ดีกว่านี้ รองรับการลบกระสุนที่อยู่ภายในเพื่อให้เราไม่สามารถสร้าง URL ที่ขัดแย้งกันในภายหลัง วิธีการโพสต์และหน้าเว็บปกติสร้าง URL ของพวกเขา
Ben Racicot

3
มันเป็นแค่ฉันหรือสิ่งนี้จะทำลายแท็กที่มีเงื่อนไขของ wordpress เช่น is_single () และ is_singular () หรือไม่?
rob-gordon

1
วิธีการแก้ปัญหานี้ทำให้เกิดการเชื่อมโยงที่เสียหายและบล็อกของฉันหยุดแสดงโพสต์และเป็นเพียงหน้าปกติ ดูวิธีแก้ปัญหาที่ดีกว่าโดย Matt Keys
Radley Sustaire

20

เขียนรหัสต่อไปนี้ลงในการลงทะเบียน taxonomy

'rewrite' => [
  'slug' => '/',
  'with_front' => false
]

สิ่งที่สำคัญที่สุดที่คุณต้องทำหลังจากเปลี่ยนรหัส

หลังจากที่คุณแก้ไขเอกสารอนุกรมวิธานโพสต์ที่กำหนดเองของคุณแล้วให้ลองไปที่การตั้งค่า> Permalinksและบันทึกการตั้งค่าของคุณอีกครั้งมิฉะนั้นคุณจะไม่พบหน้า 404

ตรวจสอบที่นี่เพื่อหาทางออกที่ดีที่สุด: http://www.krazzycodes.com/how-to-remove-custom-post-type-taxonomy-base-from-url-in-wordpress/


ใช้งานได้จริงฉันไม่รู้ว่าไม่มีใครสังเกตเห็นสิ่งนี้มาก่อน แน่นอนว่าสิ่งนี้อาจรบกวนหน้าอื่น ๆ หากพวกเขามีความคิดเห็นเหมือนกัน แต่หากไม่ใช่นี่เป็นทางออกที่ยอดเยี่ยม
Aleksandar Đorđević

4
พยายามออกมา มันให้ผลลัพธ์ที่ต้องการสำหรับลิงค์ประเภทโพสต์ที่กำหนดเองของฉัน อย่างไรก็ตามมัน 'จับ' แท็กประเภทโพสต์ POST หรือ PAGE ทั้งหมดและพยายามแก้ไขเป็น URL สำหรับประเภทโพสต์ที่กำหนดเองของฉันและยุค 404 (ใช่ฉันบันทึกลิงก์ถาวร)
Matt Keys

4
มันใช้งานไม่ได้ ให้ 404 แม้ในขณะที่คุณอัปเดตลิงก์
Christine Cooper

3
อีกครั้งแม้หลังจากการบันทึกการตั้งค่าลิงก์โพสต์และหน้าเว็บไม่ทำงานอีกต่อไป (404)
amklose

1
วิธีนี้ใช้ได้ผลในการลบกระสุนออกจาก URL แต่หน้าเก็บถาวรไม่ทำงานอีกต่อไป
Annapurna

13

ฉันพยายามที่จะคิดออกนี้ไม่นานมานี้และคำตอบสั้น ๆ จากสิ่งที่ผมรู้ก็คือไม่มี ไม่ได้มาจากภายในอาร์กิวเมนต์ที่เขียนใหม่อย่างน้อย

คำอธิบายแบบยาวจะปรากฏชัดเจนหากคุณดูรหัสจริงของregister_post_typeในบรรทัด wp-include / post.php 1454 :

add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );

คุณสามารถเห็นมันนำหน้า$args->rewrite['slug']ไปที่%$post_type%แท็ก rewrite หนึ่งอาจคิดว่า "ลองตั้งค่ากระสุนไปnullแล้ว" จนกว่าคุณจะดูไม่กี่บรรทัด:

if ( empty( $args->rewrite['slug'] ) )
    $args->rewrite['slug'] = $post_type;

คุณสามารถเห็นได้ว่าฟังก์ชั่นมักจะคาดหวังว่าค่ากระสุนที่ไม่ว่างเปล่าและใช้ประเภทโพสต์


ขอบคุณ @JanBeck มีเหตุผลสำคัญที่ทำให้สิ่งนี้มีอยู่จริงหรือไม่? ทำไมไม่แฮ็กไฟล์หลักที่มีเงื่อนไขเพื่อละเว้นโพสต์บางประเภทจากกฎนี้
Ben Racicot

9
คุณควรให้รางวัลกับคำตอบของ Jan Beck WordPress ต้องการตัวบุ้ง post_type เพื่อกำหนดเส้นทางการร้องขออย่างถูกต้อง กฎนี้ป้องกันการตั้งชื่อความขัดแย้งระหว่างหน้า WP ท้องถิ่น (ซึ่งแสดงโดยไม่มีกระสุน) และโพสต์ประเภทที่กำหนดเองใด ๆ หากคุณแฮกกระสุนออกจากนั้น WordPress จะไม่ทราบความแตกต่างระหว่างหน้าชื่อ "ปิคนิค" และเหตุการณ์ (ประเภทโพสต์ที่กำหนดเอง) ชื่อ "ปิคนิค"
dswebsme

3
@dswebsme เห็นด้วย แต่มีบางสถานการณ์ที่คุณต้องเปลี่ยน URL ดังนั้นนอกเหนือจากสาเหตุที่เป็นไปไม่ได้และไม่ควรทำอย่างมีประสิทธิภาพ?
Ben Racicot

7

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

<?php
function wpsx203951_custom_init() {

    $post_type = 'event';
    $args = (object) array(
        'public'      => true,
        'label'       => 'Events',
        'rewrite'     => false, // always set this to false
        'has_archive' => true
    );
    register_post_type( $post_type, $args );

    // these are your actual rewrite arguments
    $args->rewrite = array(
        'slug' => 'calendar'
    );

    // everything what follows is from the register_post_type function
    if ( is_admin() || '' != get_option( 'permalink_structure' ) ) {

        if ( ! is_array( $args->rewrite ) )
            $args->rewrite = array();
        if ( empty( $args->rewrite['slug'] ) )
            $args->rewrite['slug'] = $post_type;
        if ( ! isset( $args->rewrite['with_front'] ) )
            $args->rewrite['with_front'] = true;
        if ( ! isset( $args->rewrite['pages'] ) )
            $args->rewrite['pages'] = true;
        if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )
            $args->rewrite['feeds'] = (bool) $args->has_archive;
        if ( ! isset( $args->rewrite['ep_mask'] ) ) {
            if ( isset( $args->permalink_epmask ) )
                $args->rewrite['ep_mask'] = $args->permalink_epmask;
            else
                $args->rewrite['ep_mask'] = EP_PERMALINK;
        }

        if ( $args->hierarchical )
            add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" );
        else
            add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" );

        if ( $args->has_archive ) {
            $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;
            if ( $args->rewrite['with_front'] )
                $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
            else
                $archive_slug = $wp_rewrite->root . $archive_slug;

            add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' );
            if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {
                $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
                add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
                add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' );
            }
            if ( $args->rewrite['pages'] )
                add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
        }

        $permastruct_args = $args->rewrite;
        $permastruct_args['feed'] = $permastruct_args['feeds'];
        add_permastruct( $post_type, "%$post_type%", $permastruct_args );
    }
}
add_action( 'init', 'wpsx203951_custom_init' );

คุณสามารถเห็นการadd_permastructโทรตอนนี้ไม่รวมกระสุนอีกต่อไป ฉันทดสอบสองสถานการณ์:

  1. เมื่อฉันสร้างเพจด้วยกระสุน "ปฏิทิน" หน้านั้นจะถูกเขียนทับโดยไฟล์เก็บถาวรชนิดโพสต์ซึ่งยังใช้กระสุน "ปฏิทิน"

ป้อนคำอธิบายรูปภาพที่นี่

  1. เมื่อฉันสร้างเพจด้วยกระสุน "my-event" และเหตุการณ์ (CPT) ด้วยกระสุน "my-event" ประเภทโพสต์ที่กำหนดเองจะปรากฏขึ้น

ป้อนคำอธิบายรูปภาพที่นี่

  1. หน้าอื่น ๆ ไม่ทำงานเช่นกัน หากคุณดูที่ภาพด้านบนจะเห็นได้ชัดว่าทำไม: กฎชนิดโพสต์ที่กำหนดเองจะจับคู่กับทากหน้าเสมอ เนื่องจาก WordPress ไม่มีวิธีระบุว่าเป็นหน้าเว็บหรือโพสต์แบบกำหนดเองที่ไม่มีอยู่มันจะส่งคืน 404 นั่นคือสาเหตุที่คุณต้องใช้ตัวบุ้งเพื่อระบุหน้าหรือ CPT ทางออกที่เป็นไปได้คือการดักจับข้อผิดพลาดและค้นหาหน้าที่อาจมีอยู่คล้ายกับคำตอบนี้

ดังนั้นหากเป้าหมายคือการลบทากสำหรับ CPT เราไม่สามารถตั้งชื่อ CPT บางอย่างที่ไม่ซ้ำกันซึ่งจะไม่เกิดการชนเนื่องจากมันจะไม่ปรากฏใน URL ต่อไปหรือไม่ หรือโพสต์ชื่อเป็นความขัดแย้งที่เป็นไปได้ถ้าชื่อเดียวกันกับหน้า
Ben Racicot

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

1
ฉันเห็น. ควรมีกฎการเขียนซ้ำที่ผนวก '-1' กับ URL ที่ขัดแย้งกันในอนาคตเช่นโพสต์ WP ดั้งเดิมกับหน้า ฉันได้สร้าง trac ticket core.trac.wordpress.org/ticket/34136#ticket แล้วจะรักความคิดของคุณ
Ben Racicot

7

เมื่อมองหาคำตอบที่นี่ฉันคิดว่ามีช่องว่างสำหรับวิธีการแก้ปัญหาที่ดีกว่าซึ่งรวมบางสิ่งที่ฉันได้เรียนรู้ด้านบนและเพิ่มการตรวจจับอัตโนมัติและการป้องกันการโพสต์ทากซ้ำซ้อน

หมายเหตุ: ตรวจสอบให้แน่ใจว่าคุณเปลี่ยน 'custom_post_type' สำหรับชื่อ CPT ของคุณตลอดตัวอย่างของฉันด้านล่าง มีหลายเหตุการณ์และ 'ค้นหา / แทนที่' เป็นวิธีที่ง่ายในการจับพวกเขาทั้งหมด รหัสทั้งหมดนี้สามารถเข้าไปใน functions.php ของคุณหรือในปลั๊กอิน

ขั้นตอนที่ 1:ปิดการใช้งานการเขียนใหม่ในประเภทโพสต์ที่กำหนดเองของคุณโดยการตั้งค่าการเขียนใหม่เป็น 'เท็จ' เมื่อคุณลงทะเบียนโพสต์:

register_post_type( 'custom_post_type',
    array(
        'rewrite' => false
    )
);

ขั้นตอนที่ 2:เพิ่มการเขียนใหม่ที่กำหนดเองของเราไปที่ด้านล่างของการเขียน WordPress ใหม่สำหรับ custom_post_type ของเรา

function custom_post_type_rewrites() {
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/attachment/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/embed/?$', 'index.php?custom_post_type=$matches[1]&embed=true', 'bottom');
    add_rewrite_rule( '([^/]+)/trackback/?$', 'index.php?custom_post_type=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '([^/]+)/page/?([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&paged=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '([^/]+)(?:/([0-9]+))?/?$', 'index.php?custom_post_type=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom');
    add_rewrite_rule( '[^/]+/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom');
}
add_action( 'init', 'custom_post_type_rewrites' );

หมายเหตุ: ขึ้นอยู่กับความต้องการของคุณคุณอาจต้องการแก้ไขการเขียนใหม่ข้างต้น (ปิดการใช้งาน trackbacks? ฟีด?, ฯลฯ ) สิ่งเหล่านี้แสดงประเภทการเขียนเริ่มต้นที่จะถูกสร้างขึ้นหากคุณไม่ได้ปิดการใช้งานการเขียนซ้ำในขั้นตอนที่ 1

ขั้นตอนที่ 3: ทำการเชื่อมโยงกับประเภทโพสต์ที่คุณกำหนดเอง 'สวย' อีกครั้ง

function custom_post_type_permalinks( $post_link, $post, $leavename ) {
    if ( isset( $post->post_type ) && 'custom_post_type' == $post->post_type ) {
        $post_link = home_url( $post->post_name );
    }

    return $post_link;
}
add_filter( 'post_type_link', 'custom_post_type_permalinks', 10, 3 );

หมายเหตุ: คุณสามารถหยุดที่นี่หากคุณไม่กังวลเกี่ยวกับผู้ใช้ของคุณในการสร้างโพสต์ที่ขัดแย้งกัน (ซ้ำ) ในโพสต์ประเภทอื่นที่จะสร้างสถานการณ์ที่หนึ่งในพวกเขาสามารถโหลดได้เมื่อมีการร้องขอหน้า

ขั้นตอนที่ 4:ป้องกันการโพสต์ทาก

function prevent_slug_duplicates( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    $check_post_types = array(
        'post',
        'page',
        'custom_post_type'
    );

    if ( ! in_array( $post_type, $check_post_types ) ) {
        return $slug;
    }

    if ( 'custom_post_type' == $post_type ) {
        // Saving a custom_post_type post, check for duplicates in POST or PAGE post types
        $post_match = get_page_by_path( $slug, 'OBJECT', 'post' );
        $page_match = get_page_by_path( $slug, 'OBJECT', 'page' );

        if ( $post_match || $page_match ) {
            $slug .= '-duplicate';
        }
    } else {
        // Saving a POST or PAGE, check for duplicates in custom_post_type post type
        $custom_post_type_match = get_page_by_path( $slug, 'OBJECT', 'custom_post_type' );

        if ( $custom_post_type_match ) {
            $slug .= '-duplicate';
        }
    }

    return $slug;
}
add_filter( 'wp_unique_post_slug', 'prevent_slug_duplicates', 10, 6 );

หมายเหตุ: นี่จะผนวกสตริง '-duplicate' ต่อท้ายทากที่ซ้ำกัน รหัสนี้ไม่สามารถป้องกันตัวบุ้งซ้ำได้หากมีอยู่ก่อนที่จะใช้วิธีแก้ไขปัญหานี้ ให้แน่ใจว่าได้ตรวจสอบรายการที่ซ้ำกันก่อน

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


เพิ่งทดสอบและดูเหมือนว่ามันทำงานได้จนถึงตอนนี้
Christine Cooper

เป็นความหวังสำหรับวิธีการนี้ แต่ให้ 404 ในโพสต์ CPT ของฉันแม้หลังจากบันทึกลิงก์ถาวรอีกครั้ง
Garconis

ขออภัยมันไม่ได้ผลสำหรับคุณ Garconis ฉันได้พูดคุยกับคนอื่นเกี่ยวกับเรื่องนี้ในขณะที่กลับมาและพวกเขาก็มีปัญหากับมันในเว็บไซต์ของพวกเขา ฉันดูเหมือนจะจำได้ว่ามันมีความสำคัญหากโพสต์บล็อกของคุณ Permalinks มีคำนำหน้าพวกเขา ในเว็บไซต์ที่ฉันพัฒนาสิ่งนี้สำหรับการโพสต์บล็อกกำลังใช้โครงสร้าง Permalink: / blog /% postname% / หากคุณไม่มีคำนำหน้าบนโพสต์บล็อกของคุณและเป็นที่ยอมรับได้ให้ลองและแจ้งให้เราทราบว่ามันจะไปได้อย่างไร!
แมตต์คีย์

2
สิ่งนี้ใช้ได้สำหรับฉัน ไม่เหมือนกับโซลูชันอื่น ๆ ในหน้าเว็บ แต่จะไม่ทำลายหน้าปกติหรือเลย์เอาต์บล็อกและไม่ทำให้เกิดการเปลี่ยนเส้นทางไม่สิ้นสุด มันยังแสดง URL ที่ถูกต้องในพื้นที่ "Permalink" เมื่อแก้ไขหน้า cpt เหล่านั้น ทางออกที่ดีงามที่นี่มีข้อแม้เพียงอย่างเดียวคือหน้าเก็บถาวรไม่ทำงาน อย่าลืมที่จะสลับออก "custom_post_type"และฟื้นฟู Permalinks ของคุณหลังจากนั้น
Radley Sustaire

@MattKeys การตั้งค่าเริ่มต้น Permalink /%category%/%postname%/มีโครงสร้างที่กำหนดเองของ เมื่อเพิ่มรหัสของคุณตัวบุ้ง CPT จะดูตกลง (แม้ว่าจะไม่มีเครื่องหมายสแลชต่อท้าย) ... และตัวตรวจสอบความขัดแย้งก็ทำงานเช่นกัน แต่โพสต์ที่เกิดขึ้นจริงใน 404
Garconis

1

คุณไม่ต้องการรหัสยากนัก เพียงใช้ปลั๊กอินน้ำหนักเบา:

มันมีตัวเลือกที่ปรับแต่งได้


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

@ วอลล์คุณสามารถบอกฉันเกี่ยวกับปัญหาในรายละเอียดได้หรือไม่
T.Todua

ลิงก์ต่อไปนี้ไปยังหน้า (ซึ่งไม่ใช่ประเภทโพสต์ที่กำหนดเอง) จากเมนูหลักมีข้อผิดพลาด 404 ราวกับว่าไม่มีหน้าอยู่ แค่นั้นแหละ.
Walf

@ วอลล์คุณสามารถยกตัวอย่าง URL ของโอกาสให้ฉันได้ไหม? (คุณสามารถครอบคลุมชื่อโดเมนถ้าคุณต้องการฉันแค่ต้องการตัวอย่าง) ขอขอบคุณฉันจะอัปเดต
T.Todua

1

พบปัญหาเดียวกันที่นี่และดูเหมือนว่าจะไม่มีการเคลื่อนไหวในเว็บไซต์ WordPress ในสถานการณ์เฉพาะของฉันที่โพสต์บล็อกเดียวโครงสร้าง / บล็อก /% postname% / ต้องการโซลูชันนี้

https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/

สิ้นสุดลงในพวงของยุค 404

แต่เมื่อใช้ร่วมกับวิธีการที่ยอดเยี่ยมนี้ซึ่งไม่ได้ใช้กลยุทธ์ลิงก์แบ็กเอนด์สำหรับบล็อกโพสต์ https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/

ขอบคุณมัด


0

และเราสามารถเปลี่ยนแปลงฟังก์ชั่นที่กล่าวถึงข้างต้นได้:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {
    $query->set( 'post_type', array( 'post', 'events', 'page' ) );
}
}

ไปที่:

function na_parse_request( $query ) {

if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
    return;
}

if ( ! empty( $query->query['name'] ) ) {

    global $wpdb;
    $pt = $wpdb->get_var(
        "SELECT post_type FROM `{$wpdb->posts}` " .
        "WHERE post_name = '{$query->query['name']}'"
    );
    $query->set( 'post_type', $pt );
}
}

เพื่อตั้งค่า post_type ให้ถูกต้อง



0

สำหรับใครก็ตามที่อ่านข้อความนี้ที่มีปัญหากับโพสต์เด็กอย่างที่ฉันทำฉันพบวิธีที่ดีที่สุดคือการเพิ่มกฎการเขียนซ้ำของคุณเอง

ปัญหาหลักที่ฉันมีคือ WordPress ทำการเปลี่ยนเส้นทางจากหน้าเว็บที่มี 2 ระดับ (โพสต์เด็ก) ลึกลงไปเล็กน้อยแตกต่างจากที่ปฏิบัติกับ 3 ระดับลึก (ลูกของโพสต์เด็ก)

ซึ่งหมายความว่าเมื่อฉันมี / โพสต์ประเภท / โพสต์ชื่อ / โพสต์เด็ก / ฉันสามารถใช้ / โพสต์ชื่อ / โพสต์เด็กและมันจะนำฉันไปยังหนึ่งที่มีโพสต์ประเภทหน้า แต่ถ้าฉันมีโพสต์ประเภท / post-name / post-child / post-grandchild ฉันไม่สามารถใช้ post-name / post-child / post-grandchild ได้

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

สิ่งแรกที่คุณต้องทำคือลบลิงค์ประเภทโพสต์ออกจากเด็กเช่นกัน ตรรกะนี้ควรเกิดขึ้นที่นี่ถ้าคุณดูคำตอบของเนทอัลเลนด้านบน:

$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

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

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

นี่คือกฎการเขียนซ้ำที่ฉันใช้โดยสมมติว่า "เหตุการณ์" คือชื่อของ CPT ของคุณ

function rewrite_rules_for_removing_post_type_slug()
{
    add_rewrite_rule(
        '(.?.+?)?(:/([0-9]+))?/?$',
        'index.php?event=$matches[1]/$matches[2]&post_type=event',
        'bottom'
    );
}

add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);

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


ดูเหมือนจะมีการพิมพ์ผิดใน regex จำเป็นต้องใช้ระหว่าง '(:' a '?' เพื่อใช้เป็นรูปแบบย่อยที่ไม่ถูกจับ => '(?:'. รูปแบบที่สามดูเหมือนว่าหายไปเนื่องจากอนุญาตให้มีรูปแบบย่อยแรกที่ว่างเปล่า หากไม่มีตัวพิมพ์นี้นิพจน์จะเหมือนกับที่พบในประเภทโพสต์ในเพจ 'หน้า'
jot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.