2011-11-30 13 views
5

Aktualnie koduję wtyczkę WP i będę musiał nadpisać szablony.WordPress template_include - jak go poprawnie podłączyć

Moja hak filtr wygląda tak - i to wykonuje:

add_filter('template_include', 'mcd_set_template',10); 

funkcja mcd_set_template() po prostu zwraca żądaną ścieżkę jako ciąg - lub domyślnego szablonu WP w przypadku, gdy plik nie istnieje.

Mam już to zabawę już od wielu godzin, nawet mogę dołączyć ten alternatywny szablon (ale pojawia się u dołu strony).

Moje pytanie brzmi: jak zmusić pakiet WP 3.2.1 do załadowania innego pliku szablonu zamiast - i który priorytet jest wymagany?

Aktualizacja: Również zauważyłem przy użyciu var_dump ... wyprowadza prawie na końcu pliku - ale powinien pojawić się przed znacznikiem HTML otwarcie ...

Według tego biletu powinna pracować z template_include hak: http://core.trac.wordpress.org/ticket/11242

Albo jest to jedyny sposób, aby podłączyć te filtry zamiast: http://codex.wordpress.org/Template_Hierarchy#Filter_Hierarchy ?

Odpowiedz

3

Czy próbowałeś użyć zamiast tego add_action? Na przykład, może chcesz spróbować coś jak następuje w swojej wtyczce:

add_action('template_redirect', 'mcd_set_template'); 
//Redirect to a preferred template. 
function mcd_set_template() { 
    $template_path = TEMPLATEPATH . '/' . "templatename.php"; 
    if(file_exists($template_path)){ 
     include($template_path); 
     exit; 
    } 
} 

Oto pomocne odniesienia: http://www.mihaivalentin.com/wordpress-tutorial-load-the-template-you-want-with-template_redirect/

+0

Niestety, wywołanie exit() lub die() zdecydowanie nie jest opcją - ponieważ zabija skrypt jedno zapytanie szybciej niż powinno ... Musisz filtrować template_loader.php @ line 42 –

+2

Proszę zwrócić uwagę na słowo * właściwie * w tytule - to, co wkleił kod, jest raczej kiepskie. Czemu? Ponieważ hook template_redirect ma miejsce, zanim szablon ładujący zdecyduje, który szablon wczytać ... –

+0

Widziałem w bug-tracker BuddyPressa, że ​​twoja sugestia była tam wcześniej używana - ale z priorytetem 999 - zamiast domyślnego 10. –

14

Można użyć template_redirect jak wykazano powyżej, ale to wymaga wyjścia, a to depcze wszystko, co WordPress normalnie robi, aby znaleźć aktualny szablon. Możesz to umożliwić, a następnie zastosować logikę do bieżącego szablonu.

Korzystanie część tego, co jest powyżej ...

add_action('template_include', 'mcd_set_template'); 

function mcd_set_template() { 
    return locate_template('templatename.php'); 
} 

To jest dość proste, można również przekazać tablicę do locate_template(), aby określić hierarchię. Jeśli miałbyś używać 'template_redirect, jak pokazano powyżej, nadal powinieneś używać locate_template, i tak właśnie jest.

add_action('template_redirect', 'mcd_set_template'); 

function mcd_set_template() { 

     /** 
     * Order of templates in this array reflect their hierarchy. 
     * You'll want to have fallbacks like index.php in case yours is not found. 
     */ 
     $templates = array('templatename.php', 'othertemplate.php', 'index.php'); 

     /** 
     * The first param will be prefixed to '_template' to create a filter 
     * The second will be passed to locate_template and loaded. 
     */ 
     include(get_query_template('mcd', $templates)); 

     exit; 
} 

Wreszcie, najlepszym sposobem byłoby filtrowanie określonych typów zamiast całej hierarchii. Na przykład możesz filtrować "category_template" lub "page_template". To byłoby bardziej szczegółowe, byłoby uniknąć brudząc z całej hierarchii szablonu, jeśli nie chcesz - i pozwala zrobić więcej WordPress podnoszenia ciężkich

Na przykład:

add_filter('category_template', 'filter_category_template'); 
function filter_category_template($template){ 
    /* Get current category */ 
    $category = get_queried_object(); 

    /* Create hierarchical list of desired templates */ 
    $templates = array (
     'category.php', 
     'custom-category-template.php', 
     'category-{$category->slug}.php', 
     'category-{$category->term_id}.php', 
     'index.php' 
    ); 


    return locate_template($templates); 
} 

Można z Oczywiście utwórz tę tablicę hierarchicznych szablonów za każdym razem, gdy użyjesz locate_template(). Korzystając z tej metody, można łatwo zobaczyć, jak łatwo można tworzyć wszelkiego rodzaju bardzo szczegółowe i szczegółowe hierarchie w ramach lub niezależnie od macierzystej hierarchii szablonów.

+1

' add_filter ('single_template', 'filter_callback') 'działa bardzo dobrze dla niestandardowych typów postów. Nawiasem mówiąc, od WP 3.4, WP automatycznie sprawdza szablony, które wyglądają jak "customPostType-single-slug.php", więc nie potrzeba dodatkowego kodu do zmiany szablonów dla niestandardowego typu postu. – yitwail

+0

Jak używać tego kodu do dołączania szablon strony dla określonej strony, poprzez wtyczkę? –

+0

@GregL - Aby skierować na określoną stronę, nie potrzebujesz tego niestandardowego materiału. Dostajesz to natychmiast po wyjęciu z WordPress [Hierarchia szablonów] (http://codex.wordpress.org/Template_Hierarchy#Page_display) lub ustawiając swój szablon jako, co jest myląco nazwane, "[Szablony strony] (http : //codex.wordpress.org/Page_Templates) " – eddiemoya

Powiązane problemy