Listar todos os condicionais que são true
Como todas as is_*()
funções têm seu equivalente em uma variável de consulta (as funções são apenas invólucros), você também pode acessá-las de outra maneira: obtenha simplesmente tudo o que é true
.
Eu escrevi um ticket no core / trac que adiciona uma função para listar todos eles.
Enquanto isso, você pode usar as duas funções listadas como plug-ins auxiliares que mostram em qual solicitação qual condicional está disponível. Ele será impresso var_dump()
abaixo do rodapé (admin e public) no shutdown
gancho.
<?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' );
Dessa forma, você pode simplesmente passar por eles.
@scribu adicionou sua própria função ao ticket (uma solução interessante também).
<?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' );
atuação
Eu executei um teste de desempenho em cada função no meio de um modelo usando timer_start/*_stop();
. Para ser justo, renomei todas as funções para um nome de um caractere a/b/c()
.
Como você pode ver, a função codificada Chips é mais rápida, depois a minha e a última é, neste caso, o scribus.
Atualizar
Se você me conhece, conhece o meu amor pelos iteradores por sua elegância, clareza e capacidade de armazenar apenas um único item na memória, em vez de copiar uma matriz inteira durante o loop. Então, aqui está uma classe personalizada rápida que estende a \FilterIterator
, portanto, precisando apenas de um único método reformulado.
<?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
);
}
}
Pode ser usado facilmente. O $it->current()
mantém o valor, enquanto $it->key()
retorna o nome condicional / propriedade.
$cond = new WPSE\ConditionalsFilter( new \ArrayIterator(
get_object_vars( $GLOBALS['wp_query'] )
) );
foreach ( $cond as $c )
{
var_dump(
$cond->key(),
$cond->current()
);
}