È possibile sovrascrivere il risultato di get_template_part ()?


11

Sto lavorando su un tema figlio, preferisco fortemente non sovrascrivere i file modello principali per mantenere la semplicità del tema figlio e ridurre al minimo la quantità di codice e manutenzione nel tempo.

Nel ciclo, il modello index.php nel tema principale utilizza: get_template_part( 'content' );

che introdurrà content.php , sto cercando di comportarlo in modo più simile get_template_part( 'content', get_post_format() );o simile al fine di introdurre diversi modelli come content-apart.php , ecc., senza creare un index.php nel tema figlio per sovrascrivere il genitore per un cambio di riga singola.

get_template_part() consiste di:

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

Quindi c'è un'azione disponibile, nel mio caso chiamata get_template_part_content

Posso agganciarmi all'azione con qualcosa del tipo:

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

Ciò ovviamente comporta la duplicazione post, uno dalla mia funzione hook, che può visualizzare il modello desiderato e l'altro dalla normale locate_templatechiamata inget_template_part()

Sto riscontrando problemi nel trovare un modo per ottenere questo risultato senza duplicazione o senza terminare il rendering della pagina subito dopo aver pubblicato la mia parte del modello facendo qualcosa di stupido come un breakoexit



3
Benvenuti nella miserabile vita senza eredità del modello. :)
— Rarst

Risposte:


3

Non c'è nessun gancio per farlo. Copia index.php sul tema figlio e modifica la riga singola. Inoltre, dire all'autore del tema principale che dovrebbero apportare la stessa modifica al tema, per flessibilità.


Questo è falso ora, vedi la risposta @ t-toudua qui
— Ivan Castellanos,

La sua risposta non è una soluzione, perché la parte del modello è ancora carica e include. Il gancio di azione non può ignorarlo.
— Otto

È vero, ma potresti usarlo ob_startal suo interno e ob_endad alcuni hook successivi, quindi viene eseguito ma non ha mai fatto eco, che di solito è abbastanza buono. Oppure potresti usare exit () per forzare la chiusura di PHP (dopo aver aggiunto manualmente tutto ciò che manca: piè di pagina, ecc.)
— Ivan Castellanos il

E questa non è ancora una soluzione. Sopprimere l'output non equivale a ignorare le cose.
— Otto

L'uscita non elimina l'output; interrompe effettivamente l'esecuzione a quel punto.
— Ivan Castellanos,

6

Penso che non sia esattamente possibile nel modo in cui vuoi raggiungere. È davvero fastidioso non avere un filtro lì per modificare i nomi dei file modello :(

Però ho una soluzione alternativa. Usalo content.phpper il confronto.

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

Non ho usato il secondo argomento di get_template_partfunzione, piuttosto ho passato il suffisso sul primo argomento per evitare chiamate infinite su content.phpfile se non c'è alcun 'content-'. $formatfile.


Penso che sia un buon modo per farlo. Non sono sicuro del perché non sia accettato :)
— Anh Tran,

La reputazione conta, forse :)
— Shazzad,

Scusa @Shazzad, ho dato un voto positivo alla tua risposta, dato che è molto intelligente :) Se potessi accettarne due, lo farei.
— TomHarrigan,

3

Bene, c'è SOLUZIONE :

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

ma pensa attentamente, in quale gancio dovresti inserire quell'azione ... per ottenere manualmente posizione, uso, ad es locate_template('content-header.php', false);


0

Se vuoi inserire un file chiamato content-Hole.php, chiami la funzione in questo modo:

get_template_part( 'content', 'aside' );

Il secondo parametro è il nome del filer dopo il trattino. Se il tuo file si trova in una sottodirectory (templates / content-apart.php):

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

È quello che stai cercando di fare?


Grazie, lo capisco. Sto cercando di non dover creare un index.php nel tema figlio per sovrascrivere i temi parent index.php per un cambio di riga singola. Aggiunge più manutenzione al tema figlio. Sperando di realizzare tramite un gancio, se possibile.
— TomHarrigan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.