web-dev-qa-db-fra.com

Wordpress - Création de plusieurs versions du même single-customtype.php en fonction des catégories de taxonomie sélectionnées

J'ai enregistré un type de message personnalisé 'Clients' et une taxonomie pour ce type de message afin de classer les messages. Il existe actuellement trois catégories pour un client: "Projet de logo", "Projet de vidéo" et Projet de "Web Design".

Certains clients peuvent appartenir à plusieurs catégories.

Sur la page d'édition d'un poste client, j'ai un générateur de disposition de champ flexible qui vous permet de générer des "blocs" de contenu pour chaque type de catégorie (logo, site Web, vidéo, etc.). Chaque bloc aura des champs uniques propres à chaque catégorie (outils de téléchargement de vidéos pour les vidéos, galeries d’images pour les logos, etc.).

Mon problème est que, même si je peux afficher du contenu pertinent sur des pages de catégorie de taxonomie (afficher uniquement la conception Web pour tous les clients appartenant à la catégorie de conception Web ...), une fois que l'utilisateur a cliqué pour afficher ce client, les clients uniques. La page php n'a aucun moyen d'afficher SEULEMENT du contenu Web Design et de filtrer d'autres "blocs de contenu" dans les cas où un client a plus d'un bloc de contenu.

Idéalement, j'ai besoin de plusieurs versions du modèle unique du client:

quelque chose comme:

1) single-clients-web.php
2) single-clients-logo.php
3) single-clients-video.php
4) single-clients.php (shows all project blocks as it does now)

OR

en quelque sorte, prenez un ID de référence et écrivez une condition: si l'utilisateur clique sur le client depuis la page de catégorie de conception Web, la page unique vers laquelle il est dirigé affiche uniquement les champs de conception Web.

4
Alex

D'accord, le code suivant devrait faire l'affaire pour vous:

function get_clients_correct_template($single_template) {
    global $post;

    if ( 'clients' == $post->post_type ) {
        $_template = false;
        // Get all the terms for this post
        $categories = wp_get_post_terms( $post->ID, 'clients_categories' );
        if ( $categories && ! is_wp_error( $categories ) ) {
            global $wp;
            // I guessed that the client category that's in the URL will be in the query, but it's not, so we have to get it from $wp->matched_query
            if ( preg_match( '~clients_categories=[\w|\d|-]*&?~', $wp->matched_query ) ) {
                $slug = preg_replace( '~.*?clients_categories=([\w|\d|-]*)&?.*?$~', '\1', $wp->matched_query );
                // See if the slug we found matches a slug of one of the client's categories
                foreach ( $categories as $cat ) {
                    if ( $cat->slug == $slug ) {
                        $_template = locate_template( array( "single-clients-{$slug}.php" ), false );
                        break;
                    }
                }
            }
            // If we haven't found a template yet, just assign the first found template
            if ( ! $_template ) {
                $_template = locate_template( array( "single-clients-{$categories[0]->slug}.php" ), false );
            }
            $single_template = $_template ? $_template : $single_template;
        }
    }

    return $single_template;
}
// This is pre WP 3.4
add_filter( "single_template", "get_clients_correct_template", 1000 );
// This is post WP 3.4
add_filter( "clients_template", "get_clients_correct_template", 1000 );

// Fixes the permalinks for the "clients" post type
function clients_custom_permalink($permalink, $post_id, $leavename) {
    if ( strpos( $permalink, 'client/' ) === FALSE || ! ( $post = get_post( $post_id ) ) || get_post_type( $post_id ) != 'clients' ) {
        return $permalink;
    }

    // Get taxonomy terms
    $terms = wp_get_object_terms( $post->ID, 'clients_categories' );
    if ( ! is_wp_error( $terms ) && ! empty( $terms ) && is_object( $terms[0] ) ) {
        $taxonomy_slug = false;
        if ( is_tax( 'clients_categories' ) ) {
            $term = get_queried_object();
            $taxonomy_slug = $term->slug;
        } else {
            $taxonomy_slug = $terms[0]->slug;
        }
    } else {
        $taxonomy_slug = 'no-category';
    }
    $replace_count = 1;

    return preg_replace( '~client/~', $taxonomy_slug . '/', $permalink, $replace_count );
}
add_filter('post_link', 'clients_custom_permalink', 10, 3);
add_filter('post_type_link', 'clients_custom_permalink', 10, 3);

// Fixes the URL's for taxonomy archives
function clients_categories_custom_permalink($permalink, $term, $taxonomy) {
    if ( $taxonomy != 'clients_categories' ) {
        return $permalink;
    }

    return home_url( "/{$term->slug}/" );
}
add_filter( 'term_link', 'clients_categories_custom_permalink', 10, 3 );

// Generates custom rewrite rules for recognizing the custom Permalink structure for both "clients" posts and "clients_categories" terms
function add_client_rewrite_rules( $wp_rewrite ) {
    static $did_rules = false;
    if ( ! $did_rules ) {
        $additional_rules = array();
        $terms = get_terms( 'clients_categories', array( 'hide_empty' => false ) );
        if ( $terms ) {
            foreach ( $terms as $term ) {
                // Add a rule for the taxonomy archives of the type "client-category-slug[/]" - the "/" is optional
                $additional_rules[ "({$term->slug})/?$" ] = 'index.php?clients_categories=$matches[1]';
                // Add a rule of the sort "client-category-slug/client-slug"
                $additional_rules[ "({$term->slug})/([^/]*)" ] = 'index.php?clients_categories=$matches[1]&clients=$matches[2]';
                // Add a rule of the sort "client-category-slug/parent-client-slug/client-slug"
                $additional_rules[ "({$term->slug})/([^/]*)/([^/]*)" ] = 'index.php?clients_categories=$matches[1]&clients=$matches[3]';
            }
            $wp_rewrite->rules = array_merge( $additional_rules, $wp_rewrite->rules );
        }
        $did_rules = true;
    }
}
add_action( 'generate_rewrite_rules', 'add_client_rewrite_rules' );

Pour ce qui est du début, j’ai supposé que le slug de votre type de message personnalisé est clients et que le slug de votre taxonomie personnalisée est clients_cateogires - si l’un d’entre eux est incorrect, veuillez rechercher et remplacer ces occurrences dans mon code.

Dans les arguments de register_post_type() pour votre type de message clients, vous devez définir rewrite sur:

'rewrite' => array( 'slug' => 'clients', 'with_front' => false ),

De même, dans les arguments pour register_taxonomy(), vous devez définir rewrite sur (tout autre slug fonctionnera également):

'rewrite' => array( 'slug' => 'client-category', 'with_front' => false ),

Ainsi, la première fonction est liée aux filtres single_template et clients_template. Vous pouvez lire en détail sur ce hook ici , mais fondamentalement, ce hook vous permet de changer le modèle chargé lors du chargement d'un singulier (page, post, type de message personnalisé post) post est affiché. Nous nous associons à cette fonction pour pouvoir charger le modèle approprié lorsqu'un message client est en cours de chargement.

Nous vérifions d’abord que le type de publication de la publication actuelle est bien celui qui est la cible (clients).

Ensuite, nous obtenons toutes les catégories associées au client actuel. S'il n'y a pas de catégories, nous laissons WordPress charger le modèle par défaut.

S'il y a des catégories, nous vérifions d'abord si l'URL interrogée contient un slug clients_categories. Au départ, je pensais que WP ajouterait le slug du clients_categories qui fait partie de l'URL, mais il semble que ce ne soit pas le cas. Au lieu de cela, j'ai trouvé cela dans la propriété $matched_query de l'objet $wp. Si elle correspond à une expression régulière simple, nous extrayons le slug et le comparons aux slug des catégories auxquelles la variable client actuelle est associée. Si l'un d'eux correspond, nous essayons de trouver un modèle single-clients-{$slug}.php.

Si nous ne trouvons pas le terme recherché, ni le modèle approprié pour ce terme, nous obtenons la première catégorie de ce client et essayons de trouver le modèle correspondant (en utilisant son slug).

En fin de compte, si nous avons trouvé un modèle approprié, nous lui affectons la variable $single_template, sinon nous préservons sa valeur d'origine.


Maintenant, la deuxième partie remplace client/ des clients permalink par le slug clients_categories approprié pour ce client. Notez qu'il vérifie également si nous sommes sur un terme de la taxonomie clients_categories - si c'est le cas, il utilisera le slug du terme actuel. Sinon, le slug du premier terme trouvé sera ajouté.


La troisième partie (clients_categories_custom_permalink()) corrige l'URL des archives de taxonomie - ainsi la catégorie "Web" sera à http://example.com/web/.


La quatrième partie (add_client_rewrite_rules()) ajoute des règles de réécriture personnalisées - . Remarque: pour que celles-ci prennent effet, vous devez accéder à Settings > Permalinks - afin que WordPress sache ce qu'il doit afficher rencontre une URL comme http://example.com/web/ ou http://example.com/web/client-slug/.


Notez que si vous avez une page dont le slug correspond à l'un des slug de vos catégories de clients, vous verrez très probablement l'archive de taxonomie au lieu de la page.

2