Benutzerdefinierte Post-Typ-Taxonomien URL-Rewrite

Was ich erreichen möchte, ist ein Online-Katalog mit einer URL wie dieser:

www.example.com/drawing-tools/brand/type/material/color/ 

In diesem Beispiel habe ich einen benutzerdefinierten Post-Typ namens “drawing-tools” mit 4 benutzerdefinierten Taxonomien dafür: “Marke”, “Typ”, “Material”, “Farbe”

Wenn ein Benutzer auf eine URL wie folgt zugreift:

 www.example.com/drawing-tools/rotring/mechanical-pencil/plastic/black/ 

Es werden alle Elemente angezeigt, die diesen Kriterien entsprechen.

Der schwierige Teil ist, dass alle Taxonomien in einer URL sein müssen. So etwas wie das:

 www.example.com/drawing-tools/plastic/black/ 

würde einfach eine 404-Fehlerseite zurückgeben.

Also meine Hauptfrage ist:

Wie genau kann ich alle Taxonomien in der URL in diesem Formular haben und eine 404-Fehlerseite zurückgeben, wenn eine Taxonomie fehlt?

Ich dachte daran, eine Rewrite-Regel zu schreiben, die diese Uri-Segmente übernehmen und als Argumente an eine Abfrage übergeben würde, die auf dem ‘Query Multiple Taxonomies’- Plugin basiert und den 404-Fehler zurückgibt, wenn ein Segment fehlt. Aber ich weiß nicht, wie ich das erreichen soll. Gibt es irgendwelche Lösungen, die du mir geben kannst?

[Update 1]

Die Rewrite-Regel würde grundsätzlich diese URL übernehmen:

 www.example.com/drawing-tools/rotring/mechanical-pencil/plastic/black/ 

und mach es zu:

 www.example.com/?drawing-tools_name=rotring+mechanical-pencil+plastic+black 

Die obige Struktur wird vom Plugin “Abfrage mehrerer Taxonomien” benötigt .

[Update 2]

Ich habe das Query Multiple Taxonomies Plugin aufgegeben und bin stattdessen zu WP 3.1 gewechselt. Jetzt, mit der Hilfe dieser letzten Frage, habe ich es geschafft, diese Taxonomien so zu bearbeiten, wie ich es wollte.

Hier ist der vollständige Code:

 register_post_type('drawing-tools', array( 'labels' => array( 'name' => __( 'Drawing Tools' ), 'singular_name' => __( 'Drawing Tool' ), 'add_new' => __( 'Add New' ), 'add_new_item' => __( 'Add New Drawing Tool' ), 'edit' => __( 'Edit' ), 'edit_item' => __( 'Edit Drawing Tool' ), 'new_item' => __( 'New Drawing Tool' ), 'view' => __( 'View Drawing Tools' ), 'view_item' => __( 'View Drawing Tool' ), 'search_items' => __( 'Search Drawing Tools' ), 'not_found' => __( 'No items found' ), 'not_found_in_trash' => __( 'No items found in trash' ), 'parent' => __( 'Parent Drawing Tool' ), ), 'public' => true, 'publicly_queryable' => false, 'show_in_nav_menus' => false, 'exclude_from_search' => false, 'show_ui' => true, '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'rewrite' => array("slug" => "drawing-tools/%brand%/%type%/%material%/%color%"), // Permalinks format 'has_archive' => false, 'menu_position' => 5, 'supports' => array('author') )); register_taxonomy('brand',array('drawing-tools'), array( 'hierarchical' => false, 'labels' => array( 'name' => _x( 'Brands', 'taxonomy general name' ), 'singular_name' => _x( 'Brand', 'taxonomy singular name' ), 'search_items' => __( 'Search Brands' ), 'all_items' => __( 'All Brands' ), 'parent_item' => __( 'Parent Brand' ), 'parent_item_colon' => __( 'Parent Brand:' ), 'edit_item' => __( 'Edit Brands' ), 'update_item' => __( 'Update Brand' ), 'add_new_item' => __( 'Add New Brand' ), 'new_item_name' => __( 'New Unit Brand' ), 'menu_name' => __( 'Brands' ), ), 'show_ui' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'drawing-tools' ), )); register_taxonomy('type',array('drawing-tools'), array( 'hierarchical' => false, 'labels' => array( 'name' => _x( 'Types', 'taxonomy general name' ), 'singular_name' => _x( 'Type', 'taxonomy singular name' ), 'search_items' => __( 'Search Types' ), 'all_items' => __( 'All Types' ), 'parent_item' => __( 'Parent Type' ), 'parent_item_colon' => __( 'Parent Type:' ), 'edit_item' => __( 'Edit Types' ), 'update_item' => __( 'Update Type' ), 'add_new_item' => __( 'Add New Type' ), 'new_item_name' => __( 'New Type' ), 'menu_name' => __( 'Types' ), ), 'show_ui' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'drawing-tools/%brand%' ), )); register_taxonomy('material',array('drawing-tools'), array( 'hierarchical' => false, 'labels' => array( 'name' => _x( 'Materials', 'taxonomy general name' ), 'singular_name' => _x( 'Material', 'taxonomy singular name' ), 'search_items' => __( 'Search Materials' ), 'all_items' => __( 'All Materials' ), 'parent_item' => __( 'Parent Material' ), 'parent_item_colon' => __( 'Parent Material:' ), 'edit_item' => __( 'Edit Material' ), 'update_item' => __( 'Update Material' ), 'add_new_item' => __( 'Add New Material' ), 'new_item_name' => __( 'New Material Name' ), 'menu_name' => __( 'Materials' ), ), 'show_ui' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'drawing-tools/%brand%/%type%' ), )); register_taxonomy('color',array('drawing-tools'), array( 'hierarchical' => false, 'labels' => array( 'name' => _x( 'Colors', 'taxonomy general name' ), 'singular_name' => _x( 'Color', 'taxonomy singular name' ), 'search_items' => __( 'Search Colors' ), 'all_items' => __( 'All Colors' ), 'parent_item' => __( 'Parent Color' ), 'parent_item_colon' => __( 'Parent Color:' ), 'edit_item' => __( 'Edit Color' ), 'update_item' => __( 'Update Color' ), 'add_new_item' => __( 'Add New Color' ), 'new_item_name' => __( 'New Color Name' ), 'menu_name' => __( 'Colors' ), ), 'show_ui' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'drawing-tools/%brand%/%type%/%material%' ), )); function filter_post_type_link($link, $post) { if ($post->post_type != 'drawing-tools') return $link; if ($cats = get_the_terms($post->ID, 'brand')) $link = str_replace('%brand%', array_pop($cats)->slug, $link); if ($cats = get_the_terms($post->ID, 'type')) $link = str_replace('%type%', array_pop($cats)->slug, $link); if ($cats = get_the_terms($post->ID, 'material')) $link = str_replace('%material%', array_pop($cats)->slug, $link); if ($cats = get_the_terms($post->ID, 'color')) $link = str_replace('%color%', array_pop($cats)->slug, $link); return $link; } add_filter('post_type_link', 'filter_post_type_link', 10, 2); 

Wenn ein Benutzer auf den Link zugreift:

 www.example.com/drawing-tools/rotring/mechanical-pencil/plastic/black/ 

Alles funktioniert wie erwartet. Das Problem ist, dass der Benutzer auch auf eine Teilstruktur wie diese zugreifen kann

 www.example.com/drawing-tools/rotring/ 

und erhalten immer noch Ergebnisse nach diesen Taxonomien.

Wie kann ich einen Benutzer davon abhalten, auf eine solche URL zuzugreifen, und stattdessen eine 404-Fehlermeldung ausgeben?

Solutions Collecting From Web of "Benutzerdefinierte Post-Typ-Taxonomien URL-Rewrite"

Ich glaube, in WP 3.1 wurde ein Fix für das eingeführt, was Sie beschreiben … aus dem Codex:

  • Custom Content Type Improvements – ermöglicht Entwicklern das Generieren von Archivseiten und bessere Menü- und functionskontrollen. Lesen Sie mehr im Artikel Beitragstypen.
  • Erweiterte Abfragen – ermöglicht Entwicklern die Abfrage mehrerer Taxonomien und benutzerdefinierter Felder

Ich habe noch keine dieser Verbesserungen verwendet, daher kann ich nicht speziell dazu kommentieren, aber es scheint, als ob Sie das suchen. Viel Glück!

Die Lösung ist ziemlich einfach und ich weiß nicht, warum ich so lange gebraucht habe, um sie im Codex zu finden. Sie müssen die $wp_query class verwenden.

Legen Sie also in der Vorlage vor dem Aufruf der Schleife eine Variable fest, die die zurückgegebenen Daten enthält:

 $vars = $wp_query->query_vars; 

Und dann, überprüfen Sie, ob die erforderlichen Taxonomien gesetzt sind:

 if ( isset( $vars['brand']) && isset( $vars['type'] ) && isset( $vars['material'] ) && isset( $vars['size'] ) ) 

Wenn sie mit der Schleife fortfahren. Wenn nicht:

 global $wp_query; status_header('404'); $wp_query->set_404(); 

Ich frage mich jedoch, ob dies die optimale Lösung ist.