web-dev-qa-db-fra.com

Création d'un modèle de publication personnalisé par défaut qu'un thème peut remplacer

Je suis en train de construire un plugin Wordpress qui ajoute un type de publication personnalisé, pour lequel j'aimerais inclure un modèle par défaut à afficher. Il s'agit essentiellement d'un plug-in de gestion d'événements et le type de publication personnalisé est destiné aux événements. Il existe une poignée de méta-champs personnalisés, ainsi qu'un type de publication enfant (Performances). Par conséquent, sans modèle par défaut pour les afficher, son utilisation serait assez désagréable. Mais je souhaiterais que les concepteurs de thèmes puissent créer leurs propres modèles pour ces types d'articles, s'ils le souhaitent.

Existe-t-il un moyen d'utiliser le modèle fourni avec mon plugin à moins que le thème ne fournisse son propre modèle? Quelle est la meilleure pratique pour le faire?

Modifier:

Suivant les conseils de Peter Rowell, j'ai saisi l'action template_redirect et, si le type de publication était l'un des miens et si un modèle pour celle-ci n'existait pas dans le thème actuel, utilisez par défaut le modèle du plugin:

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

Vous voudrez peut-être regarder la routine que WP utilise pour cela: locate_template() . Il est dans wp-includes/theme.php et est appelé à partir d'un certain nombre de fonctions de ce fichier. wp-includes/template-loader.php utilise ces fonctions pour sélectionner le modèle type correct en fonction de la page en cours, puis pour parcourir la hiérarchie des thèmes à la recherche d'une correspondance.

4
Peter Rowell

Il existe également un groupe de filtres liés aux modèles } (défilement vers le bas) que vous pouvez utiliser pour "Détourner" les demandes de modèles et leur appliquer votre propre logique .

Voici un exemple comment détourner les appels pour single-saalon_events.php et archive-saalon_events.php et utiliser les fichiers du dossier /your-plugin/templates/ à la place:

# 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;
}

Ressources:
http://codex.wordpress.org/Plugin_API/Filter_Reference#Template_Filters } _ http://codex.wordpress.org/Plugin_API/Filter_Reference__single_template

Oh et template_redirect L'action est bonne aussi! _ { http://codex.wordpress.org/Plugin_API/Action_Reference#Template_Actions } _

J'espère que cela t'aides!

4
Michal Mau

Je ne sais pas si c'est sa meilleure pratique, mais quand j'ai été confronté à un problème similaire, j'ai utilisé le crochet the_content qui vérifiait le type de message pour voir si c'était mon type personnalisé et si oui, je suis retourné exactement ce que je voulais. par exemple:

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;
    }
}

et mon plugin avait une option permettant à l'utilisateur de décider s'il souhaite utiliser the_content Hook ou s'il dispose d'un modèle personnalisé pour cela, par exemple:

if (get_option('use_content_template')){
  add_filter('the_content','events_conetnt_display');
}
1
Bainternet