Создание Пользовательского Шаблона Сообщения по умолчанию, который может переопределить Тема

Я посреди создания Плагина Wordpress, который добавляет пользовательский тип сообщения, для которого я хотел бы включать шаблон по умолчанию для отображения. По существу это - плагин организации мероприятий, и пользовательский тип сообщения для Событий. Существует горстка пользовательских meta полей, а также дочерний тип сообщения (Действия), таким образом, без шаблона по умолчанию для отображения их с помощью этого было бы довольно недружелюбно. Но я хотел бы, чтобы разработчики темы смогли создать свои собственные шаблоны для этих типов сообщения при желании.

Существует ли способ использовать шаблон, которому предоставляют мой плагин, если тема не обеспечивает свой собственный шаблон? Какова лучшая практика для того, чтобы сделать так?

Править:

Следуя совету Peter Rowell, я поймал template_redirect действие и, если тип сообщения был одним моим, и шаблон для него не существовал в текущей теме, принял значение по умолчанию к шаблону плагина:

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
22.03.2011, 20:46
3 ответа

Вы могли бы хотеть посмотреть на стандартную программу, которую WP использует для этого: locate_template(). Это находится в wp-includes/theme.php и назван от многих функций в том файле. Те функции используются wp-includes/template-loader.php выбрать корректный тип шаблона на основе текущей страницы и затем идти по иерархии темы, ища соответствие.

4
19.02.2020, 22:10
  • 1
    : Ваше предложение состоит в том, чтобы использовать locate_template () в плагине, чтобы определить, существует ли шаблон, то загрузить мое собственное в плагине, если это не делает? Это - подход, который я рассматриваю теперь; я просто хотел удостовериться, что я понял Ваше предложение правильно. –  saalon 18.03.2011, 15:12
  • 2
    @saalon: Да. Логика переопределения совпадает с дочерними темами, кроме Вас добавляют заключительную опцию нейтрализации наличия его в каталоге плагина. –  Peter Rowell 18.03.2011, 17:56

Существует также набор связанных с шаблоном фильтров (прокручивают Вас вниз), может использовать, чтобы 'угнать' шаблонные запросы и применить Вашу собственную логику к ним.

Вот пример, как угнать призывы single-saalon_events.php и archive-saalon_events.php и используйте файлы от /your-plugin/templates/ папка вместо этого:

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

Ресурсы:
http://codex.wordpress.org/Plugin_API/Filter_Reference#Template_Filters http://codex.wordpress.org/Plugin_API/Filter_Reference/_single_template

О, и template_redirect Действие выглядит хорошим также! http://codex.wordpress.org/Plugin_API/Action_Reference#Template_Actions

Надеюсь, это поможет!

4
19.02.2020, 22:10

Я не знаю, возвратил ли его лучшая практика, но когда я столкнулся с подобной проблемой, я использовал рычаг the_content, проверил тип сообщения, чтобы видеть, если его мой пользовательский тип и раз так я, что я хотел. например:

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

и мой плагин имел опцию позволить пользователю решить, если он, что должно использовать the_content Hook или если у него есть пользовательский шаблон для этого что-то как:

if (get_option('use_content_template')){
  add_filter('the_content','events_conetnt_display');
}
1
19.02.2020, 22:10

Теги

Похожие вопросы