web-dev-qa-db-ja.com

曜日別の投稿一覧

私はラジオ付きの番組を持っていますが、それらは弱者の日に関連しています。

例:

月曜と金曜に1番組のディスコナイトが開催されます

2-Pragram Crazyの週末は日曜日のみにプレーされます

3等

4等

目的:リストすべてのプログラムを繰り返さずに、当日と次の日に基づいて複数の日に関連付けます。

今日が土曜日の場合、日曜日、月曜日などの土曜日のプログラムをリストする必要がありますが、同じプログラムを1回だけリストすることはできません。 (一番近い)

これを達成する方法?

バックオフィスには、プラグインフレームワークに基づいて複数日を選択できるマルチセレクトオプションがあります。これは、直列化された配列にmeta_valueを格納し、変更することはできません。

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 );

);

メタキーが次のような直列化された配列を返すことを忘れないでください

    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_typeカテゴリも使用して、毎日1つのカテゴリを作成しようとしましたが、それもうまくいきませんでした。

2
Rodrigo Borba

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;

もちろん、番組の時間も表示したい場合は、別のレベルのソートの複雑さが必要になるかもしれません。そのために、ここでもコメント付きの行を追加しました。

0
majick

QUERY ALL PROGRAMAS - 将来の日数ごとに保存

未来への1週間ループし、後で計算を減らすために値を保存します。

$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>";
}

タグによる問い合わせ日

上記のループまたは他の場所でタグを設定した場合は、日数に基づいてクエリするオプションがあります。

// 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"));
0
jgraup