Buradaki cevaplara bakarak, yukarıda öğrendiğim bazı şeyleri birleştiren ve yinelenen post sümüklü böceklerin otomatik algılanmasını ve önlenmesini ekleyen daha iyi bir çözüme yer olduğunu düşünüyorum.
NOT: Aşağıdaki örneğim boyunca kendi CPT adınız için 'custom_post_type' öğesini değiştirdiğinizden emin olun. Birçok olay vardır ve 'bul / değiştir' hepsini yakalamanın kolay bir yoludur. Bu kodun tümü functions.php dosyasına veya bir eklentiye girebilir.
Adım 1: Gönderiyi kaydettiğinizde yeniden yazmaları 'false' olarak ayarlayarak özel yazı türünüzdeki yeniden yazmaları devre dışı bırakın:
register_post_type( 'custom_post_type',
array(
'rewrite' => false
)
);
Adım 2: Özel yeniden yazmalarımızı, custom_post_type için WordPress yeniden yazmalarının altına elle ekleyin.
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' );
NOT: İhtiyaçlarınıza bağlı olarak, yukarıdaki tekrar yazmaları değiştirmek isteyebilirsiniz (geri izlemeleri devre dışı bırak? Beslemeleri? Vb.). Bunlar, 1. adımdaki yeniden yazmaları devre dışı bırakmazsanız oluşturulmuş olan 'varsayılan' yeniden yazma türlerini temsil eder.
3. Adım: Özel yazı türünüze tekrar 'güzel' olarak kalıcı bağlantılar kurun
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 );
NOT: Kullanıcılarınızın, sayfa istendiğinde yalnızca birinin yükleyebileceği bir durum oluşturacak başka bir gönderi türünde çakışan (yinelenen) bir gönderi oluşturma konusunda endişelenmiyorsanız burada durabilirsiniz.
Adım 4: Çift posta sümüklü böceklerini engelleyin
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 );
Not: Bu '-duplicate' dizesini yinelenen tüm sümüklerin sonuna ekler. Bu kod, bu çözümü uygulamadan önce mevcutsa, yinelenen sümüklü böcekleri engelleyemez. Önce kopyaları kontrol ettiğinizden emin olun.
Bunu kendileri için de işe yarayıp yaramadığını görmek için gitmek isteyen başka birinden geri duymak isterim.