Intereting Posts

Есть ли переменная для имени части шаблона?

Тот, который вы назвали шаблоном с get_template_part() (или locate_template() ), есть способ узнать, в каком шаблоне вы находитесь.

Например, если вы вызываете get_template_part('loop','archive'); from archive.php

и затем работают в вашем файле loop-archive.php. есть способ определить переменную, которая имеет имя текущей части шаблона …. так что $template = 'loop-archive' . лучше, возможно, в двух частях, поэтому «loop» и «archive», но я могу сделать это с некоторым разбиением строк.

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

Solutions Collecting From Web of "Есть ли переменная для имени части шаблона?"

Существует не основная глобальная переменная, которая возвращает текущий контекст. Тем не менее, вы можете создавать свои собственные, используя условные теги условного шаблона . Вы можете проходить условные теги в том же порядке, что и ядро ​​WordPress, следуя wp-includes/template-loader.php .

Просто оберните свой вывод в пользовательскую функцию темы. Вот как я это делаю (заметьте: я не думаю, что я строго следую шаблону-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() ); 

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

бит facepalm, потому что ответ находится в чистом PHP

 $path_parts = pathinfo(__FILE__); //var_dump($path_parts); echo $path_parts['filename']; 

Если вы посмотрите на исходный код функции get_template_part , вы увидите:

 function get_template_part( $slug, $name = null ) { do_action( "get_template_part_{$slug}", $slug, $name ); $templates = array(); if ( isset($name) ) $templates[] = "{$slug}-{$name}.php"; $templates[] = "{$slug}.php"; locate_template($templates, true, false); } 

Он создает массив из двух имен шаблонов: {$slug}-{$name}.php и {$slug}.php и использует load_template для поиска файла шаблона и его включения (второй параметр – true , что означает, что этот файл ).

Вы можете имитировать эту функцию, чтобы вернуть путь к файлу шаблона, а не включать его, например:

 function my_get_template_part( $slug, $name = null, $include = false ) { do_action( "get_template_part_{$slug}", $slug, $name ); $templates = array(); if ( isset($name) ) $templates[] = "{$slug}-{$name}.php"; $templates[] = "{$slug}.php"; return locate_template($templates, $include, false); } 

Применение:

 // Don't load the template $template = my_get_template_part( 'loop', 'archive', false ); // Or load the template $template = my_get_template_part( 'loop', 'archive', true ); // Get the file name only $template = basename( $template ); // Without .php extension $template = substr( $template, 0, -4 ); 

Вы можете играть больше с $template чтобы получить то, что хотите.

Список всех условных выражений, которые являются true

Поскольку все функции is_*() имеют свой эквивалент в переменной запроса (функции – это просто обертки), вы можете получить к ним доступ также другим способом: получить просто все, что true .

Я написал билет на core / trac, который добавляет функцию, чтобы перечислить их все.

Между тем вы можете использовать обе перечисленные функции в качестве вспомогательных плагинов, которые показывают вам, на каком запросе это условное значение доступно. Он будет печатать var_dump() ниже нижнего колонтитула (как администратора, так и публики) при завершении shutdown .

 <?php /** Plugin Name: (#62232) »kaiser« List all conditionals that are true */ function get_conditionals() { global $wp_query; foreach ( get_object_vars( $wp_query ) as $is_key => $is_value ) { if ( $is_value && preg_match( "/is_/", $is_key ) ) $conditionals[] = $is_key; } return var_dump( $conditionals ); } add_action( 'shutdown', 'get_conditionals' ); 

Таким образом, вы можете просто пропустить их.

@scribu добавил свою собственную функцию в билет (интересное решение тоже).

 <?php /** Plugin Name: (#62232) »scribu« List all conditionals that are true */ function get_query_flags( $wp_query = null ) { if ( !$wp_query ) $wp_query = $GLOBALS['wp_query']; $flags = array(); foreach ( get_object_vars( $wp_query ) as $key => $val ) { if ( 'is_' == substr( $key, 0, 3 ) && $val ) $flags[] = substr( $key, 3 ); } return var_dump( $flags ); } add_action( 'shutdown', 'get_query_flags' ); 

Представление

Я провел тест производительности для каждой функции в середине шаблона, используя timer_start/*_stop(); , Чтобы быть справедливым, я переименовал все функции в одно имя персонажа a/b/c() .

Как вы можете видеть, чипс жестко закодированная функция работает быстрее, а затем идет моя, а последняя – в этом случае scribus.

введите описание изображения здесь

Обновить

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

 <?php namespace WPSE; class ConditionalsFilter extends \FilterIterator { /** * Accepts properties that start with `is_` and have a positive boolean value * @return bool */ public function accept() { return 0 === strncasecmp( $this->key(), 'is_', 3 ) and filter_var( $this->current(), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ); } } 

Его можно использовать довольно легко. Значение $it->current() содержит значение, а $it->key() возвращает имя условного / свойства.

 $cond = new WPSE\ConditionalsFilter( new \ArrayIterator( get_object_vars( $GLOBALS['wp_query'] ) ) ); foreach ( $cond as $c ) { var_dump( $cond->key(), $cond->current() ); }