Перечислите все условия, которые 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()
.
Как вы можете видеть, жестко закодированная функция Chips является самой быстрой, затем идет моей, а последней в данном случае является 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()
);
}