WP_Query, пользовательский вид и пользовательский фильтр

Это - возможное использование WP_Query для возврата фильтрованного списка объектов на основе следующего набора критериев? Я, кажется, борюсь, поскольку существуют многочисленные запросы против пользовательских полей.

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)

Любая справка значительно ценится.

2
10.01.2011, 11:13
3 ответа

Путь вокруг этого состоял в том, чтобы создать пользовательский запрос. Больше информации об этом может быть просмотрено на кодексе Wordpress по http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query.

Мой заключительный код смотрел следующим образом

<?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>
1
19.02.2020, 22:26

Сделал Вы пробуете что-то вроде этого:

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

Я еще не знаю, можно ли сделать тогдашний orderby город и заголовок.

2
19.02.2020, 22:26
  • 1
    необходимо было бы сделать пользовательское соединение и пользовательский порядок при помощи фильтров posts_orderby и posts_join –  Manny Fleurmond 08.01.2011, 08:32

Если бы все результаты имеют ту же зону, почему Вы хотели бы заказать зоной?

Насколько я знаю, Вы не можете включать два meta_keys в единый запрос. Таким образом, необходимо будет записать запрос, чтобы возвратить результаты, заказанные заголовком, сохранить их в массиве и затем обратиться массив в порядок, Вам нужно использование PHP.

2
19.02.2020, 22:26
  • 1
    Это было ошибкой в псевдопримере кода Gabriel, я обновил пример. У Вас есть какие-либо примеры сортировки после того, как набор результатов был возвращен? –  WDuffy 10.01.2011, 11:13

Теги

Похожие вопросы