WP_Query, benutzerdefinierte Sortier- und benutzerdefinierte Filter
Frage
Ist es mit WP_Query möglich, eine gefilterte Liste der Elemente zurückzugeben, die auf den folgenden Kriterien gesetzt sind? Ich scheine zu kämpfen zu haben, da es zahlreiche Fragen gegen benutzerdefinierte Felder gibt.
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)
Jede Hilfe wird sehr geschätzt.
Lösung 3
Der Weg um ihn herum war es, eine individuelle Abfrage zu erstellen. Weitere Informationen dazu können im WordPress -Codex unter angezeigt werden http://codex.wordpress.org/displaying_posts_using_a_custom_select_query.
Mein endgültiger Code sah wie folgt aus
<?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>
Andere Tipps
Hast du so etwas versucht:
$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();
Ich weiß noch nicht, ob Sie das tun können Dann bestellen Sie Stadt, Dorf und Titel.
Wenn alle Ergebnisse dieselbe Zone haben, warum möchten Sie dann nach Zone bestellen?
Soweit ich weiß, können Sie nicht zwei Meta_Keys in eine einzelne Abfrage einbeziehen. Sie müssen also die Abfrage schreiben, um die nach dem Titel bestellten Ergebnisse zurückzugeben, sie in einem Array zu speichern und dann das Array in die Reihenfolge zurückzugreifen, die Sie mit PHP benötigen.