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:
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.php
afin que je puisse utiliser différentes parties de modèle pour chacune?
+ 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.
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
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' );