Как получить вложения с дочерних страниц конкретной страницы?

Вопрос или проблема

Как мне получить вложения со всех подстраниц конкретного 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();
        }
    }
}

Однако существуют две оставшиеся проблемы:

  1. Ограничение общего количества фотографий. Использование 'numberposts' ограничивает только количество изображений, получаемых из каждого поста.
  2. Случайный порядок. Orderby => rand только случайным образом перемешивает изображения внутри каждого поста. Я хотел бы случайным образом перемешать порядок для всего.

Вы движетесь в правильном направлении …

  1. Ваш запрос работает как цикл … поэтому, чтобы ограничить общее количество изображений, вам нужно сначала добавить их все в массив, а затем как бы вы определили, как ограничить общее количество,
    например, что если на одной странице будет 50 изображений, а на следующей странице всего 1

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

Предложение – попробуйте использовать 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(); // Сброс данных поста
}

Заключение

Используя приведенный выше подход, вы сможете извлечь изображения из всех дочерних страниц конкретной страницы, ограничить общее количество извлекаемых изображений и случайным образом их перемешать. Этот метод удобен и эффективен, позволяя сосредоточиться только на нужных материалах.

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

Оцените материал
Добавить комментарий

Капча загружается...