あるすべての条件文をリストする true
すべてのis_*()
関数はクエリ変数に同等のものがあるため(関数は単なるラッパーです)、別の方法でそれらにアクセスすることもできますtrue
。
それらをすべてリストする機能を追加するチケットをコア/トラックに書いた。
その間、リストされている両方の関数を、どのリクエストでどの条件が使用可能かを示すヘルパープラグインとして使用できます。フックvar_dump()
でフッターの下(adminとpublicの両方)を印刷します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();
。公平を期すために、すべての関数の名前を1文字の名前に変更しましたa/b/c()
。
あなたが見ることができるように、チップスのハードコードされた関数は最も速く、それから私のものになり、最後はこの場合スクリバスです。
更新
あなたが私を知っているなら、ループ中に配列全体のコピーではなく、1つの項目のみをメモリに保持できるという、その優雅さ、明確さ、および能力に対する反復子への私の愛を知っています。だから、これはを拡張する簡単なカスタムクラスです\FilterIterator
。したがって、1つのメソッドのみを修正する必要があります。
<?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()
);
}