Dans mon blog WordPress, j'ai des événements que je veux commander et filtrer par champs personnalisés. La commande doit être effectuée par le champ personnalisé "event_date_end", ce qui signifie que chaque événement en cours d'exécution doit être affiché.
Pour commander les événements, j'utilise un deuxième champ personnalisé "event_date_start". Ainsi, un événement qui commence le 10 et se termine le 20 devrait être affiché jusqu'au 20 mais devrait être en ordre à côté de tous les autres événements commençant le 10.
J'utilise Thematic en tant que thème parent et j'utilise donc la fonction query_posts () en ajoutant les deux règles en tant que paramètres. Voici comment je l'utilise dans la boucle d'index:
function my_index_loop($content) {
global $query_string;
query_posts($query_string
// filter by event_date_end
."&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')
// order by event_date_start
."&meta_key=event_date_start&orderby=meta_value&order=ASC");
}
add_filter('thematic_indexloop', 'my_index_loop');
Maintenant, les articles sont correctement classés, mais le filtre sera également défini sur la valeur "event_date_start". Ainsi, un événement commencé hier et toujours en cours ne sera pas affiché.
Si je change l'ordre des parties "filter" et "order", je verrai tous les événements, mais un événement commençant le 10 et se terminant le 20 sera placé à tous les événements le 20.
Je sais que je peux créer des requêtes en SQL moi-même, mais fonctionneront-elles avec Thematic? Et comment dois-je écrire des instructions pour archive, catégorie, liste de balises?
La solution :
Après avoir lu les pages mentionnées, j'ai trouvé la solution suivante. J'ai dû utiliser du SQL brut et les ajouter à travers des filtres dans le filtre de boucle spécifique. Ce sont les fonctions que j'ai ajoutées:
function my_loop_where($where){
global $wpdb;
$where .= " AND pm_where.meta_value >= '".date('Y-m-d')."'";
return $where;
}
function my_loop_join($join){
global $wpdb;
$join .= " LEFT JOIN " . $wpdb->postmeta . " AS pm_order ON (" . $wpdb->posts . ".ID = pm_order.post_id AND pm_order.meta_key = 'event_date_start')";
$join .= " LEFT JOIN " . $wpdb->postmeta . " AS pm_where ON (" . $wpdb->posts . ".ID = pm_where.post_id AND pm_where.meta_key = 'event_date_end')";
return $join;
}
function my_loop_order(){
return 'pm_order.meta_value ASC';
}
Et que j’ai simplement ajouté un filtre à ces fonctions dans la boucle d'index:
function my_index_loop($content) {
global $query_string;
add_filter('posts_where', 'my_loop_where' );
add_filter('posts_join', 'my_loop_join' );
add_filter('posts_orderby', 'my_loop_order' );
query_posts($query_string . "&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')/*."&meta_key=event_date_start&orderby=meta_value&order=ASC"*/);
}
add_filter('thematic_indexloop', 'my_index_loop');
Maintenant, je peux facilement utiliser ce filtre et cet ordre sur les boucles d'index et de catégorie, mais je conserve le filtre et les ordres de "style de journal" par défaut sur les pages d'archive.
Cela ne fonctionnera pas, car vous définissez deux fois le même paramètre meta_key
avec des valeurs différentes et un seul sera effectif.
Plutôt que de créer des requêtes brutes, il est préférable d’utiliser des filtres pour modifier la requête WP. Présentation de la requête La documentation contient une liste de points d'ancrage où vous pouvez insérer vos mods (à la fin sous Ce que les plugins peuvent modifier ).