Patrząc na odpowiedzi tutaj, myślę, że jest miejsce na lepsze rozwiązanie, które łączy niektóre rzeczy, których się nauczyłem powyżej, i dodaje automatyczne wykrywanie i zapobieganie duplikatom post ślimaków.
UWAGA: Upewnij się, że zmieniłeś „custom_post_type” dla własnej nazwy CPT w całym moim przykładzie poniżej. Istnieje wiele zdarzeń, a „znajdź / zamień” jest łatwym sposobem na złapanie ich wszystkich. Cały ten kod może przejść w pliku functions.php lub we wtyczce.
Krok 1: Wyłącz przepisywanie niestandardowego typu postu, ustawiając przepisywanie na „fałsz” po zarejestrowaniu postu:
register_post_type( 'custom_post_type',
array(
'rewrite' => false
)
);
Krok 2: Ręcznie dodaj nasze niestandardowe przepisywania na dole przepisywania WordPress dla naszego niestandardowego typu postu
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' );
UWAGA: W zależności od potrzeb możesz zmodyfikować powyższe przepisania (wyłączyć trackbacki? Kanały? Itp.). Reprezentują one „domyślne” typy przepisywania, które zostałyby wygenerowane, gdyby nie wyłączyć przepisywania w kroku 1
Krok 3: Ponownie dodaj permalinki do niestandardowego typu posta jako „ładna”
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 );
UWAGA: Możesz zatrzymać się tutaj, jeśli nie martwisz się, że użytkownicy utworzą sprzeczny (zduplikowany) post w innym typie postu, co spowoduje sytuację, w której tylko jeden z nich będzie mógł zostać załadowany, gdy strona zostanie poproszona.
Krok 4: Zapobiegaj powielaniu ślimaków postowych
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 );
UWAGA: Spowoduje to dołączenie ciągu „-duplikacja” na końcu każdego powielonego ślimaka. Ten kod nie może zapobiec duplikatom ślimaków, jeśli istnieją już przed wdrożeniem tego rozwiązania. Najpierw sprawdź, czy nie ma duplikatów.
Chciałbym usłyszeć od każdego, kto spróbuje to sprawdzić, czy to również dobrze dla nich zadziałało.