wp_filter_object_list()WP 3.0.0

Фильтрует массив объектов по указанным параметрам (key=>value) и получает объекты из переданного массива, которые подходят под указанные критерии.

Различия между: wp_list_filter() и wp_filter_object_list()

  • wp_list_filter( $list, $args, $operator ) — фильтрует переданный массив и возвращает его элементы как есть (полностью), например если в значении был объект, то вернется весь объект.
  • wp_filter_object_list( $list, $args, $operator, $field ) — работает точно также. Но если указать 4-й параметр $field, то после фильтрации массива, сработает функция wp_list_pluck() и из значений отфильтрованного массива будет взято только указанное в 4-м параметре поле (ключ).
Работает на основе: WP_List_Util::filter()
1 раз — 0.000001 сек (скорость света) | 50000 раз — 0.95 сек (очень быстро) | PHP 7.1.11, WP 4.9.8

Хуков нет.

Возвращает

Массив. массив объектов или массив полей. Если не удалось получить данные, то пустой массив: array().

Использование

wp_filter_object_list( $list, $args, $operator, $field );
$list(массив) (обязательный)
Массив объектов, который с которым будем работать.
$args(массив)
Параметры по которым нужно выбирать объекты. Указываем в массиве key => val.
По умолчанию: array()
$operator(строка)

Указывает как обрабатывать указанные в $args параметры. Может быть:

  • AND - объекты у которых есть все указанные параметры.
  • OR - объекты у которых есть любой из указанных параметров.
  • NOT - объекты у которых нет указанных параметров.

По умолчанию: and

$field(строка)
Поле объекта которое нужно выводить, вместо вывода всего объекта.
По умолчанию: false

Примеры

0

#1 Выбор объектов по указанным параметрам

Предположим мы сделали выборку постов и у нас есть массив объектов постов $posts. Который содержит вот такие объекты:

Array
(
	[0] => WP_Post Object (
			[ID] => 2773
			[post_author] => 1
			[post_date] => 2013-06-12 21:09:57
			[post_date_gmt] => 2013-06-12 21:09:57
			[post_content] => контент статьи
			[post_title] => Огромный текст для примера работы скрипта "содержание"
			[post_excerpt] =>
			[post_status] => publish
			[comment_status] => open
			[ping_status] => open
			[post_password] =>
			[post_name] => post_name_ogromniy_text
			[to_ping] =>
			[pinged] =>
			[post_modified] => 2013-07-30 21:40:25
			[post_modified_gmt] => 2013-07-30 21:40:25
			[post_content_filtered] =>
			[post_parent] => 0
			[guid] => http://example.com/?p=2773
			[menu_order] => 0
			[post_type] => post
			[post_mime_type] =>
			[comment_count] => 0
	)
	[1] => WP_Post Object ( ... )
)

Нам нужно из этого массива получить ID постов у которых автор=1 и комментарии открыты (comment_status=open). Воспользуемся wp_filter_object_list():

$args = array('post_author'=>'1', 'comment_status'=>'open');

$filtered_posts = wp_filter_object_list( $posts, $args, 'or', 'ID' );

$filtered_posts будет содержать:

Array
(
	[0] => 19
	[1] => 23
	[2] => 34
	[3] => 45
	[4] => 56
	[5] => 67
	[6] => 78
)

Параметр "or" говорит функции, чтобы выбирались посты с post_author=1 или comment_status=open. Если указать "and", то будут выбираться посты post_author=1 и comment_status=open.

'ID' означает, что надо вернуть массив со значениями поля ID объекта. Если не указать этот параметр, то будет возвращен весь объект, а не конкретное его поле.

Список изменений

С версии 3.0.0 Введена.
С версии 4.7.0 Uses WP_List_Util class.

Код wp_filter_object_list() WP 6.5.2

function wp_filter_object_list( $input_list, $args = array(), $operator = 'and', $field = false ) {
	if ( ! is_array( $input_list ) ) {
		return array();
	}

	$util = new WP_List_Util( $input_list );

	$util->filter( $args, $operator );

	if ( $field ) {
		$util->pluck( $field );
	}

	return $util->get_output();
}