web-dev-qa-db-fra.com

Wp_query: trier par PHP variable

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:

  1. Exposition 1 (date de publication: 2.1. 2013, fin: 4.4. 2013)
  2. Poste 1 (date de publication: 13 mars 2013)
  3. Exposition 2 (date de publication: 1.4. 2012, date de fin: 1.3. 2013)
  4. Poste 2 (date de publication: 28 février 2013)

Définissez PHP variable à partir de la date (messages) et de la méta valeur de la date de fin (expositions), puis triez-la?

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.

Orderby filter?

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.

Edit: Le code ci-dessus fonctionne!

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!

1
Petr Cibulka

À 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.

1
Johannes Pille

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.

0
Marc Dingena