Ich bin gerade dabei, ein Wordpress-Plugin zu erstellen, das einen benutzerdefinierten Beitragstyp hinzufügt, für den ich eine anzuzeigende Standardvorlage hinzufügen möchte. Im Wesentlichen handelt es sich hierbei um ein Ereignisverwaltungs-Plugin, und der benutzerdefinierte Beitragstyp ist für die Ereignisse bestimmt. Es gibt eine Handvoll benutzerdefinierter Metafelder sowie einen untergeordneten Beitragstyp (Performances). Ohne eine Standardvorlage wäre die Verwendung daher ziemlich unfreundlich. Ich möchte jedoch, dass Theme-Designer auf Wunsch ihre eigenen Vorlagen für diese Beitragstypen erstellen können.
Gibt es eine Möglichkeit, die mit meinem Plugin gelieferte Vorlage zu verwenden, es sei denn, das Thema stellt eine eigene Vorlage bereit? Was ist die beste Vorgehensweise dafür?
Bearbeiten:
Auf Anraten von Peter Rowell habe ich die Aktion template_redirect abgefangen. Wenn der Beitragstyp einer von meinen ist und im aktuellen Design keine Vorlage dafür vorhanden ist, wird standardmäßig die Vorlage des Plugins verwendet:
class FestivityTemplates {
public static function determineTemplate(){
global $post;
$standard_type = strpos($post->post_type, 'fest_');
if(is_single() && $standard_type !== false) {
FestivityTemplates::loadSingleTemplate($post);
}
}
private static function loadSingleTemplate($post) {
$template_name = 'single-'.$post->post_type.'.php';
$template = locate_template(array($template_name), true);
if(empty($template)) {
include(WP_PLUGIN_DIR . '/Festivity/lib/templates/' . $template_name);
exit();
}
}
}
add_action('template_redirect', array('FestivityTemplates', 'determineTemplate'));
Vielleicht möchten Sie sich die Routine ansehen, die WP dafür verwendet: locate_template()
. Es befindet sich in wp-includes/theme.php
und wird von einer Reihe von Funktionen in dieser Datei aufgerufen. Diese Funktionen werden von wp-includes/template-loader.php
verwendet, um das richtige type der Vorlage basierend auf der aktuellen Seite auszuwählen und dann die Themenhierarchie nach einer Übereinstimmung zu durchsuchen.
Es gibt auch eine Reihe von vorlagenbezogenen Filtern (Bildlauf nach unten), die Sie verwenden können, um die Vorlagenanforderungen zu entführen und Ihre eigene Logik auf sie anzuwenden.
Hier ist ein Beispiel, wie Sie die Aufrufe für single-saalon_events.php
und archive-saalon_events.php
hijacken und stattdessen die Dateien aus dem Ordner /your-plugin/templates/
verwenden:
# Template for displaying a single event
add_filter( 'single_template', 'saalon_events_single_template') ) ;
function saalon_events_single_template($single_template) {
global $post;
if ($post->post_type == 'saalon_events')
$single_template = dirname( __FILE__ ) . '/templates/saalon_events_single.php';
return $single_template;
}
# Template for displaying the events archive
add_filter( 'archive_template', 'saalon_events_archive_template') ) ;
function saalon_events_archive_template($archive_template) {
if ( is_post_type_archive('saalon_events') ) // since 3.1
$archive_template = dirname( __FILE__ ) . '/templates/saalon_events_archive.php';
return $archive_template;
}
Ressourcen:
http://codex.wordpress.org/Plugin_API/Filter_Reference#Template_Filtershttp://codex.wordpress.org/Plugin_API/Filter_Reference/_single_template
Oh und template_redirect
Action sieht auch gut aus! http://codex.wordpress.org/Plugin_API/Action_Reference#Template_Actions
Hoffe das hilft!
Ich weiß nicht, ob es die beste Vorgehensweise ist, aber als ich auf ein ähnliches Problem stieß, überprüfte der Haken von the_content den Post-Typ, um festzustellen, ob er mein benutzerdefinierter Typ ist, und wenn ja, gab ich genau das zurück, was ich wollte. zum Beispiel:
add_filter('the_content','events_conetnt_display');
function events_conetnt_display($content){
global $post;
if (!$post_type == "events"){
return $content;
}else{
remove_filter( 'the_content', 'events_conetnt_display' );
$events_meta = get_post_custom($post->ID);
$new_content = '<div class="event_container">';
$new_content .= '<div class="event_title">'.get_the_title($post->ID).'</div>';
$new_content .= '<div class="event_description">'.apply_filters('the_content',get_the_content()).'</div>';
$new_content .= '<div class="event_start_date">'.$events_meta['start_date'].'</div>';
$new_content .= '<div class="event_end_date">'.$events_meta['start_end'].'</div>';
//...
//whatever
//...
add_filter('the_content','events_conetnt_display');
return $new_content;
}
}
und mein Plugin hatte eine Option, mit der der Benutzer entscheiden konnte, ob er the_content Hook verwenden möchte oder ob er eine benutzerdefinierte Vorlage dafür hat, wie zum Beispiel:
if (get_option('use_content_template')){
add_filter('the_content','events_conetnt_display');
}