Listen Sie alle Bedingungen auf, die sind true
Da alle is_*()
Funktionen in einer Abfragevariablen gleichwertig sind (die Funktionen sind nur Wrapper), können Sie auch auf andere Weise darauf zugreifen: Holen Sie sich einfach alle, die es sind true
.
Ich habe ein Ticket auf core / trac geschrieben , das eine Funktion hinzufügt, um sie alle aufzulisten .
In der Zwischenzeit können Sie beide aufgelisteten Funktionen als Hilfs-Plugins verwenden, die Ihnen zeigen, auf welche Anfrage welche Bedingung verfügbar ist. Es wird ein var_dump()
unter der Fußzeile (sowohl admin als auch public) am shutdown
Haken gedruckt .
<?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' );
Auf diese Weise können Sie sie einfach durchlaufen.
@scribu hat dem Ticket seine eigene Funktion hinzugefügt (auch eine interessante Lösung).
<?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' );
Performance
Ich habe einen Leistungstest für jede Funktion in der Mitte einer Vorlage mit ausgeführt timer_start/*_stop();
. Um fair zu sein, habe ich alle Funktionen in einen Namen mit einem Zeichen umbenannt a/b/c()
.
Wie Sie sehen können, ist die fest codierte Funktion von Chips am schnellsten, dann geht sie an meine und zuletzt ist in diesem Fall Scribus.
Aktualisieren
Wenn Sie mich kennen, dann kennen Sie meine Liebe zu Iteratoren wegen ihrer Eleganz, Klarheit und ihrer Fähigkeit, nur ein einzelnes Element im Speicher zu halten, anstatt ein ganzes Array während des Loopings zu kopieren. Hier ist also eine schnelle benutzerdefinierte Klasse, die a erweitert \FilterIterator
und daher nur eine einzige Methode überarbeitet.
<?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
);
}
}
Es kann recht einfach verwendet werden. Der $it->current()
enthält den Wert, während $it->key()
der Bedingungs- / Eigenschaftsname zurückgegeben wird.
$cond = new WPSE\ConditionalsFilter( new \ArrayIterator(
get_object_vars( $GLOBALS['wp_query'] )
) );
foreach ( $cond as $c )
{
var_dump(
$cond->key(),
$cond->current()
);
}