WordPress HOW-TO: Eigene Templates in Plugins verwenden
Möchte man ein eigenständiges Plugin schreiben, welches beispielsweise einen eigenen Custom Post Type erstellt steht man vor einem Problem, wenn man die Ausgabe des CPTs selber steuern will.
Da die Ausgabe standardmässig nämlich direkt über das installierte Theme geschieht, kann man als Plugin Entwickler nicht selber steuern, wie sie sich gestaltet.
Als autonom agierendes Plugin, welches themeunabhängig funktionieren soll, muss also eine Weiche programmiert werden, um die Ausgabe selber steuern zu können:
/* Quit => security */
defined('ABSPATH') OR exit;
// --------------------------------------------------------------------
/* settings */
$cpt = 'pix_cpt'; //custom post type key
$single = 'pix_single'; //name der single template datei ohne .php endung
$archive = 'pix_archive'; //name der archive template datei ohne .php endung
$plugin_path = 'mein/pfad/zum/plugin'; //pfad zum plugin (kann z.B. mit der plugin konstanten gesetzt werden, insofern diese konstante gesetzt wurde)
$template_folder = '/templates/'; //der pfad zum template ordner innerhalb des plugins. Die slashes am anfang und am ende nicht vergessen!
// --------------------------------------------------------------------
/* The filter */
add_filter( 'template_include', 'pix_template_controller');
// --------------------------------------------------------------------
/* The filter function */
function pix_template_controller( $template ) {
// Post ID
$post_id = get_the_ID();
// For all other CPT
if ( get_post_type( $post_id ) == $cpt && is_archive() ) {
return pix_get_template_hierarchy( $archive );
} else if ( get_post_type( $post_id ) == $cpt ) {
return pix_get_template_hierarchy( $single );
} else {
return $template;
}
}
// --------------------------------------------------------------------
/* The function that checks if the file exists in the theme folder. */
function pix_get_template_hierarchy( $template ) {
// Get the template slug
$template_slug = rtrim( $template, '.php' );
$template = $template_slug . '.php';
// Check if a custom template exists in the theme folder, if not, load the plugin template file
if ( $theme_file = locate_template( $template ) ) {
$file = $theme_file;
} else {
$file = $plugin_path . $template_folder . $template;
}
return $file;
}
Diese Datei umfasst den gesamten Template Switch. Sie funktioniert so, dass die Funktion prüft, ob die in den Settings festgelegten Template Dateien innerhalb des installierten Themes existieren oder nicht. Falls sie existieren, werden die Theme Dateien geladen, falls nicht werden die Plugin Templates geladen.
So kann man als Plugin Entwickler seine Ausgabe komplett selbst steuern und lässt dem Endbenutzer / Themeentwickler die Möglichkeit, das Template innerhalb des Themes selber anzupassen.