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



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ść.


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.


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


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ć?


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.