Можно ли определить шаблон для пользовательского типа публикации в плагине независимо от активной темы?


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

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

Я хочу, чтобы это подчинялось "это просто парадигма "работает", но прямо сейчас пользователи не могут просто удалить папку в каталоге плагинов - они должны добавлять соответствующие файлы в свою папку тем каждый раз, когда они переключают темы. Я проверил иерархию шаблонов, и у меня правильные имена файлов, но они не используются Wordpress, если они находятся в папке плагинов или в папке плагинов/шаблонов.

Спасибо!

Author: ZachM, 2012-06-19

1 answers

Вам необходимо использовать фильтр template_include, который является общим фильтром для всех включений шаблона.

add_filter( 'template_include', 'my_plugin_templates' );
function my_plugin_templates( $template ) {
    $post_types = array( 'project' );

    if ( is_post_type_archive( $post_types ) && ! file_exists( get_stylesheet_directory() . '/archive-project.php' ) )
        $template = 'path/to/list/template/in/plugin/folder.php';
    if ( is_singular( $post_types ) && ! file_exists( get_stylesheet_directory() . '/single-project.php' ) )
        $template = 'path/to/singular/template/in/plugin/folder.php';

    return $template;
}

Я не полностью протестировал бит архива типа post, возможно, вам потребуется включить проверку с помощью is_tax( $taxonomies ), чтобы заставить его работать с соответствующими пользовательскими архивами таксономии.

 8
Author: sanchothefat, 2012-06-20 10:08:31