Benutzerdefinierte Beitragstypen und template_redirect


9

Ich habe zwei benutzerdefinierte Beitragstypen (z. B. post_type_1 und post_type_2), die ich zu unabhängigen Vorlagen (single-post_type_1.php und single-post_type_2.php) umleiten möchte, um deren Anzeige zu verwalten. Ich möchte die Anzeigevorlagen nicht in den Themenordner einfügen, da sie in ihren jeweiligen Plugin-Ordnern enthalten sein sollen.

Wie kann jeder von ihnen einen template_redirect-Hook registrieren, ohne den anderen zu beeinflussen? Oder sollte ich eine andere Technik verwenden?

Derzeit mache ich das in Plugin 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;
        }

    }
}

Und das in Plugin 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;
        }

    }
}

Sobald ich den template_redirect-Hook von Plugin 2 registriert habe, funktioniert Plugin 1 nicht mehr.

Vermisse ich etwas

Was ist der beste Weg, dies zu tun?

Antworten:


13

Sie sollten hierfür den Filter template_include verwenden:

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_redirectist die Aktion, die direkt aufgerufen wird, bevor Header für die Ausgabe der gerenderten Vorlage gesendet werden. Es ist ein praktischer Hook, um 404-Weiterleitungen usw. durchzuführen, sollte jedoch nicht zum Einschließen anderer Vorlagenpfade verwendet werden, da WordPress dies von Natur aus mit dem Filter 'template_include' tut.

template_includeund single_templateHooks behandeln NUR den Pfad der Vorlage, die zum Rendern des Inhalts verwendet wird. Dies ist der richtige Ort, um einen Vorlagenpfad anzupassen.

Update vom Kommentar von @ChipBennett:

single_templatewurde ab 3.4 entfernt. Verwenden Sie stattdessen {posttype} _template.


Das funktioniert also, aber es stellt sich heraus, dass template_redirect und single_template auch funktionieren. Das eigentliche Problem, das ich festgestellt habe, war, dass ich eine benutzerdefinierte Funktion zum Sortieren von Admin-Spalten habe, die in den Anforderungsfilter eingebunden ist, und die Änderung der Variablen $ vars nicht auf nur beschränkt habe, wenn der Post-Typ von einem bestimmten Typ war. Aber ich bin froh, über den Hook template_include Bescheid zu wissen. Ich bin mir immer noch nicht sicher, was der Unterschied zwischen template_redirect, template_include und single_template ist.
anderly

@anderly Ich habe meine Antwort aktualisiert. Hoffe das hilft.
Brian Fegter

Was ist also mit single_template? Über diesen Link ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) kann die Vorlage für einen Beitrag oder eine Seite angepasst werden, wenn die einzelne Vorlage aufgerufen wird. Das versuche ich zu tun. In jedem Fall funktioniert die Verwendung der Filter template_include oder single_template und scheint dasselbe zu erreichen.
anderly

1
single_template funktioniert genauso, außer dass es bedingt aufgerufen wird. Dies hilft, Pfadänderungen zu isolieren, anstatt einen Hammerfilter auf der gesamten Site zu verwenden.
Brian Fegter

1
sehr cool ... ich wusste nicht über template_include
helgatheviking
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.