Liệt kê tất cả các điều kiện true
Vì tất cả các is_*()
hàm có tương đương trong một biến truy vấn (các hàm chỉ là hàm bao), bạn cũng có thể truy cập chúng theo một cách khác: Nhận đơn giản tất cả những gì đang có true
.
Tôi đã viết một vé trên core / trac có thêm chức năng liệt kê tất cả.
Trong khi đó, bạn có thể sử dụng cả hai chức năng được liệt kê dưới dạng bổ trợ trợ giúp cho bạn biết yêu cầu nào có điều kiện. Nó sẽ in một var_dump()
chân trang bên dưới (cả quản trị viên & công khai) tại shutdown
hook.
<?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' );
Bằng cách này bạn có thể chỉ cần lặp qua chúng.
@ fouu đã thêm chức năng của mình vào vé (một giải pháp thú vị nữa).
<?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' );
Hiệu suất
Tôi đã chạy thử nghiệm hiệu năng trên từng chức năng ở giữa một mẫu bằng cách sử dụng timer_start/*_stop();
. Để công bằng, tôi đã đổi tên tất cả các chức năng thành một tên nhân vật a/b/c()
.
Như bạn có thể thấy, chức năng mã hóa cứng của Chips là nhanh nhất, sau đó là của tôi và cuối cùng là trong trường hợp này là scribus.
Cập nhật
Nếu bạn biết tôi, thì bạn sẽ biết tình yêu của tôi dành cho các trình vòng lặp vì sự thanh lịch, rõ ràng và khả năng của họ chỉ giữ một mục duy nhất trong bộ nhớ thay vì sao chép toàn bộ một mảng trong khi lặp. Vì vậy, đây là một lớp tùy chỉnh nhanh mở rộng một \FilterIterator
, do đó chỉ cần một phương thức duy nhất được làm lại.
<?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
);
}
}
Nó có thể được sử dụng khá dễ dàng. Các $it->current()
giữ giá trị, trong khi $it->key()
lợi nhuận tên có điều kiện / tài sản.
$cond = new WPSE\ConditionalsFilter( new \ArrayIterator(
get_object_vars( $GLOBALS['wp_query'] )
) );
foreach ( $cond as $c )
{
var_dump(
$cond->key(),
$cond->current()
);
}