按星期几列出的帖子列表

时间:2016-01-11 作者:Rodrigo Borba

我有广播节目,它们和弱者日有关。

示例:

周一和周五有一个节目的迪斯科之夜

2-Pragram疯狂周末仅在周日比赛

3-etc

4-etc

Objective: 列出所有不重复的程序,这些程序基于当天和下一天关联到多天。

如果今天是星期六,必须列出星期六的节目,如星期天、星期一等,但不能只列出一次同一节目。(最近的一个)

如何做到这一点?

在后台,我有一个多选选项,允许用户根据插件框架选择多天。它将meta\\u值存储在序列化数组中,无法更改,因此我必须使用它。

a:3:{i:0;s:1:"3";i:1;s:1:"4";i:2;s:1:"6";}
每天对应一个值。

0-周日

1-周一

2-周二

3-周三

4-周四

5-周五

6-周六

现在最难的是把它列在前台。

$today = date(\'w\'); 
$args = array(
  \'post_type\' => \'programas\',
  \'meta_key\' => \'audio_date\',
  \'orderby\' => \'  ?? closest one ??\',

 $the_query = new WP_Query( $args );

);
记住meta key返回如下序列化数组

    a:3:{i:0;s:1:"3";i:1;s:1:"4";i:2;s:1:"6";} 
我不知道如何比较最接近那天的节目

while ( $the_query->have_posts() ) {
 $the_query->the_post();
 $items = get_post_meta( $post->ID, \'audio_date\', true );

the_title();

if ( is_array($items) ) {  
  foreach ( $items as $item) :
    echo $item;
  endforeach; 
 }
}
有什么想法吗????我还尝试使用post\\u类型的类别,每天创建一个类别,但它也不起作用。

2 个回复
最合适的回答,由SO网友:majick 整理而成

使用just怎么样get_posts (卸下order_by 参数),然后循环创建程序和程序数组,然后从中构建输出:

$posts = get_posts(array(\'post_type\'=>\'programas\',\'meta_key\'=>\'audio_date\'));

$programs = array();
foreach ($posts as $post) {
    $days = get_post_meta( $post->ID, \'audio_date\', true );
    // $time = get_post_meta( $post->ID, \'audio_time\', true);
    $found = false;
    foreach ($days as $day) {
         if (!$found) {$programs[$day][] = $post; $found = true;}
    }
    // foreach ($days as $day) {$programs[$day][$time] = $post;}
}

// start at today, loop for 7 days
$today = date(\'w\'); 
for ($i = $today; $i < ($today + 7); $i++) {
    // fix to the actual day if value is over 6
    if ($i > 6) {$day = $i - 7;} else {$day = $i;}

    // could do this bit programmatically too
    if ($day == 0) {$daytitle = "<b>Sunday</b><br>";}
    if ($day == 1) {$daytitle = "<b>Monday</b><br>";}
    if ($day == 2) {$daytitle = "<b>Tuesday</b><br>";}
    if ($day == 3) {$daytitle = "<b>Wednesday</b><br>";}
    if ($day == 4) {$daytitle = "<b>Thursday</b><br>";}
    if ($day == 5) {$daytitle = "<b>Friday</b><br>";}
    if ($day == 6) {$daytitle = "<b>Saturday</b><br>";}

    if (isset($programs[$day])) {
        $output .= $daytitle;
        foreach ($programs[$day] as $time => $post) {
            $output .= $post->post_title;
            // $output .= " (".$time.");
            $output .= "<br>";
        }
    }
}

echo $output;
当然,如果您还想显示程序时间,可能需要另一个级别的排序复杂性,现在我也添加了一些注释行。

SO网友:jgraup

QUERY ALL PROGRAMAS - 按未来天数排序

循环一周,直到将来,并存储这些值以减少以后的计算量。

$now = date(\'w\');
$today = intval($now);
$futures = array();
for($offset = 0; $offset < 7; $offset ++) {
    if(($next = $today + $offset) > 6) $next -= 7; // day offset
    $futures[] = $next;
}
执行查询并收集数据,这些数据将存储到多维数组中,以便稍后排序。

$programs = array();
$posts = get_posts(array(\'post_type\'=>\'programas\',\'meta_key\' => \'audio_date\'));

foreach($posts as $post) {

    // deserialize our data for date checks
    $dates = maybe_unserialize(get_post_meta($post->ID, \'audio_date\', true));

    // check for the next closest date
    foreach($futures as $offset => $next) {

        // we\'ve found the next closest date
        if(in_array($next, $dates)) {

            // gather data
            $info = array(
                \'post\'   => $post,
                \'ID\'     => $post->ID,
                \'next\'   => $next,
                \'offset\' => $offset,
                \'dates\'  => $dates,
            );

            // store for later
            if( ! isset($programs[ $offset ])) $programs[ $offset ] = array();
            $programs[ $offset ][] = $info;

            // next date found -- onto the next program
            break; 
        }
    }

    // (optional) set tags based on dates for future queries
    //
    // foreach($dates as $day) wp_set_post_tags($post->ID, "day_$day", true);  
}
根据节目的日偏移量对节目进行排序

ksort($programs);
现在循环浏览已排序的数据并显示每天

foreach($programs as $offset => $line_up) {

    // Name of the day
    $day = date(\'l\', strtotime("+{$offset} days"));
    echo "<div>$day</div></ul>";

    foreach($line_up as $program) {

        // prep vars
        $title = $program[ \'post\' ]->post_title;

        // output visuals
        echo "<li>$title</li>";
    }

    echo "</ul>";
}
<小时>

QUERY DATES BY TAG

如果您在上面的循环或其他地方设置了标记,那么您可以选择基于天进行查询。

// get today and tomorrow

$now = date(\'w\');
$today = intval($now);
$today_tag = "day_$today";
$tomorrow = $today === 6 ? 0 : $today + 1;
$tomorrow_tag = "day_$today";

// do a query for those two days

$posts = get_posts(array(\'post_type\'=>\'programas\',\'meta_key\' => \'audio_date\',\'tag\'=>"$today_tag,$tomorrow_tag"));

相关推荐

显示作者姓名PHP(自制插件)

我有一个需要帮助的问题,因为我自己找不到解决办法。我接管了一个网站,之前有人在那里创建了一个自制插件。。使用默认插件“Contact Form 7”,用户可以在页面上创建帖子。()https://gyazo.com/c8b20adecacd90fb9bfe72ad2138a980 )关于自行创建的插件“Contact Form 7 extender”,帖子是通过PHP代码在后台生成的(https://gyazo.com/115a6c7c9afafd2970b66fd421ca76a3)其工作原理如下:如果