saalon
  • 0
Новичок

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

  • 0

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

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

Редактировать:

Следуя совету Питера Роуэлла, я поймал действие 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'));
Share
  1. Не используйте template_redirect . Вы должны использовать template_include вместо этого.

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

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

    Вот пример того, как перехватить вызовы 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

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

    • 0
  4. Я не знаю, является ли это лучшей практикой, но когда я столкнулся с похожей проблемой, я использовал хук 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 или у него есть собственный шаблон для этого, например:

    if (get_option('use_content_template')){
      add_filter('the_content','events_conetnt_display');
    }
    
    • 0

Оставить ответ

You must login to add an answer.