Ordinare per data usando un campo personalizzato in ordine crescente (ASC)
Ho trovato diverse domande simili ma nessuna di queste spiega perché il codice seguente non funziona con l'ordinamento ASC. Funziona solo con DESC.
In pratica, è una query che dovrebbe elencare i post dove i valori dei campi personalizzati sono uguali o maggiori della data corrente, quindi organizzarli in ordine inverso, così che il primo post dovrebbe essere quello con il campo personalizzato più vicino alla data corrente.
<?php query_posts($query_string . '&showposts=4&order=ASC&post_type=custompost&meta_key=mydate&orderby=meta_value'); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<?php $todays_date = date("Y/m/j"); // Ottiene la data odierna ?>
<?php $today = strtotime($todays_date); // Converte la data in timestamp ?>
<?php $exp_date = get_post_meta('mydate'); // Ottiene la data dal campo personalizzato ?>
<?php $expiration_date = strtotime($exp_date); // Converte la data del campo personalizzato in timestamp ?>
<?php if ($expiration_date >= $today) { // Controlla se la data è maggiore o uguale a oggi ?>
<a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a>
<?php } else { ?>
<?php };?>
<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>
Inoltre, ho provato molte query diverse ma nessuna di queste ha funzionato, lo script sopra è l'ultimo che ho testato.

Con qualche ricerca in più su Google:
<?php
$today = date("Y/m/j");
query_posts(array(
'post_type' => 'custompost',
'posts_per_page' => 4,
'meta_key' => 'mydate',
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'mydate',
'meta-value' => $value,
'value' => $today,
'compare' => '>=',
'type' => 'CHAR'
)
)
));
if (have_posts()) :
while (have_posts()) : the_post();
?>
<a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a>
<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>
Spero che possa essere utile ad altri!

Dopo aver cercato tra diversi post simili, ho assemblato una soluzione prendendo parti da vari altri post su Stack Overflow, spero possa essere d'aiuto a qualcun altro.
Avevo un campo meta personalizzato chiamato "date" (convenzione di denominazione poco appropriata, lo so), e questa query mostra tutti i post con un campo meta "date" personalizzato nel futuro, ordinandoli dal più vicino a oggi.
$args = array(
'post_type' => 'training-course', // Tipo di post: corso di formazione
'posts_per_page' => '-1', // Mostra tutti i post
'meta_key' => 'date', // Chiave meta: data
'orderby' => 'meta_value', // Ordina per valore meta
'order' => 'ASC', // Ordine crescente
'meta_query' => array(
array(
'key' => 'date', // Chiave meta: data
'value' => date("YYmmdd"), // Valore: data odierna nel formato AAmmgg
'compare' => '<=' // Confronto: minore o uguale
)
)
);

Per altri che fanno riferimento a questa domanda, esiste anche un modo integrato per fare questo che è più semplice, puoi usare eventDisplay
nella tua query con i valori upcoming
, past
, o custom
. La documentazione di Tribe Events è un po' carente quindi chissà cosa fa "custom". Se usi tribe_get_events()
, assume "upcoming" di default, e credo che certe query vengano automaticamente modificate per mostrare gli eventi futuri.
Ecco un esempio che mostra 4 eventi futuri, ordinati per data di inizio, dal più vicino al futuro.
array(
'showposts' => 4,
'post_type' => 'tribe_events',
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_key' => '_EventStartDate',
'eventDisplay' => 'upcoming'
));
