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


11

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 ainsi que de minimiser la quantité de code et de maintenance au fil du temps.

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

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

get_template_part() consiste en:

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

Il y a donc 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);
    }
}

Il en résulte évidemment une post-duplication, l'une de ma fonction hookée, qui peut afficher le modèle souhaité, et l'autre de l' locate_templateappel normal dansget_template_part()

J'ai du mal à trouver un moyen d'accomplir cela sans duplication, ou sans terminer le rendu de page juste après avoir servi ma partie de modèle en faisant quelque chose de stupide comme un breakouexit



3
Bienvenue dans une vie misérable sans héritage de modèle. :)
Rarst

Réponses:


3

Il n'y a pas de crochet pour le faire. Copiez index.php dans le thème enfant et modifiez la ligne unique. En outre, dites à l'auteur du thème parent qu'il doit faire le même changement dans son thème, pour plus de flexibilité.


C'est faux maintenant, voir la réponse de @ t-toudua ici
Ivan Castellanos

Sa réponse n'est pas une solution, car la partie modèle se charge toujours et inclut. Le crochet d'action ne peut pas remplacer cela.
Otto

Certes, mais vous pouvez utiliser à l' ob_startintérieur et ob_endun crochet ultérieur afin qu'il soit exécuté mais jamais répété, ce qui est généralement suffisant. Ou vous pouvez utiliser exit () pour forcer la terminaison de PHP (après avoir ajouté manuellement tout ce qui manque: pied de page, etc.)
Ivan Castellanos

Et ce n'est toujours pas une solution. Supprimer la sortie n'est pas la même chose que remplacer les choses.
Otto

Quitter ne supprime pas la sortie; il arrête effectivement l'exécution à ce stade.
Ivan Castellanos

6

Je pense que ce n'est pas exactement possible de la manière que vous voulez atteindre. C'est vraiment ennuyeux de ne pas avoir de filtre pour modifier les noms des fichiers de modèle :(

J'ai une solution de contournement cependant. Utilisons content.phppour 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 deuxième argument de la get_template_partfonction, j'ai plutôt passé le suffixe sur le premier argument pour éviter les appels infinitifs dans le content.phpfichier s'il n'y a pas de 'content-'. $formatfichier.


Je pense que c'est une bonne façon de procéder. Je ne sais pas pourquoi ce n'est pas accepté :)
Anh Tran

La réputation compte, peut-être :)
Shazzad

Désolé @Shazzad, j'ai toutefois donné une réponse positive à votre réponse car elle est très intelligente :) Si je pouvais en accepter deux, je le ferais.
TomHarrigan

3

Eh bien, il y a une SOLUTION :

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 l'emplacement, l'utilisation, c'est-à-dire locate_template('content-header.php', false);


0

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

get_template_part( 'content', 'aside' );

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

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

C'est ce que vous cherchez à faire?


Merci, je comprends cela. Je cherche à ne pas avoir à créer un index.php dans le thème enfant pour écraser les thèmes parent index.php pour un changement de ligne unique. Il ajoute plus de maintenance au thème enfant. En espérant accomplir via un crochet si possible.
TomHarrigan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.