web-dev-qa-db-fra.com

get_template_part pour chaque niveau de terme de taxonomie

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.

1
Simo

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ù

MODIFIER

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é.

USAGE

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

EDIT 2

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.

USAGE

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' );
2
Pieter Goosen