Wenn ich mir die Antworten hier ansehe, gibt es meines Erachtens Raum für eine bessere Lösung, die einige der oben genannten Erkenntnisse kombiniert und die automatische Erkennung und Verhinderung von doppelten Post-Slugs hinzufügt.
HINWEIS: Stellen Sie sicher, dass Sie in meinem Beispiel unten "custom_post_type" für Ihren eigenen CPT-Namen ändern. Es gibt viele Vorkommen, und ein Suchen / Ersetzen ist ein einfacher Weg, um sie alle zu finden. Der gesamte Code kann in Ihrer functions.php oder in einem Plugin gespeichert werden.
Schritt 1: Deaktivieren Sie das erneute Schreiben für Ihren benutzerdefinierten Beitragstyp, indem Sie beim Registrieren des Beitrags das erneute Schreiben auf "false" setzen:
register_post_type( 'custom_post_type',
array(
'rewrite' => false
)
);
Schritt 2: Fügen Sie unsere benutzerdefinierten Umschreibungen manuell am unteren Rand der WordPress-Umschreibungen für unseren benutzerdefinierten Post-Typ hinzu
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' );
HINWEIS: Abhängig von Ihren Anforderungen möchten Sie möglicherweise die obigen Änderungen vornehmen (Deaktivieren von Trackbacks, Feeds usw.). Dies sind die 'Standard'-Arten von Umschreibungen, die generiert worden wären, wenn Sie die Umschreibungen in Schritt 1 nicht deaktiviert hätten
Schritt 3: Erstelle wieder einen Permalink zu deinem benutzerdefinierten Post-Typ "pretty"
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 );
HINWEIS: Sie können hier aufhören, wenn Sie nicht befürchten, dass Ihre Benutzer einen in Konflikt stehenden (doppelten) Beitrag in einem anderen Beitragstyp erstellen, wodurch eine Situation entsteht, in der nur einer von ihnen geladen werden kann, wenn die Seite angefordert wird.
Schritt 4: Verhindern Sie doppelte Pfostenschnecken
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 );
HINWEIS: Dadurch wird die Zeichenfolge '-duplicate' an das Ende aller doppelten Slugs angehängt. Dieser Code kann doppelte Bugs nicht verhindern, wenn diese bereits vor der Implementierung dieser Lösung vorhanden waren. Achten Sie darauf, zuerst nach Duplikaten zu suchen.
Ich würde gerne von allen anderen hören, die dies ausprobieren, um zu sehen, ob es auch für sie gut funktioniert.