Pregunta

¿Es posible utilizar WP_Query para devolver una lista filtrada de elementos en función de los siguientes criterios establecidos? Me parece estar luchando ya que hay numerosas consultas en los campos personalizados.

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)

Cualquier ayuda es muy apreciada.

¿Fue útil?

Solución 3

La manera de evitarlo era construir una consulta personalizada. Más información sobre este se puede ver en el códice de Wordpress en http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query .

Mi código final parecía como sigue

<?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>

Otros consejos

¿Ha intentado algo como esto:

$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();

No sé todavía si se puede hacer la después ciudad y orderby título .

Si todos los resultados tienen la misma zona, ¿por qué quieres a la orden por la zona?

Por lo que yo sé, no se puede incluir dos meta_keys en una sola consulta. Por lo que usted tiene que escribir la consulta para devolver los resultados ordenados por título, guardarlos en una matriz, y luego recurrir la matriz en el orden en que es necesario el uso de PHP.

Licenciado bajo: CC-BY-SA con atribución
scroll top