it-swarm.com.de

Erstellen Sie eine "dateilose" Seitenvorlage in Functions.php

(Mit "Seitenvorlage" meine ich eine Themendatei mit der Überschrift "Vorlagenname" , die im Dropdown - Feld "Vorlage" auf der Seite ausgewählt werden kann Seitenadministrator.)

In mehreren Fällen habe ich Seitenvorlagen erstellt, die durch Verknüpfen mit the_content oder pre_get_posts oder ähnlichem erreicht werden konnten. Das führt mich zu der Frage, ob es eine Möglichkeit gibt, eine auswählbare Designvorlage in functions.php oder ein Plugin zu "registrieren", ohne die Designdatei selbst zu erstellen.

Gründe, warum ich das machen möchte:

  • In den Szenarien, die ich vorhabe, kopiere ich die page.php normalerweise fast wörtlich. Das bedeutet, dass zukünftige Änderungen an page.php zweimal vorgenommen werden müssen. Dies ist umso schmerzhafter, wenn Aktualisierungen an untergeordneten Themen vorgenommen werden.
  • Ich mag das "Template" -Feld UI. Für meine Kunden macht es mehr Sinn als nur einige der Alternativen (siehe unten), die ich mir vorstellen kann.

In meinem Fall kann ich mir einige Problemumgehungen vorstellen, z. B. die Verwendung einer benutzerdefinierten Meta-Box oder eines Shortcodes (um Inhalte einzufügen, die ansonsten in einer Vorlage enthalten sind). Ich könnte sogar in der Lage sein, dies zu tun (woran ich gerade gedacht, aber noch nicht getestet habe):

/*
Template Name: My Template
*/

get_template_part( 'page' );

Aber am Ende komme ich immer wieder auf diese Idee zurück und bin gespannt, ob jemand weiß, wie es geht. Wenn Sie denken, dass es eine schreckliche Idee ist, interessiert mich diese Meinung auch.

=======

UPDATE: Ich sollte das hinzufügen:

  • Ich weiß, dass es ein $templates-Array für jedes Thema aus diesem Support-Forenthread gibt, das im Wesentlichen das Gegenteil von dem tut, was ich tun möchte.
  • Ich weiß, dass es ein verstecktes benutzerdefiniertes Feld _wp_page_template von diesem WPSE-Thread gibt .

Ich denke, ich muss nur verstehen, wie das Vorlagenarray und benutzerdefinierte Felder zusammenarbeiten (und ich bin auch unsicher, wie die versteckten benutzerdefinierten Metafelder funktionieren).

=======

UPDATE II: 08.10.12 Das Theme-Backend wurde erheblich überarbeitet, da diese Frage gestellt wurde und das obige $ templates-Array nicht mehr existiert.

6
mrwweb

Ich habe immer noch den Wunsch, so etwas zu tun, und habe mich auf die folgende Lösung geeinigt, die ich im OP vorgeschlagen habe und die ich aus einigen Gründen mag:

  1. Es ist sehr transparent und fühlt sich im Einklang mit der Logik im Thema.
  2. Es macht es sehr einfach, eine Vorlage später bei Bedarf anzupassen.

Benutzerdefinierte Vorlage

Hier ist die gesamte Vorlagendatei, wenn ich kein benutzerdefiniertes Markup benötige. Sagen wir, es ist in /wp-content/themes/my-theme/templates/my-template.php

<?php
/**
 * Template Name: My Template
 */
get_template_part( 'page' );

Es benutzen

Dies gibt uns jetzt zwei "Haken", mit denen wir alle möglichen Dinge tun können:

  1. Eine Body-Klasse von .page-template-my-template für CSS.
  2. Die Fähigkeit, if( is_page_template( 'templates/my-template.php' ) ) {... zu verwenden

Ich habe # 1 verwendet, um Layouts, Farben usw. zu ändern, und ich habe # 2 verwendet, um the_content() zu filtern, post_classes hinzuzufügen, benutzerdefinierte Felder mit ACF einzurichten und vieles mehr. Manchmal verwende ich sie in Kombination, um eine Vorlage in voller Breite zu erstellen, für die noch eine Seitenleiste erforderlich ist. Es ist verdammt mächtig und doch sehr einfach einzurichten und zu verstehen, wenn Sie es nicht selbst eingerichtet haben.

Dies ist immer noch auf ein Thema beschränkt (Sie konnten es nicht mit einem Plugin tun), aber für die Zwecke meiner Frage war dies eine gute Antwort für mich.

1
mrwweb

Seiten sind im Allgemeinen eher unflexibel. Sie sollten einen benutzerdefinierten Post-Typ verwenden . Es wäre sehr wahrscheinlich problematisch, sich in das eigentliche Dropdown-Menü für Seitenvorlagen einzuklinken (ich bezweifle, dass dies ohne ernsthaftes Herumhacken funktionieren würde). Schreiben Sie am besten einfach Ihre eigene Meta-Box-Dropdown-Liste.

Ich denke, Sie sind mit get_template_part auf dem richtigen Weg. Es ist einfach, flexibel und hilft wirklich bei der Strukturierung komplexer Ausgaben. Die Verwendung beider Parameter hilft. Es ist wohl einfacher, Codestücke in Vorlagen zu kopieren/einzufügen, als alle möglichen verrückten Funktionen zu schreiben, und es ist sinnvoller für andere Personen oder wenn Sie den Code später noch einmal besuchen.

Die andere Alternative ist eine ähnliche Person, die jedoch auf Funktionsebene die Aktion template_redirect verwendet.

Sie könnten Funktionen basierend auf Ihrer Meta-Auswahl haben, die eindeutige Vorlagen laden. Jetzt, wo ich darüber nachdenke, könnten Sie sie wahrscheinlich mit get_template_part kombinieren. Der folgende Code wird nicht getestet.

So etwas wie:

function my_special_template() {
//page "contact" for example, make this your meta dropdown selection
    if (is_page('Contact')){  
        get_template_part( 'special-chunk' );  //file named special-chunk.php
    }
}

add_action('template_redirect', 'my_special_template');

Am Ende des Tages schnappst du dir aber immer noch eine Art .php-Datei.

2
Wyck

Ich frage mich, ob Sie eine dateilose Vorlage mit dem theme_page_templates-Filter wie folgt registrieren möchten:

/**
 * Add a file-less page template to the page template dropdown 
 */
add_filter( 'theme_page_templates', function( $page_templates, $wp_theme, $post ) 
{
    // Edit this to your needs
    $fileless_theme_slug  = 'my_fileless_page_template';
    $fileless_theme_label = esc_html__( 'My File-Less Page Template', 'my-domain' );

    // Append if it doesn't already exists  
    if( ! isset( $page_templates[$fileless_theme_slug] ) )
        $page_templates[$fileless_theme_slug] = $fileless_theme_label ;

    return $page_templates;
}, PHP_INT_MAX, 3 );

so im Backend auftauchen:

file-less template

und ändern Sie die Ausgabe mit:

/**
 * OUtput for our file-less page template
 */
add_action( 'template_redirect', function() 
{   
    // Target pages with out custom template        
    if( is_page_template( 'my_fileless_page_template' ) )
    {
        // Stop the default page template to be displayed
        add_filter( 'template_include', '__return_null', PHP_INT_MAX );

        // Custom output
        my_fileless_page_template_output();
    }
}, PHP_INT_MAX );

Hier definieren wir die my_fileless_page_template_output() für unsere Bedürfnisse, z. Dazu gehören die Kopf- und Fußzeile des Themas, die Hauptabfrageschleife oder sogar Vorlagenteile. Ich denke, es ist in Ordnung, am Ende exit zu überspringen.

1
birgire