Verwenden von /% Postname% für einen benutzerdefinierten Posttyp

Ich habe einen benutzerdefinierten Beitragstyp, dessen Permalink im selben Bereich wie die Seiten gespeichert werden muss:

/an-example-thing <-- custom post type 'thing' /about-the-things <-- a normal page 

Ich bin mir bewusst, dass dies nicht der empfohlene Weg ist , aber ich habe wirklich keine Wahl – das hat der Kunde gesagt.

Ich habe die benutzerdefinierten Typen mit register_post_type erstellt und das Plug- in für benutzerdefinierte Post-Permalinks verwendet , um ihren Permalink wie folgt festzulegen:

 /%thing%/ 

Dies führt jedoch zu einem Konflikt zwischen der Regel, die meine benutzerdefinierten Beiträge erkennt, und der Regel für normale Seiten – die alle normalen Seiten in 404 verwandelt. Dieses Problem verschwindet, wenn der Permalink in etwa wie folgt geändert wird:

 /things/%thing%/ 

Die Verwendung des Monkeyman Rewrite Analyzers zeigt, dass die Regel für den benutzerdefinierten Beitrag zuerst kommt. Auch wenn ich versuche, es zu verbalen Regeln zu zwingen:

 global $wp_rewrite; $wp_rewrite->use_verbose_page_rules = true; 

Die benutzerdefinierte Post-Typregel hat eine höhere Priorität als die ausführlichen Regeln für Seiten, sodass sie immer noch eine 404-Regel erhalten.

Ich möchte, dass es zuerst nach den Dingen sucht, und wenn keiner mit diesem Namen gefunden wird, suche nach Seiten. Der umgekehrte Weg wäre akzeptabel. Gibt es keine Möglichkeit, sie davon zu überzeugen, sowohl nach Dingen als auch nach Seiten zu suchen, bevor sie einen 404 treffen?

Solutions Collecting From Web of "Verwenden von /% Postname% für einen benutzerdefinierten Posttyp"

Sie beginnen mit einem Bonuspunkt für die Verwendung meines Rewrite Analyzers 🙂

In der Tat, sogar wenn Sie ausführliche Seitenregeln verwenden, kommen die Regeln zum Umschreiben der Taxonomie seit Version 3.1 (oder etwas in der Umgebung) sogar schon davor. Ich habe vor kurzem eine andere Frage mit einer Möglichkeit beantwortet , sie wirklich an die Spitze zu bringen. Dies sollte funktionieren, wenn es Ihnen nichts ausmacht, ausführliche Seitenregeln zu haben (wenn Sie nicht mehr als 25 Seiten haben).

Wenn Sie keine ausführlichen Seitenregeln benötigen, müssen Sie die WP coreklasse erweitern, damit sie mit “mehrdeutigen” Situationen umgehen kann, in denen die URL auf eine Seite oder einen benutzerdefinierten Posttyp verweisen kann. Mike hat einmal einen schönen Weg dafür geboten . Seine Antwort wird für eine benutzerdefinierte Taxonomie geschrieben, sollte aber auch an einen benutzerdefinierten Beitragstyp angepasst werden können.

Ich habe eine Lösung gefunden, aber es ist wirklich hässlich: hook in 404 Routing , um die Seite zu liefern, die geliefert werden soll. Der Code ist etwas kompliziert, weil ich auch ein Multi-Site-Präfix haben muss.

Thema / 404.php

 < ?php global $current_blog; $prefix = $current_blog->path; $path = $_SERVER['REQUEST_URI']; $path = preg_replace("!^$prefix!i", "", $path); $path = preg_replace("!\?.*$!i", "", $path); $path = trim($path, '/'); $page = get_page_by_path($path); if (isset($page)) { $template = get_post_meta($page->ID, '_wp_page_template', true); if (empty($template)) $template = get_page_template(); query_posts("post_type=page&id={$page->ID}"); include($template); die; } ?> ...actually handle a 404... 

Nachdem eine Seite identifiziert wurde, muss sie erneut query_posts , um alle Daten korrekt zu laden. Dies ist bei weitem nicht die ideale Lösung, aber es hat zumindest für mich funktioniert. Ich würde es gerne durch eine bessere Lösung ersetzen, wenn jemand eine vorschlagen könnte.

Es gibt zwei Plugins, die dieses Problem beheben.

Dieser entfernt den Typ-Slug, indem er für jede benutzerdefinierte Post-Typ-Seite eine spezifische Regel hinzufügt.

Dieser scheint etwas fortgeschrittener zu sein, er erlaubt es Ihnen, jede gewünschte Slug-Struktur zu erstellen, aber er wird auch vom Entwickler aufgegeben.

Ich habe beide zur Arbeit gebracht, obwohl ich anfangs mit dem Monkeyman Rewrite Analyzer debuggen musste, weil einige andere Regeln störten.