Hinzufügen von Elementen zum Seitenvorlagen-Dropdown-Menü auf dem Seitenbearbeitungsbildschirm

Ich entwickle ein WP-Thema mit MVC-Ansatz. Es hat nur index.php , functions.php und styles.css im übergeordneten Verzeichnis. Daher möchte ich keine Seitenvorlagen auf der Seite platzieren, sondern möchte sie programmatisch aus View-classn bereitstellen, während die functionalität des Bearbeitungsbildschirms gleich bleibt.

Benutzer müssen über Seitenvorlagen verfügen, um eine Option auf dem Bearbeitungsbildschirm auszuwählen. Wie füge ich dem Dropdown-Menü “Vorlage” erfolgreich Artikel hinzu?

Ich habe versucht, den theme_page_templates Filter theme_page_templates .

Beispielcode:

 add_filter( 'theme_page_templates', function($templates){ $templates['my-page-template.php'] = "My Page Template"; return $templates; }); 

Dies funktioniert nicht, da array_intersect_assoc() im gefilterten Array verwendet wird, wodurch das hinzugefügte Seitenvorlagenelement entfernt wird. Ich verstehe nicht, warum diese function verwendet wird. Es scheint, dass Sie die Seitenvorlage nur aus der Liste entfernen können, aber keine neue mit dem angegebenen Filter hinzufügen können.

Gibt es einen anderen Weg?

Solutions Collecting From Web of "Hinzufügen von Elementen zum Seitenvorlagen-Dropdown-Menü auf dem Seitenbearbeitungsbildschirm"

Ich dachte, ich würde dir einen anderen Ansatz bieten. Es ist auch ein wenig hackisch, aber es ist ein allgemeiner Zweck und erlaubt Ihnen, einfach den Dateinamen und die Bezeichnung, die Sie verwenden möchten, zu registrieren, so:

 if ( class_exists( 'WPSE_196995_Page_Templates' ) ) { WPSE_196995_Page_Templates::register_page_template( 'My Page Template', 'my-page-template.php' ); } 

Sie können den obigen Code zur Datei functions.php Ihres Themes hinzufügen.

Damit das oben Gesagte tatsächlich funktioniert, habe ich eine eigenständige class implementiert, die als Plugin verwendet oder einfach in functions.php kopiert werden functions.php :

 < ?php /** * Plugin Name: WPSE 196995 Page Templates * * Class WPSE_196995_Page_Templates * * Allows registering page templates via code. */ class WPSE_196995_Page_Templates { static $registered_templates = array(); static function on_load() { /** * Add registered page templates to 'page_template' cache. * @note This hook is called just before page templates are loaded */ add_action( 'default_page_template_title', array( __CLASS__, '_default_page_template_title' ) ); } /** * Register page templates * * @param string $label * @param string $filename */ static function register_page_template( $label, $filename ) { self::$registered_templates[ $filename ] = $label; } /** * Add registered page templates to 'page_template' cache. * * @param string $title * * @return string mixed */ static function _default_page_template_title( $title ) { /** * @var WP_Theme $theme */ $theme = wp_get_theme(); /** * Access the cache the hard way since WP_Theme makes almost everything private */ $cache_hash = md5( $theme->get_stylesheet_directory() ); /** * Get the page templates as the 'page_templates' cache will already be primed */ $page_templates = wp_cache_get( $key = "page_templates-{$cache_hash}", $group = 'themes' ); /** * Add in registered page templates */ $page_templates += self::$registered_templates; /** * Now update the cache, which is what the get_page_templates() uses. */ wp_cache_set( $key, $page_templates, $group, 1800 ); /** * We are using this hook as if it were an action. * So do not modify $title, just return it. */ return $title; } } WPSE_196995_Page_Templates::on_load(); 

Die class stellt natürlich die Methode register_page_template() zur Verfügung, aber um Ihre Seitenvorlage tatsächlich hinzuzufügen, aktualisiert sie den Wert für 'page_templates' im 'page_templates' .

Es ist ein bisschen hacky, weil WordPress die meisten Methoden und Eigenschaften der WP_Theme class private , aber zum Glück benutzten sie den öffentlich zugänglichen WordPress- WP_Theme , um die Werte zu speichern. Und indem Sie den 'default_page_template_title' Hook 'default_page_template_title' aktualisieren, der aufgerufen wird, bevor das Dropdown-Menü für die Seitenvorlagen erstellt und an den Browser gesendet wird, können wir WordPress dazu bringen, Ihre Seitenvorlage (n) wie gewünscht anzuzeigen.

Mit einem hässlichen Hack herumgekommen: – /. Ich werde die Antwort aktualisieren, wenn ich später mit jQuery gehe. Die Lösung benötigt weiterhin Vorlagendateien, aber der Code für die Vorlagendatei wird von der index.php

  1. Ich habe ein neues template/ Verzeichnis erstellt und dort alle Seitenvorlagen abgelegt.
  2. Alle Seitenvorlagen sind leer. Wir brauchen es nur, damit sie auf dem Drop-down-Menü erscheinen.
  3. Verwenden Sie den template_include Filter, um zu index.php umzuleiten

Code

Beispiel für leere Seitenvorlage

 < ?php /* Template Name: No Sidebar * * */ 

Filter

 add_filter( 'template_include', function ($template ) { if ( !is_page_template() ) return $template; return locate_template( array( 'index.php' ), true ); }, 99); 

Ich habe ein Trac-Ticket erstellt , um das Hinzufügen von Vorlagen über Filter zu ermöglichen.