benutzerdefinierte Taxonomie und Seiten umschreiben Slug-Konflikt gibt 404

Ich verwende das benutzerdefinierte Post-Typ-UI-Plugin, um meine benutzerdefinierten Taxonomien zu erstellen. Ich habe ein Portfolio, das aus Projekten (benutzerdefinierte Post-Typ) mit 2 benutzerdefinierten Taxonomien von Technologien und Clients besteht. Die Mandanten-Taxonomie hat einen benutzerdefinierten Neuschreiben-Slug des portfolio/clients/ , während die Technologietaxonomie einen benutzerdefinierten Neuschreiben-Slug des portfolio/

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

Wenn ich nun versuche, eine Zielseite für Clients zu erstellen, die einen URL-Block von /portfolio/clients bekomme ich die 404-Seite. Ich bin mir ziemlich sicher, dass dies auf widersprüchliche Url-Umschreibungen der Technologietaxonomie zurückzuführen ist. Ich schätze, da es in der Technologie Taxonomie sucht, existiert es nicht, dann spuckt es die 404 Seite aus. Wie bekomme ich den URL-Rewrite-Slug zum Laufen, so dass, wenn ich /portfolio/clients , er die 404-Seite nicht zurücksendet und die korrekte Seitenvorlage verwendet?

Solutions Collecting From Web of "benutzerdefinierte Taxonomie und Seiten umschreiben Slug-Konflikt gibt 404"

Sie scheinen “teilweise verbose rewrite rules” zu brauchen. Verbose rewrite rules bedeutet, dass alle Seiten oben liegen, da WordPress den Unterschied zwischen einer Seite und einem Post nicht herausfinden kann. Hier denkt es, weil alle URLs des Formularportfolios portfolio/([^/]+)/ aus Ihrer portfolio , mit Ausnahme dieses einen portfolio/clients/ . Sie müssen dieses Element an die Spitze der Umschreibungsregeln setzen, damit es vor der allgemeineren Portfolio-Taxonomie entspricht. Sie könnten wahrscheinlich auch alle Umschreibregeln dazu zwingen, ausführlich zu sein, aber das wird sich auf die performance auswirken, wenn Sie viele Seiten haben.

Diese Antwort ist mit meinem gerade gewonnenen Verständnis von Umschreibungsregeln geschrieben, also hoffe ich, dass es ein guter Weg ist, dies zu tun, und der Beispielcode enthält nicht zu viele Fehler.

Eine Seite generiert nicht nur eine Rewrite-Regel, sondern generiert 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, Sie können die performance von WP_Rewrite . Sehen Sie sich die page_rewrite_rules() -Methode an: Wenn wir im ausführlichen Modus sind, erhält sie eine Liste aller Seiten (über page_uri_index() ) und ihrer Anhänge, überschreibt das %pagename% rewrite -Tag und generiert die Umschreibungsregeln für diese Seite. 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, aber 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 die eine oder andere Weise der vollständigen Umschreibungsstruktur hinzufügen. Sie können dies mit add_rewrite_rule() tun, aber Sie müssen es für jede Regel $page_rewrite_rules Array $page_rewrite_rules generiert wurde. Aus diesem Grund haken sich viele Leute in den rewrite_rules_array Filter ein , da Sie dort das Array einfach modifizieren 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 Rewrite-Regeln (einmal, nicht eine jede Seite laden, wie es ziemlich schwer ist) leeren. Sie können dies tun, indem Sie flush_rewrite_rules() aufrufen oder die Einstellungsseite “Permalinks” aufrufen.