Не существует основной глобальной переменной, которая возвращает текущий контекст. Однако вы можете создать свой собственный, используя контекстные шаблоны условных тегов . Вы можете пройтись по условным тегам в том же порядке, что и ядро WordPress, выполнив следующие действия wp-includes/template-loader.php
.
Просто оберните ваш вывод в пользовательскую функцию Theme. Вот как я это делаю (примечание: я не думаю, что строго следую шаблону loader.php):
function oenology_get_context() {
$context = 'index';
if ( is_home() ) {
// Blog Posts Index
$context = 'home';
if ( is_front_page() ) {
// Front Page
$context = 'front-page';
}
}else if ( is_date() ) {
// Date Archive Index
$context = 'date';
} else if ( is_author() ) {
// Author Archive Index
$context = 'author';
} else if ( is_category() ) {
// Category Archive Index
$context = 'category';
} else if ( is_tag() ) {
// Tag Archive Index
$context = 'tag';
} else if ( is_tax() ) {
// Taxonomy Archive Index
$context = 'taxonomy';
} else if ( is_archive() ) {
// Archive Index
$context = 'archive';
} else if ( is_search() ) {
// Search Results Page
$context = 'search';
} else if ( is_404() ) {
// Error 404 Page
$context = '404';
} else if ( is_attachment() ) {
// Attachment Page
$context = 'attachment';
} else if ( is_single() ) {
// Single Blog Post
$context = 'single';
} else if ( is_page() ) {
// Static Page
$context = 'page';
}
return $context;
}
Затем я просто передаю oenology_get_context()
в качестве параметра, например:
get_template_part( 'loop', oenology_get_context() );
Я думаю, что что-то в этом роде было бы хорошим кандидатом на ядро, хотя я не уверен, что лучший способ реализовать. Я хотел бы представить патч, хотя.
template-loader.php
.index
никогда не совпадет, какis_front_page()
илиis_home()
будет срабатывать.is_home()
должно быть первым, так как оно возвращает,front-page
даже когда активирована настройка «последнее сообщение» и нет главной страницы. Только что протестировано.is_home() && 'page'
, в зависимости от потребностей. Более подробную информацию о сообщениях блога и статической странице на главной странице можно найти в моем собственном ответе здесь: wordpress.stackexchange.com/questions/208503/… . Кстати, @Chip и @helgatheviking, было бы лучше использовать использоватьswitch
вместо многихelseif
(это более эффективно ;-). С уважением!немного лицевой стороны, потому что ответ на чистом PHP
источник
Если вы посмотрите на исходный код
get_template_part
функции, вы увидите:Он создает массив из 2 имен шаблонов:
{$slug}-{$name}.php
и{$slug}.php
используетсяload_template
для поиска файла шаблона и включения его (2-й параметрtrue
, что означает включение этого файла).Вы можете имитировать эту функцию, чтобы возвращать путь к файлу шаблона, а не включать его, например:
Применение:
Вы можете играть больше,
$template
чтобы получить то, что вы хотите.источник
archive.php
, и повторно использовать ееloop-archive.php
Перечислите все условия, которые
true
Поскольку все
is_*()
функции имеют свои эквиваленты в переменной запроса (функции являются просто обертками), вы можете получить к ним доступ и другим способом: просто получить все, что естьtrue
.Я написал тикет на core / trac, который добавляет функцию для перечисления их всех.
В то же время вы можете использовать обе перечисленные функции в качестве вспомогательных плагинов, которые показывают, по какому запросу доступно какое условие. Он выведет
var_dump()
нижний колонтитул (как администратора, так и общественности) наshutdown
крючок.Таким образом, вы можете просто просмотреть их.
@scribu добавил свою собственную функцию в заявку (тоже интересное решение).
Представление
Я выполнил тест производительности для каждой функции в середине шаблона, используя
timer_start/*_stop();
. Честно говоря, я переименовал все функции в одноименное имяa/b/c()
.Как вы можете видеть, жестко закодированная функция Chips является самой быстрой, затем идет моей, а последней в данном случае является scribus.
Обновить
Если вы знаете меня, то вы знаете мою любовь к итераторам за их элегантность, ясность и их способность хранить в памяти только один элемент вместо копии целого массива во время цикла. Итак, вот быстрый пользовательский класс, который расширяет класс
\FilterIterator
, поэтому требуется только один переработанный метод.Это может быть использовано довольно легко.
$it->current()
Имеет значение, в то время как$it->key()
возвращает имя условного / свойства.источник