WordPress PHP - 如何按特定的“meta_key”值对类别/归档结果进行排序?

时间:2011-02-22 00:11:39

标签: php wordpress sorting meta-tags

我之前在这里发了帖子: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”或任何相关内容没有做任何任何效果。

提前致谢。

3 个答案:

答案 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文件中使用它。