Czy można zastąpić wynik get_template_part ()?

11

Pracuję nad motywem potomnym. Zdecydowanie wolę nie zastępować głównych plików szablonów, aby zachować prostotę motywu potomnego, a także zminimalizować ilość kodu i konserwacji w czasie.

W pętli szablon index.php w kompozycji nadrzędnej używa: get_template_part( 'content' );

który przyniesie content.php , chcę, aby zachowywał się podobnie get_template_part( 'content', get_post_format() );lub podobnie w celu wprowadzenia różnych szablonów, takich jak content-aside.php itp., bez tworzenia index.php w motywie potomnym w celu zastąpienia rodzic dla zmiany w jednej linii.

get_template_part() składa się z:

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

Więc dostępna jest akcja, w moim przypadku o nazwie get_template_part_content

Mogę dołączyć do akcji za pomocą:

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

Powoduje to oczywiście duplikację po, jedną z mojej funkcji przechwyconej, która może wyświetlić żądany szablon, a drugą ze zwykłego locate_templatewywołania wget_template_part()

Mam problem ze znalezieniem sposobu na osiągnięcie tego bez powielania lub bez renderowania strony końcowej zaraz po udostępnieniu części szablonu przez zrobienie czegoś głupiego, takiego jak a breaklubexit

TomHarrigan
źródło
Sprawdź ten post
Pieter Goosen
3
Witamy w nędznym życiu bez dziedziczenia szablonów. :)
Rarst

Odpowiedzi:

3

Nie ma do tego haczyka. Skopiuj plik index.php do motywu podrzędnego i wprowadź zmiany w jednej linii. Powiedz także autorowi motywu nadrzędnego, że powinien wprowadzić taką samą zmianę w motywie, aby uzyskać elastyczność.

Otto
źródło
To jest teraz nieprawda, patrz odpowiedź @ t-toudua tutaj
Ivan Castellanos
Jego odpowiedź nie jest rozwiązaniem, ponieważ część szablonu wciąż się ładuje i zawiera. Hak akcji nie może tego zastąpić.
Otto
To prawda, ale możesz użyć ob_startw nim i ob_endprzy późniejszym haku, aby został wykonany, ale nigdy nie powtórzył echa, co zwykle jest wystarczające. Lub możesz użyć exit (), aby wymusić zakończenie PHP (po ręcznym dodaniu wszystkiego, czego jeszcze brakuje: stopki itp.)
Ivan Castellanos
To wciąż nie jest rozwiązanie. Tłumienie wyjścia nie jest tym samym, co przesłonięcie rzeczy.
Otto,
Wyjście nie tłumi wyjścia; w tym momencie skutecznie zatrzymuje wykonywanie.
Ivan Castellanos,
6

Myślę, że nie jest to dokładnie tak, jak chcesz. Naprawdę denerwujące jest to, że nie ma tam filtra zmieniającego nazwy plików szablonów :(

Mam jednak obejście tego. Użyjmy content.phpdo porównania.

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

Nie użyłem drugiego argumentu get_template_partfunkcji, raczej przekazałem przyrostek do pierwszego argumentu, aby uniknąć bezokoliczenia wywołań content.phppliku, jeśli nie ma 'content-'. $formatpliku.

Shazzad
źródło
Myślę, że to dobry sposób, aby to zrobić. Nie jestem pewien, dlaczego nie jest to akceptowane :)
Anh Tran
Reputacja ma znaczenie, może :)
Shazzad
Przepraszam @Shazzad, dałem jednak odpowiedź pozytywną, ponieważ jest bardzo sprytna :) Gdybym mógł zaakceptować dwie, zrobiłbym to.
TomHarrigan
3

Cóż, jest ROZWIĄZANIE :

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

ale zastanów się dobrze, w jakim haku powinieneś wstawić tę akcję ... aby ręcznie uzyskać lokalizację, użyj np locate_template('content-header.php', false);

T.Todua
źródło
0

Jeśli chcesz pobrać plik o nazwie content-aside.php, wywołujesz funkcję w następujący sposób:

get_template_part( 'content', 'aside' );

Drugi parametr to nazwa filtru po łączniku. Jeśli twój plik znajduje się w podkatalogu (templates / content-aside.php):

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

Czy to właśnie chcesz zrobić?

Justin R.
źródło
Dzięki, rozumiem to. Nie chcę tworzyć indeksu.php w motywie potomnym, aby zastąpić motywy nadrzędne index.php dla zmiany w jednej linii. Dodaje więcej konserwacji do motywu podrzędnego. Mam nadzieję, że uda się to osiągnąć za pomocą haka, jeśli to możliwe.
TomHarrigan