Listar todos los condicionales que son true
Como todas las is_*()
funciones tienen su equivalente en una variable de consulta (las funciones son solo envoltorios), también puede acceder a ellas de otra manera: Obtenga simplemente todo lo que hay true
.
Escribí un ticket en core / trac que agrega una función para enumerarlos a todos.
Mientras tanto, puede usar ambas funciones enumeradas como complementos auxiliares que le muestran en qué solicitud qué condicional está disponible. Imprimirá un var_dump()
debajo del pie de página (tanto admin como público) en el 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' );
De esta manera, simplemente puede recorrerlos.
@scribu agregó su propia función al ticket (una solución interesante también).
<?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' );
Actuación
Ejecuté una prueba de rendimiento en cada función en medio de una plantilla usando timer_start/*_stop();
. Para ser justos, cambié el nombre de todas las funciones a un nombre de un personaje a/b/c()
.
Como puede ver, la función codificada de Chips es la más rápida, luego la mía y la última en este caso es scribus.
Actualizar
Si me conoces, entonces conoces mi amor por los iteradores por su elegancia, claridad y su capacidad de mantener solo un elemento en la memoria en lugar de copiar una matriz completa durante el bucle. Entonces, aquí hay una clase personalizada rápida que se extiende a \FilterIterator
, por lo tanto, solo necesita un método modificado.
<?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
);
}
}
Se puede usar con bastante facilidad. El $it->current()
mantiene el valor, mientras que $it->key()
devuelve el nombre condicional / propiedad.
$cond = new WPSE\ConditionalsFilter( new \ArrayIterator(
get_object_vars( $GLOBALS['wp_query'] )
) );
foreach ( $cond as $c )
{
var_dump(
$cond->key(),
$cond->current()
);
}