Custom Post Type Slug / Page Slug Conflict - Verhindern Sie die Verwendung eines reservierten Slugs beim Speichern von Seiten?

13

Ich habe ein benutzerdefiniertes Post-Portfolio (Slug-Portfolio) in meinem Thema und alles funktioniert gut, bis auf eine Sache. Wenn Benutzer eine Seite mit einer Portfoliostrecke erstellen, z. B. example.com/portfolio, wird dem Thema zufolge die benutzerdefinierte Archivseite für Beitragstypen verwendet, nicht meine im Editor erstellte Seite.

Kann ich das Slug-Portfolio irgendwie "reservieren", wenn Seiten gespeichert werden, um sicherzustellen, dass es niemals verwendet wird, oder umbenannt in Portfolio-Seite?

In meinem Projekt werden die in diesem Lernprogramm beschriebenen Methoden verwendet. Hier ist der Konflikt, auf den ich mich beziehe:

"Abgesehen davon, dass Sie den Code patchen müssen, gibt es hier noch einen weiteren Haken: Sie können Ihren Page-Slug nicht genauso nennen wie Ihren benutzerdefinierten Post-Typ-Slug. Stellen Sie sich Ihren benutzerdefinierten Post-Typ-Slug als reserviertes Schlüsselwort vor Der Titel Ihrer Seite hat den gleichen Namen wie Ihr benutzerdefinierter Beitragstyp "slug", solange sich Ihr Seiten-Slug von diesem unterscheidet. " - http://wp.tutsplus.com/tutorials/custom-post-type-pagination-chaining-method/

Danke für jeden Rat!

hhins
quelle
Eine Option, die ich sehe, wäre, dies aus register_post_type () zu entfernen: 'rewrite' => array ('slug' => 'portfolio', 'with_front' => true), und einfach 'rewrite' => false und Lebe einfach mit den hässlichen "einzelnen" Portfolio-Gegenständen.
hhins
Stimmen Sie für Ihre Frage ab, denn auch ich möchte die Antwort wissen! Ich habe ein paar Mal mit benutzerdefinierten Posts gearbeitet, aber das ist mir nie aufgefallen. Nachdem ich Ihre Frage gelesen habe, habe ich es versucht. Du hast recht, WordPress wird hier verwirrt!
Rutwick Gangurde

Antworten:

13

Mit den folgenden 2 Filtern können Sie sich einbinden, wenn WordPress den Slug überprüft. Sie finden sie in der Funktion wp_unique_post_slug () in der Datei wp-includes / post.php.

Es gibt zwei Filter, einen für hierarchische Posts und einen für nicht hierarchische. Der hierarchische Filter liefert die ID für das übergeordnete Element des Posts. Wenn also $ post_parent 0 ist, wissen Sie, dass es sich um einen "Basispost" handelt.

Die Filter übergeben auch den $ post_type, wenn Sie Ihrer Logik bestimmte Post-Typen hinzufügen möchten.

Wenn Sie "true" zurückgeben, teilen Sie WordPress mit, dass dieser Slug schlecht ist, und WordPress fügt ein Suffix hinzu, so wie es der Fall wäre, wenn Sie versuchen würden, uns einen bereits belegten Postnamen / Slug zuzuweisen.

add_filter( 'wp_unique_post_slug_is_bad_hierarchical_slug', 'portfolio_is_bad_hierarchical_slug', 10, 4 );
function portfolio_is_bad_hierarchical_slug( $is_bad_hierarchical_slug, $slug, $post_type, $post_parent ) {
    if ( !$post_parent && $slug == 'portfolio' )
        return true;
    return $is_bad_hierarchical_slug;
}

add_filter( 'wp_unique_post_slug_is_bad_flat_slug', 'portfolio_is_bad_flat_slug', 10, 3 );
function portfolio_is_bad_flat_slug( $is_bad_flat_slug, $slug, $post_type ) {
    if ( $slug == 'portfolio' )
        return true;
    return $is_bad_flat_slug;
}
Rachel Carden
quelle
Aus irgendeinem Grund stehe ich immer noch vor dem gleichen Problem
Tan-007
1

Erstellen Sie eine Seite mit einer Portion "Portfolio" und machen Sie sie "Privat". Es wird vor der Öffentlichkeit verborgen, wenn der Slug für die weitere Verwendung reserviert wird.

Max Yudin
quelle
1

Ist genau diesem Problem bei der Untersuchung eines Paginierungsproblems begegnet. Wir haben eine News-Homepage (Slug "News") und die Paginierung schlug fehl ... Versuche, zu / news / page / 2 / zu gelangen, führten immer zu "404 - Not Found".

Das Problem stellte sich heraus, dass unserem benutzerdefinierten Typ "News" auch der Slug "News" zugewiesen wurde. Durch Ändern des letzteren (zum Beispiel in "news_archive") wurde das Problem behoben. Dadurch wurden die ursprünglichen Nachrichten-URL-Verweise nicht geändert. Das Ändern des News-Homepage-Slugs funktionierte auch, aber dann würden alle URLs den geänderten Slug enthalten.

Ross
quelle