Ist es möglich, das Ergebnis von get_template_part () zu überschreiben?

11

Ich arbeite an einem untergeordneten Thema. Ich bevorzuge es nachdrücklich, die Hauptvorlagendateien nicht zu überschreiben, um die Einfachheit des untergeordneten Themas beizubehalten und den Code- und Wartungsaufwand im Laufe der Zeit zu minimieren.

In der Schleife verwendet die index.php-Vorlage im übergeordneten Thema Folgendes: get_template_part( 'content' );

was content.php einbringt , ich möchte, dass es sich ähnlicher get_template_part( 'content', get_post_format() );oder ähnlicher verhält , um verschiedene Vorlagen wie content-aside.php usw. einzubringen , ohne eine index.php im untergeordneten Thema zu erstellen, um die zu überschreiben Eltern für eine einzelne Zeile ändern.

get_template_part() besteht aus:

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

Es ist also eine Aktion verfügbar, in meinem Fall namens get_template_part_content

Ich kann mich mit so etwas an die Action binden:

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

Dies führt offensichtlich zu Post-Duplizierungen, eine von meiner Hook-Funktion, die die gewünschte Vorlage anzeigen kann, und die andere vom normalen locate_templateAufruf anget_template_part()

Ich habe Probleme, einen Weg zu finden, um dies ohne Duplizieren oder ohne Rendern der Endseite zu erreichen, direkt nachdem ich meinen Template-Teil geliefert habe, indem ich etwas Dummes wie ein breakoder tueexit

TomHarrigan
quelle
Überprüfen Sie diesen Beitrag
Pieter Goosen
3
Willkommen im elenden Leben ohne Vorlagenvererbung. :)
Rarst

Antworten:

3

Dafür gibt es keinen Haken. Kopieren Sie die Datei index.php in das untergeordnete Thema und nehmen Sie die Änderung in einer Zeile vor. Sagen Sie dem Autor des übergeordneten Themas außerdem, dass er aus Gründen der Flexibilität die gleiche Änderung an seinem Thema vornehmen soll.

Otto
quelle
Dies ist jetzt falsch, siehe @ t-toudua Antwort hier
Ivan Castellanos
Seine Antwort ist keine Lösung, da der Template-Teil noch geladen und eingeschlossen wird. Der Aktions-Hook kann das nicht überschreiben.
Otto
Stimmt, aber man könnte ob_startdrin verwenden und den ob_endan manchen Stellen später ausgeführten Haken damit aber nie wiedergeben, was normalerweise gut genug ist. Oder Sie könnten exit () verwenden, um das Beenden von PHP zu erzwingen (nachdem Sie alles, was noch fehlt, manuell hinzugefügt haben: Fußzeile usw.)
Ivan Castellanos
Und das ist immer noch keine Lösung. Das Unterdrücken von Ausgaben ist nicht dasselbe wie das Überschreiben von Dingen.
Otto
Beim Beenden wird die Ausgabe nicht unterdrückt. Es stoppt die Ausführung an diesem Punkt.
Ivan Castellanos
6

Ich denke, es ist nicht genau möglich, wie Sie es erreichen wollen. Es ist wirklich ärgerlich, dort keinen Filter zum Ändern der Namen von Vorlagendateien zu erhalten :(

Ich habe eine Problemumgehung. Verwenden Sie content.phpfür den Vergleich.

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

Ich habe nicht das zweite Argument der get_template_partFunktion verwendet, sondern das Suffix für das erste Argument übergeben, um infinitive Aufrufe der content.phpDatei zu vermeiden, wenn keine 'content-'. $formatDatei vorhanden ist.

Shazzad
quelle
Ich denke, das ist ein guter Weg, das zu tun. Nicht sicher, warum es nicht akzeptiert wird :)
Anh Tran
Reputation zählt, vielleicht :)
Shazzad
Sorry @Shazzad, ich habe deine Antwort allerdings positiv bewertet, da sie sehr klug ist :) Wenn ich zwei akzeptieren könnte, würde ich das tun.
TomHarrigan
3

Nun, es gibt LÖSUNG :

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

aber überlegen Sie genau, in welchen Haken Sie diese Aktion einfügen sollten ... um die Position manuell zu ermitteln, verwenden Sie z locate_template('content-header.php', false);

T.Todua
quelle
0

Wenn Sie eine Datei mit dem Namen content-aside.php einlesen möchten, rufen Sie die Funktion folgendermaßen auf:

get_template_part( 'content', 'aside' );

Der zweite Parameter ist der Name des Filers nach dem Bindestrich. Wenn sich Ihre Datei in einem Unterverzeichnis befindet (templates / content-aside.php):

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

Ist es das, was Sie tun wollen?

Justin R
quelle
Danke, das verstehe ich. Ich suche, um eine index.php im Kindthema nicht verursachen zu müssen, um die Elternthemen index.php für eine einzelne Zeilenänderung zu überschreiben. Es fügt dem untergeordneten Thema mehr Wartung hinzu. Ich hoffe, es mit einem Haken zu erreichen, wenn es möglich ist.
TomHarrigan