Melihat melalui jawaban di sini saya pikir ada ruang untuk solusi yang lebih baik yang menggabungkan beberapa hal yang saya pelajari di atas dan menambahkan deteksi otomatis dan pencegahan siput pos duplikat.
CATATAN: Pastikan Anda mengubah 'custom_post_type' untuk nama CPT Anda sendiri di seluruh contoh saya di bawah ini. Ada banyak kejadian, dan 'temukan / ganti' adalah cara mudah untuk menangkap semuanya. Semua kode ini bisa masuk ke functions.php Anda atau dalam sebuah plugin.
Langkah 1: Nonaktifkan penulisan ulang pada jenis posting kustom Anda dengan mengatur penulisan ulang ke 'false' ketika Anda mendaftarkan posting:
register_post_type( 'custom_post_type',
array(
'rewrite' => false
)
);
Langkah 2: Secara manual menambahkan penulisan ulang kustom kami ke bagian bawah penulisan ulang WordPress untuk custom_post_type kami
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' );
CATATAN: Bergantung pada kebutuhan Anda, Anda mungkin ingin memodifikasi penulisan ulang di atas (nonaktifkan trackback? Feed ?, dll). Ini mewakili jenis penulisan ulang 'default' yang akan dihasilkan jika Anda tidak menonaktifkan penulisan ulang di langkah 1
Langkah 3: Buat tautan permanen ke jenis posting khusus Anda 'cantik' lagi
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 );
CATATAN: Anda dapat berhenti di sini jika Anda tidak khawatir tentang pengguna Anda membuat posting (duplikat) yang saling bertentangan dalam jenis posting lain yang akan menciptakan situasi di mana hanya satu dari mereka yang dapat memuat ketika halaman diminta.
Langkah 4: Mencegah duplikat posting siput
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 );
CATATAN: Ini akan menambahkan string '-duplikat' ke akhir setiap siput duplikat. Kode ini tidak dapat mencegah duplikat siput jika sudah ada sebelum menerapkan solusi ini. Pastikan untuk memeriksa duplikat terlebih dahulu.
Saya akan senang mendengar kabar dari orang lain yang mencoba untuk melihat apakah itu bekerja dengan baik untuk mereka juga.