Elencare tutti i condizionali che sono true
Poiché tutte le is_*()
funzioni hanno il loro equivalente in una variabile di query (le funzioni sono solo wrapper), puoi accedervi anche in un altro modo: ottieni semplicemente tutto ciò che è true
.
Ho scritto un ticket su core / trac che aggiunge una funzione per elencarli tutti.
Nel frattempo è possibile utilizzare entrambe le funzioni elencate come plug-in di supporto che mostrano su quale richiesta è disponibile il condizionale. Verrà stampato un gancio var_dump()
sotto il piè di pagina (sia admin che pubblico) 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' );
In questo modo puoi semplicemente collegarli.
@scribu ha aggiunto la propria funzione al ticket (anche una soluzione interessante).
<?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' );
Prestazione
Ho eseguito un test delle prestazioni su ciascuna funzione nel mezzo di un modello utilizzando timer_start/*_stop();
. Per essere onesti, ho rinominato tutte le funzioni con un nome di un carattere a/b/c()
.
Come puoi vedere, la funzione hard coded di Chips è la più veloce, quindi diventa mia e l'ultima è in questo caso scribus.
Aggiornare
Se mi conosci, allora conosci il mio amore per gli iteratori per la loro eleganza, chiarezza e la loro capacità di tenere in memoria solo un singolo elemento anziché la copia di un intero array durante il looping. Quindi ecco una rapida classe personalizzata che estende a \FilterIterator
, quindi necessita di un solo metodo rielaborato.
<?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
);
}
}
Può essere usato abbastanza facilmente. Il $it->current()
detiene il valore, mentre $it->key()
restituisce il nome condizionale / proprietà.
$cond = new WPSE\ConditionalsFilter( new \ArrayIterator(
get_object_vars( $GLOBALS['wp_query'] )
) );
foreach ( $cond as $c )
{
var_dump(
$cond->key(),
$cond->current()
);
}