web-dev-qa-db-fra.com

Définissez les permaliens pour le type de message personnalisé par taxonomie dans WP 3.4

Je souhaite créer des permaliens canoniques pour des produits et types de produits. J'ai les types de messages personnalisés et la taxonomie personnalisée déterminés, mais je ne sais pas s'il est possible de définir des permaliens avec des taxonomies. Ainsi, mon flux de travail, par exemple, serait le suivant ...

  1. Je crée un type de message personnalisé appelé produits .
  2. Ensuite, je crée une taxonomie personnalisée pour types de produits .
  3. Ensuite, j'ajoute un type de produit appelé 'Chairs' et ajoute un produit appelé 'Chaise rouge' à cette catégorie.

Une fois que je crée ce produit, la structure permalien souhaitée permettant d'afficher ce produit sera formatée comme suit ->

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

Est-ce possible dans wordpress 3.4? Les méta-boîtes de mon type de message personnalisé permettent de sélectionner les types de produit définis pour ma taxonomie personnalisée. Il n'y aura jamais qu'un seul type par produit.

Si possible, j'aimerais aussi inclure tous les parents de la catégorie de produit sélectionnée si possible (par exemple, si la catégorie 'chaises' était un enfant de la catégorie 'lounge' , la structure de permalien serait la suivante ->

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

Voici comment je crée le type de publication personnalisé et la taxonomie personnalisée. J'ai juste besoin d'aide pour définir les règles de réécriture/slug afin d'inclure le type de produit dans le permalien.

/* 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
    ));
}
2
reekogi

Solution

Je l'ai compris avec l'aide de ces articles de Jan Fabry ->

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

J'ai configuré le type de message personnalisé comme suit ->

  • Type d'article personnalisé (register_post_type) -> "produit"
  • Taxonomie (register_taxonomy) -> "type de produit"

Fonction back-end

Je réécris la structure de permalien qui est enregistrée dans le back-end, de sorte que le permalien soit enregistré pour inclure le type de taxonomie personnalisé - "type de produit".

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

Définissez le paramètre de permalien (=) sur "Nom de post" et enregistrez. Si vous ajoutez un produit à une catégorie et que vous enregistrez, vous devez réécrire le lien permanent pour inclure la définition de taxonomie personnalisée, dans ce cas, "produit-type". Donc, si vous ajoutez "Chaise rouge" à la catégorie "Chaises" , l'URL sera formatée comme suit ->

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

Mais si vous essayez d'accéder à cette page, vous obtiendrez une erreur 404. C'est parce que wordpress ne sait pas encore comment interroger la base de données avec cette URL, vous devez donc l'écrire.

Fonction front-end

Nous devons ajouter des règles de réécriture pour que wordpress puisse prendre notre URL et interroger la base de données. Nous utilisons la fonction wordpress add_rewrite_rule pour traduire le lien permanent donné dans une chaîne de requête.

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

Dans cette fonction, le tableau de correspondances est défini par Wordpress en décomposant la chaîne donnée à chaque barre oblique. Ainsi, dans cet exemple, l'expression régulière ([^/]+) est utilisée pour faire correspondre quoi que ce soit entre chaque barre oblique. Dans cet exemple, il y a 2 niveaux, ainsi le produit correspond au type de produit, puis le produit et les ajoute au tableau de correspondances, où produit-type = $ correspond 1 , et produit = $ correspond 2 .

Cette règle de réécriture traduit ceci ->

product/chairs/red-chair/

Dans ceci ->

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

Ce que notre base de données peut utiliser pour interroger la base de données et renvoyer la page de produit correcte avec le permalien formaté.

Cela jette les pages de type de produit car il n'y aura qu'un seul niveau dans l'URL, type de produit. Cela signifie que la règle de réécriture essayera toujours d'identifier le nom du produit tel qu'il est défini dans la chaîne de requête. Donc, pour cela, nous écrivons également une règle de réécriture à un seul niveau:

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

Cela va maintenant également interroger les pages de type de produit afin que nous puissions simplement parcourir la taxonomie comme d'habitude si nous voulons afficher les différents types de produit, sans générer d'erreur 404 lorsque nous essayons de créer un lien vers eux.

Inconvénient

Cela ne prend actuellement qu'un seul niveau de taxonomie, de sorte que la structure de taxonomie personnalisée ne peut pas être hiérarchique. Si vous spécifiez plus d'une taxonomie, le plus grand identifiant avec le premier ID sera utilisé pour définir le permalien. Une solution possible consiste à masquer le menu de taxonomie personnalisé qui apparaît dans la barre latérale des types de publication personnalisés et à ajouter une boîte méta pour la taxonomie dans laquelle seule une zone de sélection peut être utilisée. J'utilise le plugin Meta Box pour cela. (nb, ce plugin n’a pas de menus d’administrateur, il vous permet d’écrire des méta-boîtes pour les types de posts personnalisés dans votre functions.php simplement en créant des tableaux - hautement recommandé!)

1
reekogi