Partie de modèle dans le shortcode, reult inattendu

Aug 16 2020

J'essaye d'appeler une partie de modèle via un shortcode. J'ai tout lu sur la façon de faire cela encore et encore sur ce site et pourtant, après avoir essayé un certain nombre de choses, je suis toujours incapable d'appeler une simple chaîne de temps d'écho php. Le nom du fichier est test-one.php. Voici ce que j'ai essayé:

function test_2( $attr ) {
    ob_start();
    get_template_part( 'test', 'one' );
    return ob_get_clean();
}

add_shortcode('test2', 'test_2');

function test_2( $attr ) {
    ob_start();
    get_template_part( 'test-one' );
    return ob_get_clean();
}
add_shortcode('test2', 'test_2');

function test_2( $attr ) {
    ob_start();
    get_template_part( 'wp-content/themes/theme-name/template-parts/test-one' );
    return ob_get_clean();
}

add_shortcode('test2', 'test_2');

Le code de pièce du modèle est

<?php

echo "Current as of <br>  ".date("m-d-Y h:i:sa");

On dirait que ça devrait marcher, non? Où vais-je mal?

Réponses

2 Howdy_McGee Aug 17 2020 at 00:25

La get_template_part()fonction n'assume aucun nom de répertoire, vous devez le fournir explicitement. C'est également relatif au répertoire de thèmes actif. Donc, dans beaucoup de vos exemples, il recherchait le modèle à la racine de votre thème actif. Le format correct serait:

get_template_part( 'template-parts/test-one' );

Si vous le souhaitez, vous pouvez renommer le dossier en incou includes- c'est arbitraire. Il vous suffit de refléter ce changement dans l'appel de fonction.


En passant, WordPress vous permet de passer un 2ème paramètre et recherchera les fichiers joints par un tiret. Par exemple, cela fonctionnera également:

get_template_part( 'template-parts/test', 'one' );

L'avantage de ceci est qu'il vous permet d'avoir plusieurs «types» d'une pièce spécifique. Vous pouvez avoir un content-post.phpfichier pour afficher le contenu de votre message et un content-page.phppour afficher le contenu de votre page. Ensuite, dans votre thème, vous pouvez appeler votre modèle par:

get_template_part( 'template-parts/content', $post->post_type );

Cela lui permet simplement d'être un peu plus dynamique.


Une autre note latérale. Chaque fois que vous rencontrez des problèmes avec ces types de fonctions, vous pouvez toujours utiliser:

add_action( 'init', function() {
    $template = locate_template( $template_string_here ); printf( '<pre>%s</pre>', print_r( $template, 1 ) );
    die( 'end' );
} );

Cela affichera le chemin du modèle par lequel WordPress tente d'accéder au modèle.