我之前在这里发了帖子:How do I sort by a custom field without manually creating a new page?
但是,我相信我问了一个错误的问题(我可能仍然会问错误的问题)。实际上我认为我可能需要一个复杂的查询来显示按元值排序的帖子。该网站使用的是名为“AgentPress”的主题。我相信通过URL栏传递params对于我需要的东西来说可能过于简单了。
老实说,我喜欢当前类别页面显示的方式(格式化等),我只需要“短路”该过程,以便任何类别/存档页面按meta_key排序为“属性价格”为反对入境日期。如果有一个简单的,更“WordPress-y”的机制来做到这一点,我都是耳朵。请明确说明代码的放置位置等。
仅供参考,此时很清楚在URL中传递“order = ASC”和“order = DESC”。但是,似乎我对“meta_key”或任何相关内容没有做任何任何效果。
提前致谢。
答案 0 :(得分:6)
您可以在pre_get_posts
挂钩上添加过滤器。
将此代码放入functions.php
(在您的主题目录中):
add_filter('pre_get_posts', 'pre_get_posts_hook' );
function pre_get_posts_hook($wp_query) {
if (is_category() || is_archive())
{
$wp_query->set( 'orderby', 'meta_value_num' );
$wp_query->set( 'meta_key', 'price' );
$wp_query->set( 'order', 'ASC' );
return $wp_query;
}
}
您可以使用meta_value
代替meta_value_num
(适用于v2.8),但我认为价格是数值。
答案 1 :(得分:1)
如果您发现丢失了导航菜单,我更新了@ soju的答案如下:
add_filter('pre_get_posts', 'pre_get_posts_hook' );
function pre_get_posts_hook($wp_query) {
if ( is_archive() && $wp_query->is_main_query() ) { //edited this line
$wp_query->set( 'orderby', 'meta_value_num' );
$wp_query->set( 'meta_key', 'price' );
$wp_query->set( 'order', 'ASC' );
return $wp_query;
}
}
然后过滤器不会影响导航菜单
答案 2 :(得分:0)
我相信您会在名为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文件中使用它。