it-swarm.com.de

Verwenden von /% postname% für einen benutzerdefinierten Beitragstyp

Ich habe einen benutzerdefinierten Beitragstyp, dessen Permalink sich auf der gleichen Fläche wie die Seiten befinden muss:

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

Mir ist durchaus bewusst, dass dies ist nicht die empfohlene Methode , aber ich habe nicht wirklich eine Wahl - das hat der Kunde angegeben.

Ich habe die benutzerdefinierten Typen mit register_post_type erstellt und das Benutzerdefinierte Post-Permalinks -Plugin verwendet, um den Permalink wie folgt festzulegen:

/%thing%/

Dies führt jedoch zu einem Konflikt zwischen der Regel, die meine benutzerdefinierten Posts erkennt, und der Regel für normale Seiten, bei der alle normalen Seiten in 404-Seiten umgewandelt werden. Dieses Problem verschwindet, wenn der Permalink folgendermaßen geändert wird:

/things/%thing%/

Verwenden des Monkeyman Rewrite Analyzer zeigt, dass die Regel für den benutzerdefinierten Post an erster Stelle steht. Auch wenn ich versuche, es zu erzwingen, um ausführliche Regeln zu verwenden:

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

die Regel für benutzerdefinierte Beitragstypen hat eine höhere Priorität als die ausführlichen Regeln für Seiten, sodass sie weiterhin den Wert 404 erhalten.

Ich möchte, dass es zuerst nach things sucht, und wenn keiner mit diesem Namen gefunden wird, suchen Sie nach Seiten. Der umgekehrte Weg wäre akzeptabel. Gibt es keine Möglichkeit, es zu überreden, sowohl nach things als auch nach Seiten zu suchen, bevor Sie eine 404 treffen?

5
Marcus Downing

Sie beginnen mit einem Bonuspunkt für die Verwendung meines Rewrite-Analysators :-)

Selbst wenn Sie ausführliche Seitenregeln verwenden, kommen die Taxonomie-Umschreibregeln seit Version 3.1 (oder etwas in der Nähe davon) noch vor. Ich habe kürzlich eine andere Frage beantwortet mit einer Möglichkeit, sie wirklich nach oben zu bewegen. 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 möchten, müssen Sie die WP-Kernklasse erweitern, damit sie "mehrdeutige" Situationen bewältigen kann, in denen die URL auf eine Seite oder einen benutzerdefinierten Beitragstyp verweisen kann. Mike bot einmal einen guten Weg, dies zu tun . Seine Antwort ist für eine benutzerdefinierte Taxonomie geschrieben, sollte aber auch für einen benutzerdefinierten Beitragstyp anpassbar sein.

2
Jan Fabry

Ich habe eine Lösung gefunden, aber es ist wirklich hässlich: in 404-Routing einbinden um die Seite zu liefern, die geliefert werden soll. Der Code ist etwas kompliziert, da ich auch ein Präfix für mehrere Standorte habe.

theme/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 query_posts erneut ausführen, um alle Daten korrekt zu laden. Dies ist alles andere als die ideale Lösung, hat aber zumindest bei mir funktioniert. Ich würde es gerne durch eine bessere Lösung ersetzen, wenn jemand eine vorschlagen kann.

0
Marcus Downing

Es gibt zwei Plugins, die dieses Problem beheben.

Dieses entfernt den Typ-Slug, indem eine bestimmte Regel für jede benutzerdefinierte Beitragstyp-Seite hinzugefügt wird.

Dieses scheint fortgeschrittener zu sein, es lässt Sie jede gewünschte Slug-Struktur einrichten, aber es wird auch vom Entwickler aufgegeben.

Ich brachte beide zum Arbeiten, obwohl ich anfangs mit Monkeyman Rewrite Analyzer debuggen musste, weil einige andere Regeln störten.

0
Adam Bell