avant de commencer, merci pour votre temps.
Structure:
cpt = corsi
tax = argomenti
tax_term = parent
tax_term_child = child
tax_term_child_granchild = grandchild
Code actuel (sur taxonomy-argomenti.php):
$queried_object = get_queried_object();
$cpt = get_post_type( get_the_ID() );
$taxonomy = $queried_object->taxonomy;
$term_id = $queried_object->term_id;
$current_term = get_term_by('id', get_query_var('term'), $taxonomy);
if((int)$current_term->parent)
get_template_part('argomenti', 'child');
else
get_template_part('argomenti', 'parent');
Je choisirais quel modèle utiliser pour tous les niveaux de taxonomie.
Exemple:
localhost\cpt archive-cpt.php
localhost\cpt\parent argomenti-parent.php
localhost\cpt\parent\child argomenti-child.php
localhost\cpt\parent\child1\grandchild argomenti-grandchild.php
Est-ce possible avec une fonction comme celle que j'ai postée?
Merci beaucoup.
Créer et inclure un modèle pour votre archive de type de publication personnalisée est simple. Il vous suffit de créer un modèle archive-{$post_type}.php
. Wordpress utilisera automatiquement ce modèle à chaque visite de la page d'archive de ce type de publication. N'oubliez pas de définir le paramètre has_archive
lors de l'enregistrement de votre type de publication.
Pour ce qui est de la page d’archive taxonomie, vous y êtes presque. Il s’agit simplement de vérifier si un terme est de premier niveau, ou si l’enfant ou le petit-fils est un enfant. Ce que je peux lire de votre question, vous avez déjà créé un modèle taxonomy-{$taxonomy}.php
que vous utiliserez pour tous les termes de la taxonomie argomenti
, quelle que soit la hiérarchie. Vous avez utilisé des pièces de modèle que vous allez inclure selon la hiérarchie.
Voyons donc la logique que nous allons utiliser ici.
get_queried_object()
tiendra le terme objet du terme en cours de visualisation. Nous allons utiliser cela pour obtenir le parent du terme et l'ID du terme
Tous les termes de niveau supérieur auront un ID parent de 0
, ce qui est important.
Pour tout terme dont l'ID parent est supérieur à 0
, nous devrons déterminer où il se situe dans la hiérarchie. Pour cela, nous allons utiliser get_ancestors
. Cette fonction renverra un tableau d'ID de termes. Le premier identifiant de terme sera le terme à tester directement parent, et le dernier identifiant sera celui du terme de niveau supérieur, le parent. Pour déterminer où s'inscrit un terme dans la hiérarchie, il suffit d'obtenir la taille du tableau: un tableau vide signifie parent, un tableau avec une clé signifie enfant et un tableau avec deux clés signifie petit-enfant
Nous pouvons maintenant mettre toute cette logique dans le code. Pour éviter toute accumulation de code dans votre modèle de taxonomie, nous allons créer une fonction que vous pouvez ajouter dans functions.php
, puis appeler une seule ligne dans votre modèle de taxonomie. ( REMARQUE: Tout le code n'a pas été testé et pourrait être un buggy, assurez-vous donc de le tester localement avec le débogage activé En outre, vous auriez besoin de PHP 5.4 + )
function get_tax_hierarchy_template_part( $template = '', $subfolder = '' )
{
/**
* Make sure we are actually on a taxonomy archive page, if not, return false
*
* Instead of returning false here, you can also set it to return a default template
* Check the section commented out
*/
if ( !is_tax() )
return false;
// return get_template_part( 'content' ); // Return default template
// Get the current term object
$current_term_object = get_queried_object();
// Check if we have a value for $subfolder, if so, sanitize it and add slashes
if ( $subfolder )
$subfolder = '/' . filter_var( $subfolder, FILTER_SANITIZE_STRING ) . '/';
/**
* Check if we have value for $template, if so, sanitize, if not, use the taxonomy name
* Also append the $subfolder to $template
*/
if ( $template ) {
$template = filter_var( $template, FILTER_SANITIZE_STRING );
} else {
$template = $current_term_object->taxonomy;
}
$template = $subfolder . $template;
// Check if current term is top level, if so, return template part for parent terms
if ( $current_term_object->parent == 0 )
return get_template_part( $template, 'parent');
/**
* If we have reached this section, it means our term is not toplevel
* We must now determine where in the hierarchy the term is
*/
$hierarchy = get_ancestors( $current_term_object->term_id, $current_term_object->taxonomy );
// We must now get the size of the array
$hierarchy_depth = count( $hierarchy );
/**
* We will set child when the size of the array is one. For any size more
* than one, we will set grandchild
*
* If you are going to have grand-grandchildren which should have its own
* template, you would need to adjust this section
*/
$part = ( $hierarchy_depth == 1 ) ? 'child' : 'grandchild';
// Return the correct template part according to hierarchy
return get_template_part( $template, $part );
}
Vous pouvez maintenant l'appeler comme suit dans votre modèle de taxonomie
get_tax_hierarchy_template_part();
Si vous avez mis un repli, vous pouvez l'utiliser n'importe où
Comme demandé, j'ai inclus un paramètre dans la fonction appelée $template
. Vous pouvez maintenant définir le nom du modèle pour la pièce de modèle. Si ce paramètre n'est pas défini, le nom de taxonomie sera utilisé.
Si votre pièce de modèle porte le nom suivant, {$taxonomy}-parent.php
, vous devez appeler votre fonction comme suit:
get_tax_hierarchy_template_part();
Si votre partie de modèle s'appelle autre chose, par exemple content-parent.php
, vous devez appeler votre fonction comme suit:
get_tax_hierarchy_template_part( 'content' );
En raison des conditions dans lesquelles le nom de taxonomie doit être utilisé par défaut pour une partie de modèle, j'ai dû incorporer un deuxième paramètre appelé $subfolder
afin de gérer les parties de modèle dans les sous-dossiers. J'ai mis à jour le code en conséquence.
Vous devez passer uniquement le nom du sous-dossier sans barres obliques en tant que deuxième paramètre. N'oubliez pas de transmettre une chaîne vide en premier paramètre si vous utilisez {$taxonomy}-parent.php
en tant que partie de modèle
Exemple:
get_tax_hierarchy_template_part( '', 'subfoldername' );
Pour les pièces de modèle de type content-parent.php
, utilisez
get_tax_hierarchy_template_part( 'content', 'subfoldername' );