web-dev-qa-db-fra.com

Liste des messages par jour de la semaine

J'ai la radio avec des programmes et ils sont associés au jour du faible.

Exemple:

Soirées Disco 1 programme au programme les lundi et vendredi

Les weekends fous à 2 pragrams ne jouent que le dimanche

3-etc

4-etc

Objectif: Lister tous les programmes sans répéter ceux qui sont associés à plusieurs jours en fonction du jour actuel et des jours suivants.

Si aujourd'hui est samedi, vous devez lister les programmes du samedi, dimanche, lundi, etc., mais ne pouvez pas lister une seule fois le même programme. (LE PLUS PROCHE)

Comment y parvenir?

Sur le back-office, j'ai une option de sélection multiple qui permet à l'utilisateur de sélectionner plusieurs jours en fonction du framework de plug-in. Il stocke la méta_valeur dans un tableau sérialisé. Elle ne peut pas être modifiée et doit donc être utilisée.

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

Chaque jour correspond à une valeur.

0 - dimanche

1 - lundi

2 - mardi

3 - mercredi

4 - jeudi

5 - vendredi

6 - samedi

Maintenant, la partie la plus difficile à énumérer sur le front-office.

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

 $the_query = new WP_Query( $args );

);

Rappelez-vous que la méta-clé retourne un tableau sérialisé comme ceci

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

Je ne sais pas comment comparer les programmes les plus proches à ce jour

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

Des idées???? J'ai aussi essayé d'utiliser les catégories post_type et de créer une catégorie pour chaque jour, mais cela ne fonctionne pas aussi.

2
Rodrigo Borba

Qu'en est-il de simplement utiliser get_posts (en supprimant l'argument order_by), puis d'effectuer une boucle pour créer un tableau de programmes, puis de générer le résultat à partir de cela:

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

Bien sûr, un autre niveau de complexité de tri est nécessaire si vous souhaitez également afficher les horaires du programme. Pour le moment, j'ai ajouté quelques lignes commentées à cet effet également.

0
majick

QUERY ALL PROGRAMAS -TRIÉS PAR JOURS DANS L'AVENIR

Boucle pendant une semaine dans le futur et stocke les valeurs pour réduire les calculs plus tard.

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

Effectuez la requête et collectez les données qui seront stockées dans un tableau multidimensionnel pour un tri ultérieur.

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

Triez les programmes en fonction de leur décalage journalier

ksort($programs);

Parcourez maintenant nos données triées et affichez chaque jour

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

DATES DE RECHERCHE PAR ÉTIQUETTE

Si vous définissez des balises, dans la boucle ci-dessus ou ailleurs, vous avez la possibilité d'interroger en fonction du nombre de jours.

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