wake-up-neo.com

Erstellen einer benutzerdefinierten Standardpostvorlage, die von einem Thema überschrieben werden kann

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'));
4
saalon

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.

4
Peter Rowell

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!

4
Michal Mau

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');
}
1
Bainternet