WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

get_children() WP 2.0

Получает дочерние записи: вложения, ревизии, подстраницы и т.д. Аналог get_posts().

Работает на основе: get_posts()

Хуков нет.

Возвращает

Массив объектов вложений или пустой массив.

Шаблон использования

$childrens = get_children( [
	'post_parent' => 0,
	'post_type'   => 'any', 
	'numberposts' => -1,
	'post_status' => 'any'
] );

if( $childrens ){
	foreach( $childrens as $children ){
		// вывод
	}
}

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

get_children( $args, $output );
$args(массив)
Массив аргументов, определяющий получение данных в итоговый массив.
По умолчанию: предустановки
$output(константа)
Константа, определяющая какого рода массив будет сформирован: OBJECT, ARRAY_A (ассоциативный), ARRAY_N (пронумерованный).
По умолчанию: OBJECT

Параметры аргумента $args

Кроме этого списка параметров аргумента $args, можно использовать любой из параметров WP_Query.

numberposts(число)
Сколько дочерних записей получать. -1 — все.
По умолчанию: -1
post_parent(число)
ID поста, записи, страницы вложения (дочерние записи) которой нужно получить. 0 — получит вложения без родителя (не прикрепленные файлы); null — получит все вложения, не важно есть родитель или нет.
post_type(строка)
Тип записи который нужно получить: attachment, page, revision или any - любой из указанных.
По умолчанию: any
post_status(строка)
Получить записи по указанному статусу (значение из колонки post_status): publish, draft, inherit или any — любой из указанных.
По умолчанию: any
post_mime_type(строка)
Полный или частичный mime тип: image, video, video/mp4audio.
По умолчанию: ''

Полный список принимаемых параметров смотрите в описании get_posts().

Примеры

#1 Получим все прикрепленные файлы записи

$postid = 25;
$attachments = get_children( array( 'post_type'=>'attachment', 'post_parent'=>$postid ) );

/* Получит:
Array (
	[7144] => WP_Post Object
		(
			[ID] => 7144
			[post_author] => 1
			[post_date] => 2016-06-19 07:47:55
			[post_date_gmt] => 2016-06-19 02:47:55
			[post_content] => 
			[post_title] => democracy-ico
			[post_excerpt] => 
			[post_status] => inherit
			[comment_status] => open
			[ping_status] => closed
			[post_password] => 
			[post_name] => democracy-ico
			[to_ping] => 
			[pinged] => 
			[post_modified] => 2016-06-19 07:47:55
			[post_modified_gmt] => 2016-06-19 02:47:55
			[post_content_filtered] => 
			[post_parent] => 67
			[guid] => /wp-content/uploads/2010/06/democracy-ico.png
			[menu_order] => 0
			[post_type] => attachment
			[post_mime_type] => image/png
			[comment_count] => 0
			[filter] => raw
		)

	[5576] => WP_Post Object
		(
		...
*/

#1.1 Получим прикрепленные файлы записи по типу

Если нужно получить вложения и обработать их используем такой код:

$images = get_children( 'post_type=attachment&post_mime_type=image' );
$videos = get_children( 'post_type=attachment&post_mime_type=video/mp4' );

if( ! $images ) {
	// нет вложений
}
else {
	foreach ( $images as $attachment_id => $attachment ) {
		echo wp_get_attachment_image( $attachment_id, 'full' );
	}
}

//  Если нет необходимости обрабатывать пустой результат:
foreach ( (array) $videos as $attachment_id => $attachment ) {
	echo wp_get_attachment_link( $attachment_id );
}

#2. Получим и выведем все картинки связанные с постом 740

$attachments = get_children( array(
	'post_parent'    => 740,
	'order'          => 'ASC',
	'post_mime_type' => 'image',
	'post_type'      => 'attachment',
) );

if( $attachments ){
	foreach( $attachments as $attachment ){
		$image_src = wp_get_attachment_image_src( $attachment->ID, 'thumbnail' )[0]  ?: wp_get_attachment_image_src( $attachment->ID, 'full' )[0];
		$image_desc = $attachment->post_content ?: $attachment->post_title;
		echo '<img src="'. $image_src .'" alt="'. esc_attr( $image_desc ) .'" class="current">';
	}
}
else
	echo 'Вложений нет';

#3. Покажем первую картинку связанную с постом

В примере ниже, главный массив в индексах имеет ID картинок (но если мы не знает ID как мы может получить доступ к первой картинке? - это может оказаться неудобным). Код ниже показывает, как напрямую добраться до информации о картинке из массива $child_image. Используется в цикле.

$args = array(
	'numberposts' => 1,
	'order'=> 'DESC',
	'post_mime_type' => 'image',
	'post_parent' => $post->ID,
	'post_type' => 'attachment'
);

$get_children_array = get_children( $args, ARRAY_A );  // вернет массив с ключами: [$image_ID]... 
$rekeyed_array = array_values( $get_children_array ); // обнулим ключи
$child_image = $rekeyed_array[0]; // первая картинка из массива  

print_r( $child_image );    // Выведем данные массива на экран.
echo $child_image['ID'];    // Так получим ID картинки.

#4 Подстановочный знак в параметре post_mime_type

Этот пример показывает, как в параметре 'post_mime_type' использовать подстановочный знак %, который работает как % в SQL запросе LIKE (комбинация любых символов).

$children = get_children( array(
	'post_parent'   => $post->ID,
	'post_status'   => 'inherit',
	'post_type'     => 'attachment',
	'post_mime_type' => 'audio/%'
) );

#5 Блок навигации под древовидной записью

Навигация выводится так, что показаны все записи на одном уровне и один уровень дочерних записей к текущей.

/**
 * Выводит блок навигации под древовидной записью.
 *
 * Навигация выводится так, что показаны все записи на одном уровне и один уровень дочерних записей к текущей.
 *
 * @return string HTML код блока со ссылками.
 */
function handbook_nav_block() {
	// выходим если это не тип записи 'handbook'
	if( ! is_singular('handbook') ) return;

	global $post;

	// соберем все ID
	$include = [ $post->ID ];

	// родители
	$include = array_merge( $include, $post->ancestors );

	$arr = [
		'post_type'   => $post->post_type,
		//'post_status' => 'any',
		//'orderby'     => 'menu_order',
		//'order'       => 'ASC',
	];

	// соседи
	$siblings = get_children( $arr + ['post_parent' => $post->post_parent] );
	foreach( (array) $siblings as $pst ){
		$include[] = $pst->ID;

		// Дочерние страницы у всех записей на одном уровне с текущей, только если это не верхний уровень.
		/*
		if( $pst->post_parent !== 0 ){
			if( $subchilds = get_children( $arr + ['post_parent' => $pst->ID] ) )
				foreach( (array) $subchilds as $pst ) $include[] = $pst->ID;
		}
		*/
	}

	// соберем все дочерние
	$childs = get_children( $arr + ['post_parent' => $post->ID] );
	foreach( (array) $childs as $pst ){
		$include[] = $pst->ID;
	}

	$children = wp_list_pages([ 'include'=>$include, 'post_type'=>'handbook', 'title_li'=>'', 'echo'=>0 ]);

	return '
	<style>
		.handbook__nav{ background: #eee; padding: .8em 2.5rem; margin: 2em -2.5rem; }
		.handbook__nav .title{ margin:.3em 0 .7em; }
		.handbook__nav .current_page_item > a{ font-weight:bold; }
		.handbook__nav ul ul{ margin-left:0; }
		.handbook__nav ul.children{ margin-top:.5em; }
	</style>
	<div class="handbook__nav">
		<h3 class="title">Навигация по разделу</h3>
		<ul>
			'. $children .'
		</ul>
	</div>';

}

Заметки

  • Смотрите: get_posts()
  • Global. WP_Post. $post Global post object.

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

С версии 2.0.0 Введена.

Код get_children() WP 5.6

<?php
function get_children( $args = '', $output = OBJECT ) {
	$kids = array();
	if ( empty( $args ) ) {
		if ( isset( $GLOBALS['post'] ) ) {
			$args = array( 'post_parent' => (int) $GLOBALS['post']->post_parent );
		} else {
			return $kids;
		}
	} elseif ( is_object( $args ) ) {
		$args = array( 'post_parent' => (int) $args->post_parent );
	} elseif ( is_numeric( $args ) ) {
		$args = array( 'post_parent' => (int) $args );
	}

	$defaults = array(
		'numberposts' => -1,
		'post_type'   => 'any',
		'post_status' => 'any',
		'post_parent' => 0,
	);

	$parsed_args = wp_parse_args( $args, $defaults );

	$children = get_posts( $parsed_args );

	if ( ! $children ) {
		return $kids;
	}

	if ( ! empty( $parsed_args['fields'] ) ) {
		return $children;
	}

	update_post_cache( $children );

	foreach ( $children as $key => $child ) {
		$kids[ $child->ID ] = $children[ $key ];
	}

	if ( OBJECT == $output ) {
		return $kids;
	} elseif ( ARRAY_A == $output ) {
		$weeuns = array();
		foreach ( (array) $kids as $kid ) {
			$weeuns[ $kid->ID ] = get_object_vars( $kids[ $kid->ID ] );
		}
		return $weeuns;
	} elseif ( ARRAY_N == $output ) {
		$babes = array();
		foreach ( (array) $kids as $kid ) {
			$babes[ $kid->ID ] = array_values( get_object_vars( $kids[ $kid->ID ] ) );
		}
		return $babes;
	} else {
		return $kids;
	}
}

Из метки: query (запрос)

Еще из раздела: Вложения (media файлы)

13 комментов
Полезные 1 Все
    Войти