Используйте template_include с пользовательскими типами записей

11

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

add_filter ('template_include', 'sermon_template_include');
function sermon_template_include ($ template) {
    if (get_query_var ('post_type') == 'wpfc_sermon') {
        if (is_archive () || is_search ()):
           if (file_exists (TEMPLATEDIR. '/archive-wpfc_sermon.php'))
              вернуть ШАБЛОН. '/Archive-wpfc_sermon.php';
           вернуть dirname (__ FILE__). '/Views/archive-wpfc_sermon.php';
        еще:
           if (file_exists (TEMPLATEDIR. '/single-wpfc_sermon.php'))
              вернуть ШАБЛОН. '/Single-wpfc_sermon.php';
           вернуть dirname (__ FILE__). '/Views/single-wpfc_sermon.php';
        ENDIF;
    }
    вернуть $ шаблон;
}

Проблема в том, что это не работает! :-) Он всегда выбирает файл в папке моего плагина. Есть идеи, что делать? Я пробовал много вариантов, но я не могу заставить что-то работать! Заранее спасибо! Джек

РЕДАКТИРОВАТЬ

Я ожидаю, что archive-wpfc_sermon.php будет возвращен из папки темы, если она существует. Тем не менее, файл из моего плагина всегда возвращается. Спасибо за вашу помощь! Это из моего плагина Sermon Manager, доступного в репозитории.

Джек
источник
Какой файл шаблона темы возвращается, когда вы вместо этого ожидаете, что ваш файл шаблона плагина будет возвращен?
Чип Беннетт
Я ожидаю, что archive-wpfc_sermon.php будет возвращен из папки темы, если она существует. Тем не менее, файл из моего плагина всегда возвращается. Спасибо за вашу помощь @ChipBennett! Это из моего плагина Sermon Manager, доступного в репозитории.
Джек,

Ответы:

6

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

  1. Путь к файлу плагина : заменить dirname(__FILE__)наplugin_dir_path( __FILE__ )
  2. Путь к файлу темы : заменить TEMPLATEDIRнаget_stylesheet_directory()

Вполне возможно, что проблема возникает из-за прямой ссылки на константы.

Чип Беннетт
источник
0

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

// Template selection Defines the template for the custom post types.
function my_template_redirect()
  {
  global $wp;
  global $wp_query;
  if ($wp->query_vars["post_type"] == "your_custom_post_type")
  {
    // Let's look for the your_custom_post_type_template.php template 
   // file in the current theme
    if (have_posts())
      {
          include(TEMPLATEPATH . '/your_custom_post_type_template.php');
          die();
      }
      else
      {
          $wp_query->is_404 = true;
      }
    }
}

Все, что вам нужно сделать, это добавить этот скрипт в ваш файл functions.php и поместить файл шаблона в каталог вашей темы.

Это может стоить выстрела и не может вызвать конфликт с вашим плагином. Однако я не уверен в этом.

Я забыл ... не забудьте добавить действие. :)

add_action("template_redirect", 'my_template_redirect');
Николь
источник
Спасибо @Nicole, код, который я разместил, прекрасно работает для вызова моего файла шаблона. Тем не менее, я хочу просканировать текущую папку темы на наличие файла с таким же именем, прежде чем загружать его в папку с плагинами.
Джек,
@Jack, так в основном это вызов вашего файла из каталога плагинов перед шаблоном в каталоге тем в данный момент? хм, придется подумать еще об этом. Я люблю хороший вызов!
Николь
Вот так! Это действительно поставило меня в тупик.
Джек,
@ Джек, это может звучать как глупый вопрос, так что прости меня, если это так. :) Вы разместили код в плагине или в файле functions.php?
Николь
@Jack Приведенный выше код извлекает файл шаблона из каталога вашей темы. Вы можете использовать оператор if, чтобы проверить, сработало ли «include», и, если нет, попытаться извлечь шаблон из каталога подключаемого модуля.
Стивен Харрис