web-dev-qa-db-fra.com

Est-il possible de remplacer le résultat de get_template_part ()?

Je travaille sur un thème enfant. Je préfère fortement ne pas remplacer les fichiers de modèle principaux afin de maintenir la simplicité du thème enfant et de minimiser la quantité de code et la maintenance sur le temps.

Dans la boucle, le modèle index.php du thème parent utilise: get_template_part( 'content' );

qui apportera content.php , je cherche à le faire se comporter davantage comme get_template_part( 'content', get_post_format() ); ou similaire afin d’apporter différents modèles tels que content-apartement.php , etc., sans créer de index.php dans le thème de l'enfant pour écraser le parent pour un changement de ligne unique.

get_template_part() est composé de:

function get_template_part( $slug, $name = null ) {

    do_action( "get_template_part_{$slug}", $slug, $name );
    $templates = array();
    $name = (string) $name;
    if ( '' !== $name )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";
    locate_template($templates, true, false);
}

Donc, il y a une action disponible, dans mon cas appelé get_template_part_content

Je peux accrocher à l'action avec quelque chose comme:

add_action( 'get_template_part_content', 'child_post_styles', 10, 2 );

function child_post_styles ( $slug, $name ) {
    if( false == $name ){
        $name = get_post_format();
        $templates = array();
        if ( '' !== $name )
            $templates[] = "{$slug}-{$name}.php";

        $templates[] = "{$slug}.php";
        locate_template($templates, true, false);
    }
}

Cela entraîne évidemment une duplication de publication, une de ma fonction accrochée, qui peut afficher le modèle souhaité, et l'autre de l'appel locate_template normal dans get_template_part()

Je ne parviens pas à trouver un moyen d'accomplir cela sans duplication ni fin de rendu de page après avoir servi la partie de mon modèle en faisant quelque chose de stupide tel que break ou exit

12
TomHarrigan

Il n'y a pas de crochet pour faire ça. Copiez le fichier index.php dans le thème enfant et modifiez le changement de ligne unique. Indiquez également à l'auteur du thème parent qu'il doit apporter le même changement à son thème, par souci de flexibilité.

3
Otto

Je pense que ce n'est pas exactement possible comme vous le souhaitez. C'est vraiment ennuyeux de ne pas avoir de filtre pour modifier les noms de fichiers modèles :(

J'ai une solution de contournement à ce sujet cependant. Laissons utiliser content.php pour la comparaison.

// content.php file 
$format = get_post_format();
if( '' != $format ){
    get_template_part( 'content-'. $format );
}
else{
    get_template_part( 'content-default' );
}

Je n'ai pas utilisé le second argument de la fonction get_template_part, mais un suffixe sur le premier argument pour éviter les appels infinitifs sur le fichier content.php s'il n'y a pas de fichier 'content-'. $format.

6
Shazzad

Eh bien, il y aSOLUTION:

add_action('init', function(){ remove_all_actions('get_template_part_content'); });
add_action('get_template_part_content', 'yourFunc', 99, 2 );
function yourFunc ( $slug, $name ) {

    .........any codes here.............
    if ($name == 'header'){
       //but this will be executed before loading template... At this moment, Wordpress doesnt support any hooks for before/after LOAD_TEMPLATE...
    }
}

mais réfléchissez bien, dans quel crochet vous devez insérer cette action ... pour obtenir manuellement la position, utilisez, par exemple, locate_template('content-header.php', false);

3
T.Todua

Si vous voulez extraire un fichier appelé content-aparthe.php, appelez la fonction comme ceci:

get_template_part( 'content', 'aside' );

Le deuxième paramètre est le nom du fichier après le trait d'union. Si votre fichier est dans un sous-répertoire (templates/content-cote.php):

get_template_part( 'templates/content', 'aside' );

Est-ce ce que vous cherchez à faire?

0
Justin R