Как вывести заголовок и ссылку рандомной страницы wp опубликованную за сегодня?

Ссылка скопирована
1 ответ

Ребята подскажите пожалуйста, как вывести заголовок и ссылку на рандомную страницу:
1. У которой родительская страница с ID 22
2. Страница которая была опубликована за сегодня

Дополнительно:

Как вывести заголовок и ссылку рандомной страницы wp опубликованную за сегодня?

Изучить документацию и написать код. Покажите, что Вы уже сделали?

  • Михаил Р., написал сюда
  • Ответы:

    get_posts с требуемыми критериями

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Кирилл JS Ответ

    Чтобы вывести случайную опубликованную сегодня страницу с родителем ID 22, используйте WP_Query с post_type => page, post_parent, date_query и orderby => rand.

    Пример:

    $today_page = new WP_Query([
        'post_type' => 'page',
        'post_status' => 'publish',
        'post_parent' => 22,
        'posts_per_page' => 1,
        'orderby' => 'rand',
        'date_query' => [
            [
                'year' => (int) current_time('Y'),
                'month' => (int) current_time('m'),
                'day' => (int) current_time('d'),
                'inclusive' => true,
            ],
        ],
    ]);
     
    if ($today_page->have_posts()) {
        while ($today_page->have_posts()) {
            $today_page->the_post();
            echo '<a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a>';
        }
        wp_reset_postdata();
    }

    $today_page = new WP_Query([ 'post_type' => 'page', 'post_status' => 'publish', 'post_parent' => 22, 'posts_per_page' => 1, 'orderby' => 'rand', 'date_query' => [ [ 'year' => (int) current_time('Y'), 'month' => (int) current_time('m'), 'day' => (int) current_time('d'), 'inclusive' => true, ], ], ]); if ($today_page->have_posts()) { while ($today_page->have_posts()) { $today_page->the_post(); echo '<a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a>'; } wp_reset_postdata(); }

    Если нужны не только прямые дочерние страницы, а все вложенные потомки родителя 22, post_parent не хватит. Тогда сначала получите ID всех дочерних страниц:

    $children = get_pages([
        'child_of' => 22,
        'fields' => 'ids',
    ]);

    $children = get_pages([ 'child_of' => 22, 'fields' => 'ids', ]);

    И передайте их в post__in:

    'post__in' => $children,

    'post__in' => $children,

    Учитывайте, что orderby => rand на больших объёмах может быть тяжёлым. Если страниц мало — нормально. Если тысячами, лучше кэшировать результат на день через transient.

    Пример кэша:

    $cache_key = 'random_today_page_' . current_time('Ymd');
    $html = get_transient($cache_key);
     
    if ($html === false) {
        // выполнить WP_Query и собрать HTML
        set_transient($cache_key, $html, HOUR_IN_SECONDS);
    }
     
    echo $html;

    $cache_key = 'random_today_page_' . current_time('Ymd'); $html = get_transient($cache_key); if ($html === false) { // выполнить WP_Query и собрать HTML set_transient($cache_key, $html, HOUR_IN_SECONDS); } echo $html;

    Если вывод вставляется в шаблон, shortcode или виджет, обязательно экранируйте ссылку и заголовок, как в примере выше. Не выводите post_title напрямую без esc_html(), особенно если материал могут редактировать разные пользователи.

    Также проверьте часовой пояс сайта. current_time() берёт настройки WordPress, а не системное UTC-время сервера. Это важно, если “сегодня” должно считаться по локальному времени сайта.

    Если сегодня подходящих страниц нет, лучше вывести запасной текст или ничего не выводить, чтобы не получить пустой блок:

    if (!$today_page->have_posts()) {
        echo '<p>Сегодня новых страниц нет.</p>';
    }

    if (!$today_page->have_posts()) { echo '<p>Сегодня новых страниц нет.</p>'; }

    Итог: для прямых дочерних страниц используйте post_parent, для всех уровней вложенности — get_pages(['child_of' => 22]) + post__in. Не забудьте wp_reset_postdata(), иначе следующий цикл на странице может начать выводить не те данные.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно