Niestandardowe typy postów i szablon_redirect


9

Mam dwa niestandardowe typy postów (np. Post_type_1 i post_type_2), które chciałbym przekierować do niezależnych szablonów (single-post_type_1.php i single-post_type_2.php), aby obsłużyć ich wyświetlanie. Nie chcę umieszczać szablonów wyświetlania w folderze motywów, ponieważ chcę, aby były one zawarte w odpowiednich folderach wtyczek.

Jak mogę zmusić każdego z nich do zarejestrowania hooka template_redirect bez wpływu na drugi? A może powinienem używać innej techniki?

Obecnie robię to we wtyczce 1:

add_action( 'template_redirect', 'template_redirect_1' );
function template_redirect_1() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_1' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_1 . '/views/single-post_type_1.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

A to we wtyczce 2:

add_action( 'template_redirect', 'template_redirect_2' );
function template_redirect_2() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_2' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_2 . '/views/single-post_type_2.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

Po zarejestrowaniu haka template_redirect wtyczki 2 wtyczka 1 przestaje działać.

Czy coś brakuje?

Jak najlepiej to zrobić?

Odpowiedzi:


13

W tym celu powinieneś użyć filtra template_include:

add_filter('template_include', 'wpse_44239_template_include', 1, 1);
function wpse_44239_template_include($template){
    global $wp_query;
    //Do your processing here and define $template as the full path to your alt template.
    return $template;
}

template_redirectto akcja wywoływana bezpośrednio przed wysłaniem nagłówków dla danych wyjściowych renderowanego szablonu. Jest to wygodne przechwytywanie przekierowań 404 itp., Ale nie powinno się go używać do dołączania innych ścieżek szablonów, ponieważ WordPress robi to wewnętrznie z filtrem „template_include”.

template_includei single_templatehaki zajmować się tylko ścieżki szablonu używanego do renderowania zawartości. To jest właściwe miejsce do dostosowania ścieżki szablonu.

Aktualizacja z komentarza @ChipBennett:

single_templatezostał usunięty z 3.4. Zamiast tego użyj {posttype} _template.


Tak, to działa, ale okazuje się, że działa także szablon_redirect i single_template. Rzeczywistym problemem, który ustaliłem, było to, że mam niestandardową funkcję sortowania kolumn administracyjnych, która łączy się z filtrem „żądania” i nie ograniczałem modyfikacji zmiennej $ vars tylko do sytuacji, gdy typ postu był określonego typu. Ale cieszę się, że wiem o haku template_include. Nadal nie jestem pewien, jaka jest różnica między szablonem_redirect, szablonem_włączenie i szablonem pojedynczego.
wcześniej

@anderly Zaktualizowałem swoją odpowiedź. Mam nadzieję że to pomoże.
Brian Fegter,

A co powiesz na single_template? Ten link ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) mówi, że można go użyć do dostosowania szablonu postu lub strony po wywołaniu pojedynczego szablonu. To właśnie próbuję zrobić. W każdym razie użycie filtrów template_include lub single_template działa i wydaje się, że osiąga to samo.
wcześniej

1
single_template działa w ten sam sposób, z tym że jest nazywany warunkowo. Pomaga to izolować zmiany ścieżki zamiast używania filtra młotkowego w całej witrynie.
Brian Fegter,

1
bardzo fajnie ... nie wiedziałem o template_include
helgatheviking
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.