เมื่อมองหาคำตอบที่นี่ฉันคิดว่ามีช่องว่างสำหรับวิธีการแก้ปัญหาที่ดีกว่าซึ่งรวมบางสิ่งที่ฉันได้เรียนรู้ด้านบนและเพิ่มการตรวจจับอัตโนมัติและการป้องกันการโพสต์ทากซ้ำซ้อน
หมายเหตุ: ตรวจสอบให้แน่ใจว่าคุณเปลี่ยน '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' ต่อท้ายทากที่ซ้ำกัน รหัสนี้ไม่สามารถป้องกันตัวบุ้งซ้ำได้หากมีอยู่ก่อนที่จะใช้วิธีแก้ไขปัญหานี้ ให้แน่ใจว่าได้ตรวจสอบรายการที่ซ้ำกันก่อน
ฉันชอบที่จะได้ยินคำตอบจากคนอื่นที่ให้ไปเพื่อดูว่ามันทำงานได้ดีสำหรับพวกเขาเช่นกัน