web-dev-qa-db-ger.com

Liste der Beiträge nach Wochentag

Ich habe Radio mit Programmen und sie sind mit dem Tag der Schwachen verbunden.

Beispiel:

1-Programm Disco Nights spielt am Montag und Freitag

2-Pragram Verrückte Wochenenden spielen nur am Sonntag

3-etc

4-etc

Ziel: Liste Alle Programme ohne Wiederholung der einen sind auf der Grundlage des aktuellen Tages und der nächsten mehreren Tagen zugeordnet.

Wenn heute Samstag ist, müssen Samstags-Programme sie Sonntag, Montag usw. usw. auflisten, können aber nicht nur einmal dasselbe Programm aufgeführt werden. (DIE NÄCHSTE)

Wie kann man das erreichen?

Im Backoffice gibt es eine Mehrfachauswahloption, mit der der Benutzer mehrere Tage basierend auf dem Plugin-Framework auswählen kann. Sie speichert den meta_value in einem serialisierten Array und kann nicht geändert werden, sodass ich damit arbeiten muss.

a:3:{i:0;s:1:"3";i:1;s:1:"4";i:2;s:1:"6";}

Jeder Tag entspricht einem Wert.

0 - Sonntag

1 - Montag

2 - Dienstag

3 - Mittwoch

4 - Donnerstag

5 - Freitag

6 - Samstag

Jetzt ist es am schwierigsten, es an der Rezeption aufzulisten.

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

 $the_query = new WP_Query( $args );

);

Denken Sie daran, dass der Metaschlüssel ein solches serialisiertes Array zurückgibt

    a:3:{i:0;s:1:"3";i:1;s:1:"4";i:2;s:1:"6";} 

Ich weiß nicht, wie ich die aktuellsten Programme vergleichen soll

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

Irgendwelche Ideen???? Ich habe versucht, auch post_type Kategorien zu verwenden und eine Kategorie für jeden Tag zu erstellen, aber es funktioniert auch nicht.

2
Rodrigo Borba

Wie wäre es, wenn Sie nur get_posts verwenden (Entfernen des order_by-Arguments), dann eine Schleife durchlaufen, um ein Array von Programmen zu erstellen und dann die Ausgabe daraus zu erstellen:

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

Natürlich kann es sein, dass ein anderes Maß an Sortierkomplexität erforderlich ist, wenn Sie auch die Programmzeiten anzeigen möchten. Im Moment habe ich auch dazu einige kommentierte Zeilen hinzugefügt.

0
majick

ALLE PROGRAMME ABFRAGEN -NACH ZUKÜNFTIGEN TAGEN SORTIERT

Machen Sie eine Schleife für eine Woche in die Zukunft und speichern Sie die Werte, um Berechnungen später zu reduzieren.

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

Führen Sie die Abfrage durch und sammeln Sie Daten, die zur späteren Sortierung in einem mehrdimensionalen Array gespeichert werden.

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

Sortieren Sie die Programme nach dem Tagesoffset

ksort($programs);

Blättern Sie jetzt durch unsere sortierten Daten und zeigen Sie jeden Tag

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

Abfragetermine nach Tag

Wenn Sie Tags in der obigen oder einer anderen Schleife festlegen, haben Sie die Möglichkeit, basierend auf Tagen abzufragen.

// 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