Parte del modello all'interno dello shortcode, risultato inaspettato

Aug 16 2020

Sto tentando di chiamare una parte del modello tramite uno shortcode. Ho letto tutto su come farlo più e più volte su questo sito e tuttavia dopo aver provato un certo numero di cose non sono ancora in grado di chiamare una semplice stringa di tempo di eco php. Il nome del file è test-one.php. Ecco cosa ho provato:

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

Il codice della parte del modello è

<?php

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

Sembra che dovrebbe funzionare, no? Dove sto sbagliando?

Risposte

2 Howdy_McGee Aug 17 2020 at 00:25

La get_template_part()funzione non assume alcun nome di directory, è necessario fornirlo esplicitamente. È anche relativo alla directory del tema attivo. Quindi in molti dei tuoi esempi stava cercando il modello nella radice del tuo tema attivo. Il formato corretto sarebbe:

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

Se lo desideri, puoi rinominare la cartella in inco includes- è arbitrario. Hai solo bisogno di riflettere questo cambiamento nella chiamata di funzione.


In una nota a margine, WordPress ti consente di passare un secondo parametro e cercherà i file uniti da un trattino. Ad esempio, questo funzionerà anche:

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

Il vantaggio di ciò è che consente di avere più "tipi" di una parte specifica. Potresti avere un content-post.phpfile per l'output del contenuto del tuo post e un content-page.phpper l'output del contenuto della tua pagina. Poi, nel tuo tema che si potrebbe chiamare il modello da:

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

Gli permette solo di essere un po 'più dinamico.


Un'altra nota a margine. Ogni volta che hai problemi con questi tipi di funzioni puoi sempre utilizzare:

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

Questo produrrà il percorso del modello in cui WordPress sta tentando di accedere al modello.