Вопрос или проблема
Как мне получить вложения со всех подстраниц конкретного ID страницы?
Пример:
КОНКРЕТНАЯ СТРАНИЦА
- Дочерняя (с вложениями)
- Дочерняя (с вложениями)
- Дочерняя (с вложениями)
В настоящее время я использую этот код для получения всех вложений по всему сайту, однако я хотел бы ограничить это получение изображениями только от всех дочерних страниц конкретной страницы.
$args = array(
'post_type' => 'attachment',
'numberposts' => -1,
'post_status' => null,
'post_parent' => null
);
$attachments = get_posts( $args );
if ( $attachments ) {
foreach ( $attachments as $post ) {
setup_postdata( $post );
the_title();
the_attachment_link( $post->ID, false );
the_excerpt();
}
}
Почти все, используя следующий код:
$mypages = get_pages( 'child_of=19' );
foreach ( $mypages as $mypage ) {
$attachments = get_children( array(
'post_parent' => $mypage->ID,
'numberposts' => 1,
'post_type' => 'attachment',
'post_mime_type' => 'image',
'orderby' => 'rand'
) );
if ( $attachments ) {
foreach ( $attachments as $post ) {
setup_postdata($post);
the_title();
the_attachment_link( $post->ID, false );
the_excerpt();
}
}
}
Однако существуют две оставшиеся проблемы:
- Ограничение общего количества фотографий. Использование
'numberposts'
ограничивает только количество изображений, получаемых из каждого поста. - Случайный порядок.
Orderby => rand
только случайным образом перемешивает изображения внутри каждого поста. Я хотел бы случайным образом перемешать порядок для всего.
Вы движетесь в правильном направлении …
-
Ваш запрос работает как цикл … поэтому, чтобы ограничить общее количество изображений, вам нужно сначала добавить их все в массив, а затем как бы вы определили, как ограничить общее количество,
например, что если на одной странице будет 50 изображений, а на следующей странице всего 1 -
С учетом вашего первого пункта … ваш текущий код — это цикл, который проходит через каждую дочернюю страницу. Поэтому вам нужно сначала собрать все изображения в массив, и вы сможете их перемешать.
Предложение – попробуйте использовать WordPress Codex wp_get_attachment_image, чтобы перечислить изображения на ваших страницах
и сравните это с вашим кодом / примером кода http://codex.wordpress.org/Template_Tags/get_posts#Show_all_attachments
Дэмиен
Вы можете попробовать get_pages следующим образом:
<?php
$args = array(
'child_of' => 'ВАША СТРАНИЦА',
'parent' => 'ВАША СТРАНИЦА',
'post_type' => 'attachment',
'post_status' => 'publish',
'numberposts' => -1
);
?>
ПРИМЕЧАНИЕ: child_of
Обратите внимание, что параметр child_of также получит “внуков” данного ID, а не только прямых потомков. Родитель ограничит это только дочерними страницами, которые имеют это в качестве родителя. Без внуков. Таким образом, вы можете сохранить все данные вложений в многомерный массив и перемешать его. Затем используйте цикл for для отображения нужного количества вложений.
Ответ или решение
Для того чтобы извлечь вложения из всех дочерних страниц конкретной страницы в WordPress, необходимо использовать определенные функции и аргументы, которые позволят ограничить количество загружаемых изображений и случайно перемешать их.
1. Подготовка массива дочерних страниц
Сначала необходимо получить дочерние страницы указанного ID. Вы можете использовать функцию get_pages()
с нужными параметрами:
$mypages = get_pages(array(
'child_of' => YOUR_PAGE_ID,
'parent' => YOUR_PAGE_ID,
));
2. Извлечение вложений
После того как мы получили массив дочерних страниц, можно извлечь вложения из каждой дочерней страницы. Однако для этого необходимо использовать другую функцию get_children()
, которая позволяет получить вложения по ID родительского поста. Ниже представлен пример кода:
$all_attachments = array(); // Массив для хранения всех вложений
foreach ($mypages as $mypage) {
$attachments = get_children(array(
'post_parent' => $mypage->ID,
'post_type' => 'attachment',
'post_mime_type' => 'image',
'post_status' => 'inherit', // Убедитесь, что получаете опубликованные вложения
'numberposts' => -1 // Получить все вложения
));
if ($attachments) {
$all_attachments = array_merge($all_attachments, $attachments); // Слияние массива
}
}
3. Ограничение общего количества изображений
Чтобы ограничить общее количество извлекаемых изображений, из полученного массива вложений можно использовать функцию array_slice()
для ограничения:
$total_limit = 10; // Задайте желаемое количество изображений
$all_attachments = array_slice($all_attachments, 0, $total_limit);
4. Случайная сортировка изображений
Чтобы случайным образом перемешать массив изображений, можно воспользоваться функцией shuffle()
:
shuffle($all_attachments); // Перемешивание массива
5. Вывод вложений на экран
Теперь, когда у нас есть массив вложений, мы можем вывести их на экран:
if (!empty($all_attachments)) {
foreach ($all_attachments as $post) {
setup_postdata($post);
echo '<div>';
the_title();
echo the_attachment_link($post->ID, false);
the_excerpt();
echo '</div>';
}
wp_reset_postdata(); // Сброс данных поста
}
Заключение
Используя приведенный выше подход, вы сможете извлечь изображения из всех дочерних страниц конкретной страницы, ограничить общее количество извлекаемых изображений и случайным образом их перемешать. Этот метод удобен и эффективен, позволяя сосредоточиться только на нужных материалах.
Не забывайте корректировать параметры запроса под ваши конкретные нужды, чтобы обеспечить оптимальную производительность и соответствие требованиям.