我相信这会提供你想要的。这是一个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,您可以将其下载并复制到您的 Web 服务器的根目录test.php
,根据您的用例进行修改,然后使用类似的 URL 从浏览器请求http://example.com/test.php
.
希望这可以帮助。
-麦克风
PS 这个答案与我刚刚在 WordPress Answers 给出的答案非常相似,这是 StackOverflow 的姊妹网站,每天都有很多像我这样的 WordPress 爱好者回答问题。您可能也希望看到该答案,因为它有更多解释,并且您可能希望看到WordPress Answers。希望您将来也会考虑在那里发布您的 WordPress 问题?