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:
/**
* Template Name: Some Custom Page Template
*/
/**
* Template Name: Another Custom Page Template
*/
Ich frage mich, ob ich etwas machen kann wie:
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 ...
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.
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;
}
Ich schlage Ihnen eine einfachere Lösung vor:
$config_template = false;
(*)$config_template = 'some-custom-page'; require( "../index.php" );
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.