Поддержка Проблемы и решения Специифичный вывод записей.

  • Решено glorf

    (@glorf)


    Доброго времени суток.
    Может кто поможет, подскажет в какую сторону копать.
    Суть задачи.
    Есть много записей за прошлые годы. Мне нужно как то вывести от текущей даты анонс 2х «будущих событий» игнорируя год записи. Т.е. Сегодня, например 11 сентября 2019., у меня есть запись за 15 сентября 2016 и 13 сентября 2018. Как итог мне надо вывести ссылку на запись 13 сентября и 15 сентября.

    Как я понимаю, моя проблема уходит куда то в район WP_Date_Query, но с чего хотя бы начать понять не могу.

    Заранее спасибо если кто то откликнется и подскажет.

    • Тема изменена 5 дн., 19 час. назад пользователем  glorf.
Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Делал как-то для вывода праздников на сегодня и ближайшие праздники.

    Скрипт сначала выбирает вообще все праздники из БД и потом уже на уровне php выбирает будущие праздники от сегодняшней даты вместе с сегодняшней.

    <?php
    $args  = array(
        'numberposts' => -1,
        'post_type' => 'post'
    );
    $posts = get_posts($args);
    
    //список записей без года
    foreach ($posts as $post) {
        $md[$post->ID]['date']       = date("m-d", strtotime($post->post_date));
        $md[$post->ID]['id']         = $post->ID;
        $md[$post->ID]['post_title'] = $post->post_title;
    }
    
    //группировка по дате
    $resultArray = array();
    array_walk($md, function($item, $key) use (&$resultArray)
    {
        $resultArray[$item['date']][] = $item;
    });
    
    //сортировка в порядке возрастания записей от текущей даты(на ближайшие 20 дней)
    $new_posts = array();
    for ($i = 0; $i < 20; $i++) {
        $nd = date('m-d', strtotime(date('Y-m-d') . '+' . $i . 'day'));
        if (!empty($resultArray[$nd])) {
            $new_posts[$nd] = $resultArray[$nd];
        }
    }

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

    Array
    (
        [09-21] => Array
            (
                [0] => Array
                    (
                        [date] => 09-21
                        [id] => 83
                        [post_title] => праздник 1
                    )
    
                [1] => Array
                    (
                        [date] => 09-21
                        [id] => 122
                        [post_title] => праздник 2
                    )
    
                [2] => Array
                    (
                        [date] => 09-21
                        [id] => 167
                        [post_title] => праздник 3
                    )
    
            )
    
        [09-29] => Array
            (
                [0] => Array
                    (
                        [date] => 09-29
                        [id] => 357448
                        [post_title] => праздник 1
                    )
    
                [1] => Array
                    (
                        [date] => 09-29
                        [id] => 357445
                        [post_title] => праздник 2
                    )
    
               
    
            )
    
    )

    если записей много, то результат можно на время кэшировать

    • Ответ изменён 5 дн., 18 час. назад пользователем  qwert555.
    • Ответ изменён 5 дн., 18 час. назад пользователем  qwert555.

    Спасибо большое.
    Теперь остается понять как из массива вывести post_title. Пробовал через foreach, но как то грустно получилось.

    Хотя через print_r видно, что массив тот что нужен.

    Для вывода получилась такая конструкция
    foreach ($new_posts as $value_key => $value) {
    foreach ($value as $value_key1 => $value1) {
    foreach ($value1 as $value_key2 => $value2) {
    echo $value2; //выводит все переменные
    echo $value2[‘post_title’]; //а вот одну по ключу выводить никак не желает
    echo ‘<br />’;
    }
    }
    }

    Понятно, что где то ошибся. А вот где понять не могу. Был бы очень благодарен за помошь.

    Все записи выводятся сгруппированные по дате.

       foreach($new_posts as $key=>$val) {
         
            echo '<b>'.$key.'</b><br>';	
        
     
            foreach($val as $nm) {
          	 echo '<a href="'.get_the_permalink($nm['id']).'">'.$nm['post_title'].'</a><br>'; 
            }
          } 

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

    • Ответ изменён 5 дн. назад пользователем  qwert555.

    qwert555, Огромное Вам спасибо за помощь. Остальное, вроде бы все понятно. Большое, человеческое СПАСИБО, очень выручили 🙂

Просмотр 5 ответов — с 1 по 5 (всего 5)