it-swarm.com.de

Benutzerdefiniertes Umschreiben von Taxonomien für Beitragstyp-URLs

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 Beitragstyp namens "Zeichenwerkzeuge" mit 4 benutzerdefinierten Taxonomien: "Marke", "Typ", "Material", "Farbe".

Wenn ein Benutzer auf eine URL zugreift, wie:

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

es werden alle Elemente abgerufen, die diesen Kriterien entsprechen.

Der schwierige Teil ist, dass alle Taxonomien in einer URL enthalten sein müssen. So etwas in der Art:

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

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

Meine Hauptfrage lautet also:

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 Umschreiberegel zu schreiben, die diese uri-Segmente als Argumente an eine Abfrage übergibt, die auf dem Plugin 'Query Multiple Taxonomies' basiert, und diesen 404-Fehler zurückgibt, wenn ein Segment fehlt. Aber ich weiß nicht, wie ich das erreichen soll. Gibt es irgendwelche Lösungen, die Sie mir geben können?

[Update 1]

Die Umschreiberegel würde im Grunde diese URL annehmen:

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

und mache es zu:

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

Die obige Struktur wird vom 'Query Multiple Taxonomies' Plugin benötigt.

[Update 2]

Ich habe das Plugin "Mehrere Taxonomien abfragen" aufgegeben und stattdessen zu WP 3.1 gewechselt. Nun, mit Hilfe dieser vorherigen 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);

Nun, 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 solche Teilstruktur zugreifen kann

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

und immer noch Ergebnisse nach diesen Taxonomien erhalten.

Wie kann ich verhindern, dass ein Benutzer auf eine solche URL zugreift und stattdessen eine 404-Fehlermeldung zurückgibt?

4
Jaquis

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 Klasse $wp_query verwenden.

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

$vars = $wp_query->query_vars;

Überprüfen Sie anschließend, ob die erforderlichen Taxonomien festgelegt 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 optimalste Lösung ist.

1
Jaquis

Ich glaube, WP 3.1 hat eine Korrektur für das eingeführt, was Sie beschreiben ... aus dem Codex:

  • Verbesserte benutzerdefinierte Inhaltstypen - Ermöglichen Entwicklern das Generieren von Archivseiten sowie eine bessere Menü- und Funktionssteuerung. Lesen Sie mehr im Artikel Beitragstypen.
  • Erweiterte Abfragen - Ermöglicht Entwicklern das Abfragen mehrerer Taxonomien und benutzerdefinierter Felder

Ich habe noch keine dieser Verbesserungen verwendet, daher kann ich keine spezifischen Kommentare abgeben, aber es scheint, als ob Sie danach suchen. Viel Glück!

2
Taylor Dewey