WP_Query, orden personalizado y filtro personalizado

2

¿Es posible usar WP_Query para devolver una lista filtrada de elementos según el siguiente conjunto de criterios? Parece que estoy luchando, ya que hay numerosas consultas en 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.

    
pregunta WDuffy 07.01.2011 - 18:11

3 respuestas

1

La forma de evitarlo fue crear una consulta personalizada. Se puede ver más información sobre esto en el códice de Wordpress en enlace .

Mi código final se ve 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>
    
respondido por el WDuffy 10.01.2011 - 11:59
2

¿Intentaste 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();

Todavía no sé si puede hacer el luego orderby town y title .

    
respondido por el kevin 07.01.2011 - 20:26
2

Si todos los resultados tienen la misma zona, ¿por qué querría ordenar por zona?

Por lo que sé, no puede incluir dos meta_keys en una sola consulta. Así que tendrá que escribir la consulta para devolver los resultados ordenados por título, guardarlos en una matriz y luego colocar la matriz en el orden que necesita usando PHP.

    
respondido por el Gabe 08.01.2011 - 06:00

Lea otras preguntas en las etiquetas