Definieren Sie Permalinks für benutzerdefinierten Posttyp nach Taxonomie in WP 3.4

Ich möchte kanonische Permalinks für Produkte und Produkttypen erstellen. Ich habe die benutzerdefinierten Post-Typen und die benutzerdefinierte Taxonomie herausgefunden, aber ich weiß nicht, ob es möglich ist, Permalinks mit Taxonomien zu definieren. So wäre mein Workflow zum Beispiel das …

  1. Ich erstelle einen benutzerdefinierten Post-Typ namens Produkte .
  2. Dann erstelle ich eine benutzerdefinierte Taxonomie für Produkttypen .
  3. Dann füge ich einen Produkttyp hinzu, der ‘Stühle’ genannt wird, und füge ein Produkt hinzu, das ‘roter Stuhl’ zu dieser Kategorie genannt wird.

Sobald ich dieses Produkt erstellt habe, wäre die gewünschte Permalink-Struktur zur Anzeige dieses Produkts wie folgt formatiert: ->

http://shop.com/products/chairs/red-chair 

Ist das in WordPress 3.4 möglich? Die Meta-Felder in meinem benutzerdefinierten Beitragstyp ermöglichen die Auswahl der Produkttypen, die für meine benutzerdefinierte Taxonomie definiert sind, und es wird immer nur einen Typ pro Produkt geben.

Wenn möglich, möchte ich auch möglichst alle Eltern der ausgewählten Produktkategorie einbeziehen (wenn beispielsweise die Kategorie “Stühle” ein Kind der Kategorie “Lounge” wäre, wäre die Permalink-Struktur wie folgt ->

 http://shop.com/products/lounge/chairs/red-chair 

Hier ist, wie ich den benutzerdefinierten Post-Typ und die benutzerdefinierte Taxonomie erstellen, ich brauche nur Hilfe beim Definieren von Rewrite / Slug-Regeln, um den Produkttyp in den Permalink aufzunehmen.

 /* Custom Post Type - Products ------- */ function products_init() { $args = array( 'public' => true, 'label' => 'Products' ); register_post_type( 'products', $args ); } add_action( 'init', 'products_init' ); /* Custom Taxonomy - Product Type ------- */ add_action( 'init', 'create_prodtype' ); function create_prodtype() { $labels = array( 'name' => _x( 'Product Type', 'products' ), 'singular_name' => _x( 'Product Category', 'product' ), 'search_items' => __( 'Search Product Types' ), 'all_items' => __( 'All Product Types' ), 'parent_item' => __( 'Products' ), 'parent_item_colon' => __( 'Products:' ), 'edit_item' => __( 'Edit Product Type' ), 'update_item' => __( 'Update Product Type' ), 'add_new_item' => __( 'Add New Product Type' ), 'new_item_name' => __( 'New Product Type' ), ); register_taxonomy( 'products', array('products'), array( 'rewrite' => array( 'slug' => 'products', 'hierarchical' => true ), 'with_front' => false, 'labels' => $labels )); } 

Solutions Collecting From Web of "Definieren Sie Permalinks für benutzerdefinierten Posttyp nach Taxonomie in WP 3.4"

Lösung

Ich habe es mit Hilfe dieser Posts von Jan Fabry herausgefunden ->

https://wordpress.stackexchange.com/a/5478/10350 https://wordpress.stackexchange.com/a/22490/10350

Ich habe den benutzerdefinierten Beitragstyp wie folgt eingerichtet ->

  • Benutzerdefinierter Beitragstyp (register_post_type) -> “product”
  • Taxonomie (Register_taxonomie) -> “Produkttyp”

Back-End-function

Ich überschreibe die Permalink-Struktur, die im Backend gespeichert ist, so dass der Permalink so gespeichert wird, dass er den benutzerdefinierten Taxonomie-Typ “Produkttyp” enthält

 add_filter('post_type_link', 'product_type_permalink', 10, 4); function product_type_permalink($post_link, $post, $leavename, $sample) { //If is custom post type "product" if ($post->post_type == 'product') { // Get current post object global $post; // Get current value from custom taxonomy "product-type" $terms = get_the_terms($post->id, 'product-type'); // Define category from "slug" of taxonomy object $term = $terms[0]->slug; // Re-structure permalink with string replace to include taxonomy value and post name $permalink = str_replace('product/', 'product/' . $term . '/', $post_link); } return $permalink; } 

Setzen Sie die Permalink-Einstellung auf “Post name” und speichern Sie sie. Wenn Sie ein Produkt zu einer Kategorie hinzufügen und speichern, sollte es den Permalink neu schreiben, um die Definition der Customy-Taxonomie einzuschließen, in diesem Fall “Produkttyp”. Wenn Sie also “Roter Stuhl” zur Kategorie “Stühle” hinzufügen, wird die URL wie folgt formatiert ->

 http://website.com/product/chairs/red-chair/ 

Wenn Sie jedoch versuchen, auf diese Seite zu gelangen, erhalten Sie einen 404-Fehler. Das liegt daran, dass WordPress noch nicht weiß, wie man die database mit dieser URL abfragt, also muss man sie schreiben.

Front-End-function

Wir müssen Rewrite-Regeln hinzufügen, damit WordPress unsere URL übernehmen und die database abfragen kann. Wir verwenden die WordPress-function add_rewrite_rule , um den angegebenen Permalink in eine Abfrage-Zeichenfolge zu übersetzen.

 add_rewrite_rule( // The regex to match the incoming URL 'product/([^/]+)/([^/]+)/?', // The resulting internal URL: `index.php` because we still use WordPress // `pagename` because we use this WordPress page // `designer_slug` because we assign the first captured regex part to this variable 'index.php?product-type=$matches[1]&product=$matches[2]', // This is a rather specific URL, so we add it to the top of the list // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win" 'top' ); 

In dieser function wird das Übereinstimmungsarray durch WordPress definiert, wobei die angegebene Zeichenfolge bei jedem Schrägstrich explodiert. In diesem Beispiel wird der reguläre Ausdruck ([^/]+) verwendet, um alles zwischen jedem Schrägstrich abzugleichen. In diesem Beispiel gibt es 2 Ebenen, also stimmt es mit dem Produkttyp und dann mit dem Produkt überein und fügt sie dem Matches-Array hinzu, wobei Produkttyp = $ 1 entspricht und Produkt = $ 2 entspricht .

Diese Rewrite-Regel übersetzt dies ->

 product/chairs/red-chair/ 

In diese ->

 index.php?product-type=chair&product=red-chair 

Welche database kann die database abfragen und die korrekte Produktseite mit dem formatierten Permalink zurückgeben.

Dies führt dazu, dass produkttypische Seiten weggeworfen werden, da es nur eine Ebene in der URL des Produkttyps gibt. Dies bedeutet, dass die Rewrite-Regel derzeit immer versucht, den in der Abfragezeichenfolge definierten Produktnamen zu identifizieren. Deshalb schreiben wir auch eine Ein-Level-Rewrite-Regel:

 add_rewrite_rule('^product/([^/]*)?$','index.php?product-type=$matches[1]','top'); 

Dies wird nun auch nach Produkttypseiten fragen, so dass wir einfach die Taxonomie als normale Schleife durchlaufen können, wenn wir die verschiedenen Produkttypen anzeigen wollen, ohne 404 Fehler zu erzeugen, wenn wir versuchen, sie zu verlinken.

Nachteil

Dies wird derzeit nur eine einzige Taxonomieebene erfordern, sodass die benutzerdefinierte Taxonomiestruktur nicht hierarchisch sein kann. Wenn Sie mehr als eine Taxonomie angeben, wird zum Definieren des Permalinks die erste mit der ersten ID verwendet. Eine mögliche Abhilfe hierfür ist, das benutzerdefinierte Taxonomie-Menü auszublenden, das in der Seitenleiste von benutzerdefinierten Post-Typen angezeigt wird, und ein Metabox für Taxonomie hinzuzufügen, wo nur ein Auswahlfeld verwendet werden kann. Ich benutze dazu das Meta Box Plugin . (NB, dieses Plugin hat keine Admin-Menüs, es erlaubt Ihnen, Meta-Boxen für benutzerdefinierte Post-Typen in Ihrer functions.php nur durch Erstellen von Arrays zu schreiben – sehr empfehlenswert!)