web-dev-qa-db-fra.com

Réécriture d'URL de taxonomies de type post personnalisé

Ce que je veux réaliser est un catalogue d'annonces en ligne avec une URL comme celle-ci:

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

Dans cet exemple, j'ai un type de message personnalisé appelé "drawing-tools" avec 4 taxonomies personnalisées: "marque", "type", "matériau", "couleur".

Lorsqu'un utilisateur accède à une URL telle que:

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

il obtient tous les éléments qui correspondent à ces critères.

La difficulté réside dans le fait que toutes les taxonomies doivent figurer dans une URL. Donc, quelque chose comme ça:

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

renverrait simplement une page d'erreur 404.

Donc ma question principale est:

Comment puis-je avoir exactement toutes les taxonomies dans l'URL sous cette forme et retourner une page d'erreur 404 si une taxonomie est manquante?

Je pensais écrire une règle de réécriture qui prendrait ces segments uri et les transmettrait comme arguments à une requête basée sur le plug-in 'Query Multiple Taxonomies' et renverrait cette erreur 404 si un segment manquait. Mais je ne sais pas comment y arriver. Y a-t-il des solutions que vous pouvez me donner?

[Mise à jour 1]

La règle de réécriture prendrait essentiellement cette URL:

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

et en faire:

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

La structure ci-dessus est requise par le plugin 'Query Multiple Taxonomies' .

[Mise à jour 2]

J'ai abandonné le plugin Query Multiple Taxonomies et à la place je suis passé à WP 3.1. Maintenant, avec l'aide de cette question précédente J'ai réussi à mettre au travail ces taxonomies comme je le voulais.

Voici le code complet:

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);

Maintenant, quand un utilisateur accède au lien:

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

tout fonctionne comme prévu. Le problème est que l'utilisateur peut également accéder à une structure partielle comme celle-ci.

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

et toujours obtenir des résultats en fonction de ces taxonomies.

Comment puis-je empêcher un utilisateur d'accéder à une telle URL et de retourner un message d'erreur 404?

4
Jaquis

La solution est assez simple et je ne sais pas pourquoi cela m'a pris si longtemps pour la trouver dans le Codex. Vous devez utiliser la classe $wp_query.

Ainsi, dans le modèle, avant d'appeler la boucle, définissez une variable pour contenir les données renvoyées:

$vars = $wp_query->query_vars;

Et ensuite, vérifiez si les taxonomies requises sont définies:

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

Si elles sont continuer avec la boucle. Si non:

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

Je me demande toutefois si cette solution est la plus optimale.

1
Jaquis

Je crois que WP 3.1 a introduit un correctif pour ce que vous décrivez ... à partir du codex:

  • Améliorations du type de contenu personnalisé - permet aux développeurs de générer des pages d'archive et d'avoir de meilleurs contrôles de menu et de fonctionnalité. Lire la suite dans l'article Post Types.
  • Requêtes avancées - permet aux développeurs d'interroger plusieurs taxonomies et champs personnalisés

Je n'ai encore utilisé aucune de ces améliorations, je ne peux donc pas en parler, mais c'est ce que vous recherchez. Bonne chance!

2
Taylor Dewey