Я считаю, что это обеспечит вам нужно. Это класс с именем PostsOrderedByMetaQuery
, который расширяет WP_Query
и принимает новые аргументы 'orderby_meta_key'
и 'orderby_order'
:
class PostsOrderedByMetaQuery extends WP_Query {
var $posts_ordered_by_meta = true;
var $orderby_order = 'ASC';
var $orderby_meta_key;
function __construct($args=array()) {
add_filter('posts_join',array(&$this,'posts_join'),10,2);
add_filter('posts_orderby',array(&$this,'posts_orderby'),10,2);
$this->posts_ordered_by_meta = true;
$this->orderby_meta_key = $args['orderby_meta_key'];
unset($args['orderby_meta_key']);
if (!empty($args['orderby_order'])) {
$this->orderby_order = $args['orderby_order'];
unset($args['orderby_order']);
}
parent::query($args);
}
function posts_join($join,$query) {
if (isset($query->posts_ordered_by_meta)) {
global $wpdb;
$join .=<<<SQL
INNER JOIN {$wpdb->postmeta} postmeta_price ON postmeta_price.post_id={$wpdb->posts}.ID
AND postmeta_price.meta_key='{$this->orderby_meta_key}'
SQL;
}
return $join;
}
function posts_orderby($orderby,$query) {
if (isset($query->posts_ordered_by_meta)) {
global $wpdb;
$orderby = "postmeta_price.meta_value {$this->orderby_order}";
}
return $orderby;
}
}
Вы бы назвали это так:
$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = new PostsOrderedByMetaQuery(array(
'post_type' => array('post', 'real-estate'),
'meta_key' => 'Time Available',
'meta_compare' => '<=',
'meta_value' => $thirtydays,
'paged' => $paged,
'orderby_meta_key' => 'Price',
'orderby_order' => 'DESC',
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
Вы можете скопировать класс PostsOrderedByMetaQuery
в файл functions.php
вашей темы или использовать его в файле .php
подключаемого модуля, который вы пишете.
Если вы хотите быстро протестировать его, я опубликовал автономную версию кода. в Gist, который вы можете загрузить и скопировать в корень вашего веб-сервера как test.php
, изменить для вашего случая использования, а затем запросить из своего браузера, используя URL-адрес, например http://example.com/test.php
.
Надеюсь это поможет.
-Майк
P.S. Этот ответ очень похоже на ответ, который я только что дал на WordPress Answers, дочернем сайте StackOverflow, где многие энтузиасты WordPress, такие как я, ежедневно отвечают на вопросы. Вы можете увидеть, что тоже ответьте, потому что в нем есть немного больше объяснений, и потому что вы, возможно, захотите увидеть ответы WordPress. Надеюсь, в будущем вы рассмотрите возможность публикации своих вопросов по WordPress через здесь?
person
MikeSchinkel
schedule
06.11.2010