Benutzerdefinierte Taxonomie und Seiten umschreiben Slug Konflikt gibt 404

9

Ich verwende das UI-Plugin für benutzerdefinierte Post-Typen, um meine benutzerdefinierten Taxonomien zu erstellen. Ich habe ein Portfolio, das aus Projekten (benutzerdefinierter Beitragstyp) mit 2 benutzerdefinierten Taxonomien von Technologien und Kunden besteht. Die Taxonomie des Kunden verfügt über einen benutzerdefinierten Umschreibungsbereich von portfolio/clients/, während die Technologietaxonomie einen benutzerdefinierten Umschreibungsbereich von hatportfolio/

Umschreiben:
portfolio/html <- Seite zeigt alle Projekte mit HTML an
portfolio/clients/client-a<- Seite zeigt alle Projekte für Client A an

Wenn ich jetzt versuche, eine Zielseite für Kunden zu erstellen, die einen URL-Slug von hat, /portfolio/clientserhalte ich die 404-Seite. Ich bin mir ziemlich sicher, dass dies auf widersprüchliche URL-Umschreibungen der Taxonomie der Technologien zurückzuführen ist. Ich vermute, da es in der Technologietaxonomie danach sucht, existiert es nicht, dann spuckt es die 404-Seite aus. Wie kann ich also erreichen, dass der URL-Umschreib-Slug funktioniert, sodass beim /portfolio/clientsDrücken die 404-Seite nicht zurückgesendet wird und die richtige Seitenvorlage verwendet wird?

Johannes Pille
quelle

Antworten:

16

Sie scheinen "teilweise ausführliche Umschreiberegeln" zu benötigen. Ausführliche Umschreiberegeln bedeuten, dass alle Seiten oben platziert werden, da WordPress den Unterschied zwischen einer Seite und einem Beitrag nicht herausfinden kann. Hier glaubt es, dass es möglich ist, da alle URLs des Formulars portfolio/([^/]+)/aus Ihrer portfolioTaxonomie stammen, mit Ausnahme dieser portfolio/clients/. Sie müssen dieses über die Umschreiberegeln setzen, damit es vor der allgemeineren Portfolio-Taxonomie übereinstimmt. Sie könnten wahrscheinlich auch erzwingen, dass alle Umschreiberegeln ausführlich sind. Dies wirkt sich jedoch auf die Leistung aus, wenn Sie viele Seiten haben.

Diese Antwort wurde mit meinem soeben gewonnenen Verständnis der Umschreiberegeln geschrieben. Ich hoffe, dass dies eine gute Möglichkeit ist und der Beispielcode nicht zu viele Fehler enthält.

Eine Seite generiert nicht nur eine Umschreiberegel, sondern eine Gruppe:

  • (pagename)/trackback/?$
  • (pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/page/?([0-9]{1,})/?$
  • (pagename)/comment-page-([0-9]{1,})/?$
  • (pagename)(/[0-9]+)?/?$

Sie müssen diese nicht selbst erstellen, sondern können die Leistung von wiederverwenden WP_Rewrite. Schauen Sie sich die page_rewrite_rules()Methode an: Wenn wir uns im ausführlichen Modus befinden, wird eine Liste aller Seiten (via page_uri_index()) und ihrer Anhänge abgerufen, das %pagename%Umschreibetag überschrieben und die Umschreiberegeln für diese Seite generiert. Das können wir auch:

// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);

Dies gibt uns die Regeln für die Seiten, aber noch nicht für die auf der Seite verwendeten Anhänge. Wenn Sie sie auch möchten, wiederholen Sie den Schritt für jeden Anhang, jedoch mit add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')(siehe page_rewrite_rules()für weitere Details).

Gut, wir haben die Regeln, aber jetzt müssen Sie sie auf irgendeine Weise zur vollständigen Umschreibestruktur hinzufügen. Sie können dies mit tun add_rewrite_rule(), müssen es jedoch für jede im $page_rewrite_rulesArray generierte Regel aufrufen . Aus diesem Grund schließen sich viele Leute dem rewrite_rules_arrayFilter an , da Sie das Array dort einfach ändern können.

add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
    global $wp_rewrite;

    // The previous code snippet comes here, where we generate $page_rewrite_rules

    // Our rules have priority, they should be on top
    $rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);

    return $rewrite_rules;
}

Nachdem Sie diesen Filter eingefügt haben, sollten Sie die Umschreiberegeln löschen (einmal, nicht bei jedem Laden einer Seite, da er ziemlich schwer ist). Sie können dies tun, indem Sie anrufen flush_rewrite_rules()oder die Einstellungsseite "Permalinks" besuchen.

Jan Fabry
quelle
Ausgezeichnet! Danke Jan! Das hat funktioniert. Ich hätte keine bessere Erklärung erhalten können.