Пользовательские шаблоны типа публикации из папки плагинов?

Я хотел бы предложить свой настраиваемый тип сообщений в качестве плагина, чтобы люди могли его использовать, не касаясь их папки с темами. Но пользовательские шаблоны типа сообщений, такие как single-movies.php, находятся в папке темы. Есть ли способ заставить WP проверять файл single-movies.php в папке плагина? Подсоединение функции к иерархии файлов ? Или get_template_directory ();

46 голосов | спросил nathanbweb 16 Maypm11 2011, 17:16:45

3 ответа


72

Вы можете использовать привязку фильтра single_template.

/* Отфильтруйте single_template с помощью нашей специальной функции * /
add_filter ('single_template', 'my_custom_template');

function my_custom_template ($ single) {

    глобальный $ wp_query, $ post;

    /* Проверяет наличие одного шаблона по типу сообщения * /
    if ($ post-> post_type == 'ИМЯ ПОТЕНЦИАЛЬНОГО ТИПА') {
        if (file_exists (PLUGIN_PATH. '/Custom_File.php)) {
            return PLUGIN_PATH. '/Custom_File.php';
        }
    }

    return $ single;

}
ответил Bainternet 16 Maypm11 2011, 17:41:53
15

Обновленный ответ

Более чистая и более короткая версия.

function load_movie_template ($ template) {
    глобальные $ post;

    if ($ post- gt; post_type == "movie" & $ template! == locate_template (array ("single-movie.php"))) {
        /* Это сообщение "фильм"
         * И «шаблон одного фильма» не найден
         * темы или каталогов дочерних тем, поэтому загрузите их
         * из нашего каталога плагинов
         * /
        return plugin_dir_path (__FILE__). "Сингл-movie.php";
    }

    return $ template;
}

add_filter ('single_template', 'load_movie_template');

Старый ответ

Добавлена ​​проверка для настраиваемого шаблона конкретного типа в папке темы для ответа @Brainternet.

function load_cpt_template ($ template) {
    глобальные $ post;

    //Является ли это пост «my-custom-post-type»?
    if ($ post-> post_type == "my-custom-post-type") {

        //Ваш путь к плагину
        $ plugin_path = plugin_dir_path (__FILE__);

        //Имя персонализированного шаблона почтового типа
        $ template_name = 'single-my-custom-post-type.php';

        //В папке темы существует отдельный шаблон для моего настраиваемого типа сообщений? Или это также не существует в моем плагине?
        if ($ template === get_stylesheet_directory (). '/'. $ template_name
            || ! file_exists ($ plugin_path. $ template_name)) {

            //Затем верните «single.php» или «single-my-custom-post-type.php» из каталога тем.
            return $ template;
        }

        //Если нет, верните шаблон пользовательского типа плагина.
        return $ plugin_path. $ Template_name;
    }

    //Это не мой пользовательский тип сообщения, ничего не делать с помощью $ template
    return $ template;
}
add_filter ('single_template', 'load_cpt_template');

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

В этом примере шаблоны должны находиться в корневом каталоге как плагина, так и темы.

ответил campsjos 15 Jpm1000000pmFri, 15 Jan 2016 12:45:36 +030016 2016, 12:45:36
2

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

add_filter ('single_template', 'my_custom_template', 99);

Если вы этого не сделаете, иногда WP попытается перепроверять после этого фильтра. Вытягивал мои волосы из-за этого, как 2 часа.

ответил RBizzle 14 WedEurope/Moscow2016-12-14T19:33:50+03:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2016 19:33:50 +0300 2016, 19:33:50

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132