web-dev-qa-db-fra.com

Modèles de taxonomie ... par niveau hiérarchique?

Existe-t-il un moyen d'utiliser différents modèles pour différents niveaux dans une taxonomie hiérarchique, spécifiée par nom de fichier. Je connais les modèles taxonomy-taxonomyname.php et taxonomy-taxonomyname-term.php. Vous recherchez une méthode plus générique basée sur "le niveau de taxonomie".

Ainsi, une taxonomie nommée Terre pourrait contenir:

  1. Afrique
    • Cameroun
    • Congo
    • Sénégal
  2. Asie
    • Japon
    • Corée
  3. L'Europe 
    • Grèce
    • ...
  4. Amérique du sud
  5. ...

Existe-t-il un moyen d'avoir un modèle pour l'Afrique, l'Asie, l'Europe et l'Amérique du Sud (earth-numbers-level.php) ... et un autre modèle pour le Cameroun, le Congo, le Japon, la Grèce ... (earth-bullets-level.php)?

En examinant quelques docs de hiérarchie de modèles différents, je suppose que non. Si cela est vrai, quel est le meilleur moyen/le plus efficace de différencier les niveaux de taxonomie dans taxonomy-earth.phpafin que je puisse utiliser différentes parties de modèle pour chacune?

4
Will

+ 1ed La réponse de Pieter Goosen, mais cette fois, je veux être celle qui préconise le "simplifier".

Dans votre modèle taxonomy-earth.php, vous pouvez vérifier si le terme demandé est parent et, le cas échéant, en demander un autre.

Si vous posez cette question, je suppose que vous avez déjà (ou souhaitez créer) 2 modèles, appelons-les:

  • taxonomy-earth-continent.php
  • taxonomy-earth-country.php

Dans votre fichier taxonomy-earth.php, vous pouvez:

<?php
$slug = 'taxonomy-earth';
// default to continent
$name = 'continent';

// maybe set specific template to "country" if queried term has a parent
$term = get_queried_object();
if ( is_object( $term ) && ! empty( $term->parent ) )
    $name = 'country';

get_template_part( $slug, $name );

Ces 6 lignes de code de gabarit suffiront pour exiger un gabarit différent pour les termes "enfants".

Grâce à l’utilisation de get_template_part , le code du modèle est également convivial pour les enfants et déclenche un hook: get_template_part_taxonomy-earth qui peut être utilisé pour faire things lorsque le modèle est requis.

5
gmazzap

Vous avez deux options ici:

taxonomy-{$taxonomy}-{$term->parent}-{$term}.php

Nous pouvons créer notre propre hiérarchie ( ou étendre la hiérarchie existante ) en créant notre propre modèle taxonomy-{$taxonomy}-{$term->parent}-{$term}.php à utiliser lors de la visualisation d'un terme enfant. Nous allons également utiliser le filtre taxonomy_template pour ajouter nos nouveaux modèles de taxonomie à la hiérarchie afin qu’ils soient utilisés.

Vous pouvez essayer quelque chose comme ce qui suit: ( REMARQUE: Tout le code est non testé et tout le code est commenté pour faciliter le suivi et la compréhension. Le code suppose également que les termes de niveau supérieur ont déjà un taxonomy-{$taxonomy}-{$term}.php template. )

add_filter( 'taxonomy_template', function ( $template )
{
    // Get the current term object being viewed
    $current_term = get_queried_object();

    // We can restrict this to a single taxonomy, for example
    // if ( $current_term->taxonomy !== 'my_taxonomy' )
        // return $template;

    /**
     * Check if current term is top level, if so, return the default $template which
     * should be template taxonomy-{$taxonomy}-{$term}.php if found
     */
    if ( $current_term->parent == 0 ) // Top level terms have parent of 0
        return $template;

    // We made it to here, so the term is not top level

    // We need to get the top level term of the current term
    $hierarchy = get_ancestors( $current_term->term_id, $current_term->taxonomy );
    // The parent ID will always be the last ID in the array returned by get_ancestors
    $parent_ID = end( $hierarchy );
    // Now we can get the top level term object
    $top_level_term = get_term_by( 'id', $parent_ID, $current_term->taxonomy );

    /** 
     * Lets build our custom template name, add subfolder name if template
     * is in a subfolder, for example /subfolder/name-of-template.php
     */
    $custom_template = 'taxonomy-{$current_term->taxonomy}-{$top_level_term->slug}-{$current_term->slug}.php';
    // Check if our custom template exist, if not, return default $template
    $locate_template = locate_template( $custom_template );
    if ( !$locate_template )
        return $template;

    // Finally, everything checked out, return our custom template
    return $template = $locate_template;
}); 

Vous pouvez ajuster le code au besoin

Pièces de modèle personnalisé

Vous pouvez créer votre modèle taxonomy-{$taxonomy}-{$term}.php et utiliser des parties de modèle dans votre boucle pour inclure des parties de modèle en fonction du terme enfant. Le mieux ici sera d’écrire une fonction personnalisée puis d’appeler cette fonction dans la boucle ( ou partout où vous en aurez besoin ) au lieu de get_template_part()

Pour que cela fonctionne, nous devons appeler notre partie modèle comme suit:

  • les termes de premier niveau seront {$ term} .php, comme africa.php

  • les termes enfants seront {$term->parent}-{$term}.php comme africa-cameroon.php

  • modèle par défaut/de secours tel que content.php. Rappelez-vous simplement de ne pas transmettre la partie .php du nom du modèle à la fonction

Voici le code

/** 
 * Function to set template parts according to child term
 *
 * @param (string) $default Default template part to use like content.php
 * @return $template
 */
function get_custom_template_part( $default = '' )
{
    // Check if we have a value for $default, if not, return false
    if ( !$default )
        return false;

    // Sanitize the $default value
    $default = filter_var( $default, FILTER_SANITIZE_STRING );

    // Check if we are on a taxonomy page, if not, return the $default template
    if ( !is_tax() )
        return get_template_part( $default );

    // Get the current term being viewed
    $current_term = get_queried_object();

    /**
     * Set our custom variables
     * $top_level_term will hold the top level term object
     * $part will hold the current term slug if the current term is not top level
     */
    $top_level_term = '';
    $part = '';

    // Check if current term is top level, if not, get the top level parent
    if ( $current_term->parent != 0 ) {
        // We need to get the top level term of the current term
        $hierarchy = get_ancestors( $current_term->term_id, $current_term->taxonomy );
        // The parent ID will always be the last ID in the array returned by get_ancestors
        $parent_ID = end( $hierarchy );
        // Now we can get the top level term object
        $top_level_term = get_term_by( 'id', $parent_ID, $current_term->taxonomy );
        $part = $current_term->slug;
    }

    // We now will set our template's name accordingly
    if ( $top_level_term ) {
        $name = $top_level_term->slug;
    } else {
        $name = $current_term->slug;
    }

    // We will now check if our template parts exist, if not, return our default
    if ( $part ) { // This means we have a child term
        $template = get_template_part( $name, $part );
    } else { // This means top level term
        $template = get_template_part( $name );
    }

    if ( $template )
        return $template;

    return get_template_part( $default );
}

Vous pouvez étendre cela au besoin, et vous pouvez également ajouter vos parties de modèle dans un sous-dossier, puis ajouter simplement le nom du sous-dossier à la valeur de $name dans la fonction.

Vous pouvez maintenant utiliser la fonction de la manière suivante dans votre modèle taxonomy-{$taxonomy}-{$term}.php ou taxonomy-{$taxonomy}.php

Modèle par défaut: content.php

get_custom_template_part( 'content' );
5
Pieter Goosen