Voici mon problème:
Pour mes articles, j'utilise un type de message personnalisé "expositions" et des messages pour toutes les autres nouvelles. Je les affiche dans une requête ['post_type' = tableau ('expositions', 'posts')].
Le paramètre orderby des articles doit être leur date de publication , pour les expositions, il doit s'agir de méta valeur personnalisée (date de fin du projet). Ainsi, les messages seraient affichés dans l'ordre suivant:
J'ai eu l'idée de définir la variable PHP (méta-valeur de fin pour les expositions, la date de publication pour les articles) et de trier le wp_query en conséquence.
Est-ce que je vais dans la bonne direction ou pas? Si oui, comment incorporer la variable à wp_query? J'ai trouvé des articles/questions connexes, mais aucun ne m'a aidé jusqu'à présent.
Le filtre Orderby sonne également comme le chemin à parcourir: Orderby filter @ forums Wordpress.org
Merci!
///
Les solutions de Johaness sont à peu près ce que je cherchais. Voici ma fonction légèrement modifiée:
function save_sort_meta( $post_id ) {
$prev_val = get_post_meta( $post_id, 'sort_date', true );
/* set value only if not set yet (i.e. if this is a new post and not an update ) */
if ( 'exhibitions' === $_POST['post_type'] ) {
$my_meta = get_post_meta( $post_id, '_my_meta', true );
$datum_end_hidden = $my_meta['datum-end-hidden'];
update_post_meta( $post_id, 'sort_date', $datum_end_hidden);
} else {
/* using time() assuming "end_date" is a unix timestamp, adjust if not */
update_post_meta( $post_id, 'sort_date', time());
}
}
add_action( 'save_post', 'save_sort_meta' );
Et voici ma requête:
$args = array(
'showposts' => '22',
'post_type' => array('post','exhibitions'),
'post_status' => 'publish',
'meta_key' => 'sort_date',
'order' => 'DESC',
'orderby' => 'meta_value_num'
);
Pour une raison quelconque, les messages "post" restent à la fin de wp_query (bien que, lorsque j'appelle la valeur personnalisée "sort_date", elle s'affiche correctement et est plus grande que les expositions, elle devrait rester "en dessous").
At-il un lien avec ma suppression de la vérification de la mise à jour de la publication? Je l'ai fait, parce que je veux aussi changer les valeurs sur update.
D'accord, j'ai découvert où était le problème - c'est assez gênant. :) La méta valeur "end date" des types de post "exposition" a été fournie par jQuery UI Datepicker - qui enregistre la date en millisecondes.
Tout ce que j'avais à faire était de diviser $ datum_end_hidden par 1000. :)
Merci beaucoup!
À ma connaissance, vous ne pouvez pas trier une requête en fonction de deux paramètres différents sans une itération supplémentaire sur les publications récupérées.
Puisque cela devrait idéalement être évité, permettez-moi de suggérer une approche différente:
Pourquoi ne pas incorporer une méta valeur supplémentaire "sort_date", ou similaire? Ensuite, dans votre routine de sauvegarde, enregistrez la date de fin de l'exposition ou la date de publication sous "sort_date".
Économie:
function save_sort_meta( $post_id ) {
$prev_val = get_post_meta( $post_id, 'sort_date', true );
/* set value only if not set yet (i.e. if this is a new post and not an update ) */
if ( empty($prev_val) ) {
if ( 'exhibitions' === $_POST['post_type'] ) {
update_post_meta( $post_id, 'sort_date', $_POST['end_date'] );
} else {
/* using time() assuming "end_date" is a unix timestamp, adjust if not */
update_post_meta( $post_id, 'sort_date', time() );
}
}
}
add_action( 'save_post', 'save_sort_meta' );
La requête:
$args = array(
'post_status' => 'publish',
'post_type' = array( 'exhibitions', 'posts' ),
'meta_key' => 'sort_date',
'order' => 'DESC',
'orderby' => 'meta_value_num'
);
$exhibitions_and_posts = new WP_Query( $args );
En passant, je vous conseillerais de donner à la poste un nom singulier.
Je ne sais pas si vous voulez dire que vous souhaitez afficher 2 types de publication sur la même page, les deux en utilisant un ordre de tri différent.
Si vous affichez des expositions sur leurs propres archives, telles que archive-exhibitions.php, vous pouvez définir la requête de cette page afin qu'elle soit triée en fonction de la méta-valeur que vous définissez.
$args = array(
'post_status' => 'publish',
'post_type' => 'exhibition',
'meta_key' => 'project_end_date',
'orderby' => 'meta_value',
'order' => 'DESC'
);
$my_own_query = new WP_Query($args);
Naturellement, changez project_end_date
pour refléter le nom de clé de la méta-valeur de la date de fin de votre projet. Changez orderby
en meta_value_num
en fonction de la façon dont vous enregistrez la variable. meta_value
est probablement bon.
Pour la boucle, vous devrez utiliser:
<?php if ($my_own_query->have_posts()) : while ($my_own_query->have_posts()) : $my_own_query->the_post(); ?>
Maintenant, charger cette archive ( http://example.com/exhibitions/ ) ignorera le WP_Query normal et utilisera votre my_own_query
pour la boucle.