Nhìn qua các câu trả lời ở đây tôi nghĩ có chỗ cho một giải pháp tốt hơn kết hợp một số điều tôi đã học ở trên và thêm tính năng tự động phát hiện và ngăn chặn các bài đăng trùng lặp.
LƯU Ý: Đảm bảo bạn thay đổi 'custom_post_type' cho tên CPT của riêng bạn trong suốt ví dụ của tôi bên dưới. Có rất nhiều lần xuất hiện và 'tìm / thay thế' là một cách dễ dàng để nắm bắt tất cả. Tất cả các mã này có thể đi vào hàm.php của bạn hoặc trong một plugin.
Bước 1: Vô hiệu hóa ghi lại trên loại bài đăng tùy chỉnh của bạn bằng cách đặt viết lại thành 'false' khi bạn đăng ký bài viết:
register_post_type( 'custom_post_type',
array(
'rewrite' => false
)
);
Bước 2: Thêm thủ công viết lại tùy chỉnh của chúng tôi vào cuối phần viết lại WordPress cho custom_post_type của chúng tôi
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' );
LƯU Ý: Tùy thuộc vào nhu cầu của bạn, bạn có thể muốn sửa đổi các bản viết lại ở trên (vô hiệu hóa trackback? Feed?, Vv). Chúng đại diện cho các kiểu viết lại 'mặc định' sẽ được tạo nếu bạn không tắt viết lại ở bước 1
Bước 3: Tạo lại permalinks cho loại bài đăng tùy chỉnh của bạn 'đẹp' một lần nữa
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 );
LƯU Ý: Bạn có thể dừng ở đây nếu bạn không lo lắng về việc người dùng của mình tạo bài đăng xung đột (trùng lặp) trong một loại bài đăng khác sẽ tạo ra tình huống chỉ một trong số họ có thể tải khi trang được yêu cầu.
Bước 4: Ngăn chặn các bài đăng trùng lặp
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 );
LƯU Ý: Điều này sẽ nối chuỗi 'lặp lại' vào cuối của bất kỳ sên trùng lặp nào. Mã này không thể ngăn ngừa sên trùng lặp nếu chúng đã tồn tại trước khi thực hiện giải pháp này. Hãy chắc chắn để kiểm tra trùng lặp đầu tiên.
Tôi rất muốn nghe lại từ bất cứ ai khác đưa ra điều này để xem liệu nó có hoạt động tốt cho họ không.