it-swarm.com.de

Definieren Sie eine benutzerdefinierte Seitenvorlage ohne eigene .php-Datei

Gibt es eine Möglichkeit, eine Seitenvorlage aus einer Funktion/einem Filter/einem Hook zu definieren, ohne dass eine .php-Datei mit dem Kommentar oben auf der Seite vorhanden ist, um den Vorlagennamen zu deklarieren?


Zum Beispiel, anstatt dies zu tun:

some-custom-page-template.php

/**
* Template Name: Some Custom Page Template
*/

another-custom-page-template.php

/**
* Template Name: Another Custom Page Template
*/

Ich frage mich, ob ich etwas machen kann wie:

functions.php

wp_some_function_to_define_templates( 'Some Custom Page Template' );
wp_some_function_to_define_templates( 'Another Custom Page Template' );

EDIT: Ich schreibe ein komplexes und eine Art experimentelles WP Thema - Es ist als Objekt- Ausgerichtet wie es WP sein mag, habe ich Controller-Klassen, um zu entscheiden, was auf jeder Seite angezeigt werden soll, DAO-Klassen, um Daten aus DB abzurufen, Twig-Vorlagen, um die Ansichten zu generieren und so weiter ...

Ich habe den Code so weit verbreitet, dass meine Seitenvorlagen zu einer Codezeile geworden sind, in der ich einen Controller aufrufe und ihn den Job machen lasse, um schließlich eine Twig-Vorlage zu rendern. Also habe ich mich entschlossen, diesen Aufruf an den Controller zu verschieben, in den template_include-Filter, damit ich nicht einmal Code in die Seitenvorlagen einfügen muss ...

Ich werde vielleicht Seitenvorlagen los, aber ich brauche sie trotzdem, um group pages irgendwie zu machen, um einige erweiterte benutzerdefinierte Feldgruppen für sie zu setzen, etc ...

So endete ich mit ungefähr 15 PHP Dateien, die nur einen Kommentar oben mit einem Vorlagennamen enthalten, was genau das ist, was ich vermeiden möchte, indem ich diese Vorlagen von einer Funktion aus definiere ...

Versuche ich, das Rad neu zu erfinden ? Vielleicht in gewisser Hinsicht, aber ich denke, es wird ein wirklich cooles Thema, sehr wartbar und modifizierbar ...

6
MikO

WordPress liest die Vorlagen aus den Datei-Headern und legt sie dann im Cache fest. Verwenden von wp_cache_set() nad ein Schlüssel, der vom MD5 abgeleitet ist, hat Stylesheet-Ordner.

Wenn Sie diesen Cache überschreiben, können Sie die gewünschten Vorlagen anzeigen. Um diesen Cache zu überschreiben, müssen wir wp_cache_set() erneut mit demselben Schlüssel aufrufen.

Schreiben wir zunächst eine Funktion, die die anzuzeigenden Vorlagen abruft. Es gibt viele Möglichkeiten, Vorlagen festzulegen: Option, Konfigurationsdatei, Filter oder eine Kombination davon:

function get_custom_page_templates() {
  $templates = array();
  // maybe by options? --> $templates = get_option( 'custom_page_templates' );
  // maybe by conf file? --> $templates = include 'custom_page_templates.php';
  return apply_filters( 'custom_page_templates', $templates );
}

Danach müssen wir die Vorlagen innerhalb der Seitenbearbeitung abrufen, kurz nachdem WordPress den Cache gespeichert hat. Außerdem müssen wir sie erneut abrufen, wenn das Bearbeitungsformular veröffentlicht wird, damit sie gespeichert werden können.

Wir können 'edit_form_after_editor' hook für den ersten Bereich verwenden, 'load-post.php' und 'load-post.new' für den zweiten:

add_action( 'edit_form_after_editor', 'custom_page_templates_init' );
add_action( 'load-post.php', 'custom_page_templates_init_post' );
add_action( 'load-post-new.php', 'custom_page_templates_init_post' );

function custom_page_templates_init() {
  remove_action( current_filter(), __FUNCTION__ );
  if ( is_admin() && get_current_screen()->post_type === 'page' ) {
    $templates = get_custom_page_templates(); // the function above
    if ( ! empty( $templates ) )  {
      set_custom_page_templates( $templates );
    }
  }
}

function custom_page_templates_init_post() {
  remove_action( current_filter(), __FUNCTION__ );
  $method = filter_input( INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_STRING );
  if ( empty( $method ) || strtoupper( $method ) !== 'POST' ) return;
  if ( get_current_screen()->post_type === 'page' ) {
    custom_page_templates_init();
  }
}

Als letztes müssen wir die Funktion set_custom_page_templates() schreiben, die den Cache bearbeitet, um unsere Vorlagen einzuschließen. Dabei müssen alle von den Dateiköpfen definierten Vorlagen zusammengeführt werden:

function set_custom_page_templates( $templates = array() ) {
  if ( ! is_array( $templates ) || empty( $templates ) ) return;
  $core = array_flip( (array) get_page_templates() ); // templates defined by file
  $data = array_filter( array_merge( $core, $templates ) );
  ksort( $data );
  $stylesheet = get_stylesheet();
  $hash = md5( get_theme_root( $stylesheet ) . '/' . $stylesheet );
  $persistently = apply_filters( 'wp_cache_themes_persistently', false, 'WP_Theme' );
  $exp = is_int( $persistently ) ? $persistently : 1800;
  wp_cache_set( 'page_templates-' . $hash, $data, 'themes', $exp );
}

Wenn dieser Code ausgeführt wird, können Sie benutzerdefinierte Vorlagen mit der Methode einrichten, die Sie in der Funktion get_custom_page_templates() verwendet haben. Hier verwende ich den Filter:

add_filter( 'custom_page_templates', function( $now_templates ) {

  $templates = array(
    'some-custom-page-template' => 'Some Custom Page Template',
    'another-custom-page-template' => 'Another Custom Page Template' ,
  );

  return array_merge( $now_templates, $templates );

} );

Und du bist fertig.

6
gmazzap

Wenn ich Sie verstehe, können Sie dies mit dem template_include hook tun. Zum Beispiel:

add_filter( 'template_include', 'phpless_template');
function phpless_template( $template ) {  
  get_header();
  // some php
  get_footer();
  die;
}
2
s_ha_dum

Ich schlage Ihnen eine einfachere Lösung vor:

  1. Definieren Sie in Ihrer Konfigurations-/Funktions-/Indexdatei eine Konfigurationsvariable $config_template = false; (*)
  2. Erstelle einen Ordner "include" (wahrscheinlich hast du schon einen)
  3. Legen Sie dort die Dateien some-custom-page-template.php und another-custom-page-template.php ab
  4. In diesen Dateien weisen Sie einfach $ config_template einen Wert zu und benötigen dann die Seite, die Sie zum Rendern der Schleife verwenden - zum Beispiel: $config_template = 'some-custom-page'; require( "../index.php" );
  5. In dieser Datei (index.php) können Sie basierend auf dem Wert von $ config_template die gewünschten Einstellungen vornehmen

Mit dieser Methode erzwingen Sie nicht den normalen Workflow von WP (dies ist nie eine gute Idee), aber Sie halten Ihr Projekt ausreichend sauber.

(*) Wahrscheinlich verwenden Sie bereits einige Objekteigenschaften, um Ihre Konfigurationen zu verwalten. Dort platzieren Sie die Variable $ config_template.

0
Marco Panichi