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