Intereting Posts

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

Я в середине создания 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')); 

Solutions Collecting From Web of "Создание шаблона пользовательской публикации по умолчанию, который может изменять тема"

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

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

Вот пример, как захватить вызовы для single-saalon_events.php и archive-saalon_events.php и archive-saalon_events.php использовать файлы из /your-plugin/templates/ folder:

 # 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

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

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

Я не знаю, была ли его лучшая практика, но когда я столкнулся с аналогичной проблемой, я использовал крюк 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'); }