Question

Est-il possible à l'aide WP_Query pour retourner une liste filtrée des éléments en fonction des critères suivants fixés? Il me semble avoir du mal car il existe de nombreuses requêtes sur les champs personnalisés.

Select all posts that are of type business_club (post_type)
Where the post has a zone of 'Asia' (meta_value)
Order by country ASC (meta_value)
then by town ASC (meta_value)
then by title (wp value)

Toute aide est grandement appréciée.

Était-ce utile?

La solution 3

Le chemin autour était de construire une requête personnalisée. Plus d'informations sur ce qui peut être consulté sur le codex Wordpress http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query .

Mon code final se présente comme suit

<?php               
$row = 0;
$zone = $_GET['zone'];
if (!$zone) $zone = "United Kingdom";
?>

<table class="formattedTable" cellspacing="1" cellpadding="0">
<tr>
    <th width="140">Country</th>
    <th width="140">Town</th>
    <th>Club</th>
</tr>
<?php

$query = "
SELECT
  posts.*
FROM
  $wpdb->posts posts
INNER JOIN
  $wpdb->postmeta meta1 ON posts.ID = meta1.post_ID
INNER JOIN
  $wpdb->postmeta meta2 ON posts.ID = meta2.post_ID
INNER JOIN
  $wpdb->postmeta meta3 ON posts.ID = meta3.post_ID
WHERE
  posts.post_type = 'club' AND
  posts.post_status = 'publish' AND
  meta1.meta_key = '_club-zone' AND
  meta1.meta_value = '$zone' AND
  meta2.meta_key = '_club-country' AND
  meta3.meta_key = '_club-town'
ORDER BY
  meta2.meta_value,
  meta3.meta_value,
  posts.post_title";

$posts = $wpdb->get_results($query, object);        
if ($posts)
    foreach($posts as $post)
    {
        global $post;
        setup_postdata($post);

        echo '<tr class="' . ($row % 2 == 0 ? 'odd' : 'even') . '">';
        echo '<td>' . get_post_meta(get_the_ID(), '_club-country', true) . '</td>';
        echo '<td>' . get_post_meta(get_the_ID(), '_club-town', true) . '</td>';
        echo '<td><a href="' . get_permalink(get_the_ID()) . '">' . get_the_title() . '</a></td>';
        echo '</tr>';
        $row++;
    }

?>
</table>

Autres conseils

Avez-vous essayé quelque chose comme ceci:

$loop = new WP_Query( array( 
    'post_type' => 'business_club',
    'meta_value' => 'United Kingdom',
    'order' => 'ASC',
    'orderby' => 'meta_value',
    'meta_key' => 'zone'
 ) ); 
while ( $loop->have_posts() ) : $loop->the_post();

Je ne sais pas encore si vous pouvez faire la puis orderby ville et Titre .

Si tous les résultats ont la même zone, pourquoi voudriez-vous à l'ordre par zone?

Pour autant que je sache, vous ne pouvez pas inclure deux meta_keys dans une seule requête. Donc, vous devez écrire la requête pour renvoyer les résultats ordonnés par titre, sauvegarder sur un tableau, puis recourir le tableau dans l'ordre que vous avez besoin en utilisant PHP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top