WordPress как на ладони
wordpress jino

get_children() WP 2.0

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

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

Хуков нет.

Возвращает

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

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

get_children( $args, $output );

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

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

if( $childrens ){
	foreach( $childrens as $children ){
		// вывод
	}
}
$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

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

$attachments = get_children( $args );

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 $text;

	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 children: wp-includes/post.php WP 4.8.2

<?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,
	);

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

	$children = get_posts( $r );

	if ( ! $children )
		return $kids;

	if ( ! empty( $r['fields'] ) )
		return $children;

	update_post_cache($children);

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

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

Cвязанные функции

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

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

get_children 16 комментариев
Полезные 1 Вопросы 1 Все
  • Эдуард cайт: credit-zdes.ru @

    Здравствуйте, подскажите пожалуйста как добавить расширение файлов? У меня есть код:

    <?php
    		$args = array(
    		  'post_type' => 'attachment',
    		  'post_mime_type' => 'application/zip, application/pdf, application/msword',
    		  'numberposts' => -1,
    		  'post_status' => null,
    		  'post_parent' => $post->ID,
    		  'orderby' => 'menu_order',
    		  'order' => 'desc'
    		  );
    		$attachments = get_posts($args);
    		if ($attachments) {
    		  foreach ($attachments as $attachment) {
    			echo '<li><a href="'.wp_get_attachment_url($attachment->ID).'">';
    			echo $attachment->post_title;
    			echo ' - скачать</a> </li> ';
    		  }
    		}
    	?>

    Все работает правильно, но вот имена скачиваемых файлов выводит без расширения, выводит просто имя файлов sad

    Ответить2.8 года назад #
    • Kama4486

      Там неоткуда получить расширение файла, но его можно вырезать из ссылки на файл, так:

      foreach ($attachments as $attachment) {
      			$url = wp_get_attachment_url($attachment->ID);
      			preg_match('~.*\.(.*?)$~', $attach->guid, $ext );
      			$ext = $ext[1];
      
      			echo '<li><a href="'. $url .'">'. $attachment->post_title .'('. $ext .') - скачать</a></li> ';
      		  }
      1
      Ответить2.3 года назад #
  • Ярослав @

    Отличный пост, но можно вопрос? Как вывести все картинки прикрепленные к посту, кроме первой?

    Ответить2.2 года назад #
    • Kama4486

      Добавьте в параметры 'offset' => 1,

      1
      Ответить2.2 года назад #
      • Ярослав @

        Спасибо за наводку, но не работает. Скорей всего что-то я делаю неправильно..

        Вот мой код:

        $args2 = array(
        	'order'=> 'ASC',
        	'post_mime_type' => 'image',
        	'post_parent' => $post->ID,
        	'post_type' => 'attachment',
        	'offset' => 1
        );
        $get_children_array2 = get_children( $args2,ARRAY_A );
        $rekeyed_array2 = array_values($get_children_array2);
          foreach ($rekeyed_array2 as $rekeyed_array2) {
           echo wp_get_attachment_image( $rekeyed_array2['ID'], 'thumbnail');
        }

        Возможно что-то не так с перебором массива с помощью foreach?

        Ответить2.2 года назад #
        • Ярослав @

          Дополню, этот код выводит миниатюры всех картинок, прикрепленных к посту. Изменение значений

          'offset' => 1

          на 0, 2 и проч. ни к чему не приводит. Так вся куча картинок и выходит.

          Ответить2.2 года назад #
          • Kama4486

            Да, почему-то offset не работает в get_children(). Попробуйте array_shift() так:

            $args = array(  'order'=> 'ASC',
            	'post_mime_type' => 'image',
            	'post_parent' => $post->ID,
            	'post_type' => 'attachment',
            );
            if ( $images = get_children( $args, ARRAY_A ) ){
               $remove = array_shift( $images ); // убираем первую картинку
            	foreach( $images as $image ){
            		echo wp_get_attachment_image( $image['ID'], 'thumbnail');
            	}
            }
            1
            Ответить2.2 года назад #
            • Ярослав @

              Спасибо за ответ, но выкрутился немного по-другому внимательно изучая ваш сайт:

              $media = get_attached_media( 'image', get_the_ID() );
              $first = array_shift( $media );
              $first = $first->guid;
              echo '<a href="'. $first .'"><img src="'. $first .'" /></a>'; 
              foreach ($media as $media) {
              $image_url = $media->guid;
              echo '<a href="'. $image_url .'"><img src="'. $image_url .'" /></a>';
              }

              Задача стояла вывести первую картинку, прикрепленную к посту, отдельно от остальных.

              Ответить2.2 года назад #
              • Kama4486
                foreach ($media as $media)

                Не используйте две одинаковые переменные тут...

                Ответить2.2 года назад #
  • Станислав cайт: vsestatyui.ru

    Подскажите пожалуйста.
    У меня на сайте http://vsestatyi.ru
    первая запись в категориях дублируется.
    В каждой категории запись идет первой в списке и за ней вторая такая же.
    Как это можно исправить?

    Ответитьгод назад #
    • Kama4486

      Эта запись наверное помечена как прикрепленная sticky убери эту галку в редактировании записи...

      Ответитьгод назад #
  • Рафаэль

    Мне кажется второй пример не рабочий. Нууу .... он не должен выводить все картинки. Или я ошибаюсь?!

    Ответитьгод назад #
    • Kama4486

      Да, вы правы! Поправил пример. Спасибо за комментарий! thank_you

      Ответитьгод назад #
  • avense4 cайт: videovegas.ru

    Как можно проще всего проверить наличие у страницы дочерных страниц по её ID например?

    Наличие родителя можно проверить например так:

    if( $post->post_parent ) { ... }

    А вот как быть с проверкой дочерных страниц..?
    Только так разве что:

    $child_pages = get_children( 'post_parent='.$post->ID.'&post_type=page&numberposts=-1&post_status=publish' );
    if( $child_pages )  { ... }
    • Kama4486

      Да, только numberposts=1 лучше поставить... Это очень быстрый запрос, не стоит переживать по этому поводу...

  • Кирилл

    Подскажите пожалуйста.
    Пытаюсь вывести в кастомных записях список дочерных страниц, перепробывал все что можно в том числе и эту статью, но результата никакого, может кто знает в чем проблема?

    Ответить4 месяца назад #

Здравствуйте, !

Ваш комментарий