Est-il possible d’utiliser WP_Query pour renvoyer une liste filtrée d’éléments en fonction des critères suivants? Je semble avoir du mal car il y a 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.
La solution consistait à créer une requête personnalisée. Pour plus d’informations à ce sujet, consultez le codex Wordpress à l’adresse http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query .
Mon code final ressemblait à ceci
<?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>
Avez-vous essayé quelque chose comme ça:
$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 lepuis orderby ville et titre .
Si tous les résultats ont la même zone, pourquoi voudriez-vous commander par zone?
Autant que je sache, vous ne pouvez pas inclure deux méta_keys dans une même requête. Vous devrez donc écrire la requête pour renvoyer les résultats classés par titre, les enregistrer dans un tableau, puis classer le tableau dans l'ordre de votre choix à l'aide de PHP.