Order by optional meta key?

时间:2014-03-21 作者:Radley Sustaire

我正在为自定义帖子类型构建排序功能,并且我为“特色”帖子提供了一个自定义元值。勾选复选框时会设置该值,否则不会设置该值。

使用默认值orderby=meta_value 具有meta_key=featured 使其仅在屏幕上显示具有meta键的帖子。如果没有,他们甚至不会出现。

我希望这样,如果没有设置,它们确实会出现,但它们会最后出现。我想我需要使用meta_query 相反,但我也无法让它发挥作用。

How do I allow empty, false, or non-existing meta keys in the WP_Query arguments?

我的代码如下。这用于对仪表板中的列进行排序,因此它正在修改默认的WP查询参数。

function featured_sortable_order( $vars ) {
  if ( isset($vars[\'orderby\']) && $vars[\'orderby\'] == \'featured\' ) {

    $vars = array_merge( $vars, array(
      \'meta_key\' => \'featured\',
      \'orderby\' => \'meta_value\',
      \'order\'     => isset($vars[\'order\']) ? $vars[\'order\'] : \'asc\',
    ) );

  }
  return $vars;
}
add_filter( \'request\', \'featured_sortable_order\' );

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

首次发布后完全编辑的问题是,要订购元数据,WordPress需要\'meta_key\' in query设置为某物。但如果你\'meta_key\' 然后WordPress会添加如下内容

AND ( wp_postmeta.meta_key = \'the_meta_key\' )
WHERE SQL子句;比如

INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
join 条款。所以查询只返回包含该元查询的帖子。

一旦您在后端工作,并且调用get_post_meta( $postid, \'featured\', true) 对于每一篇显示该列的帖子来说,性能并不是一个大问题。由于get-meta函数上的WordPress缓存,请多次调用它。

因此,我们的想法是获取所有帖子(不在meta键上添加过滤器),然后使用\'posts_results\' 勾选并订购查看“特色”元键的帖子。

我刚用完过滤器就把它取下来。

add_filter( \'posts_results\', \'order_by_featured\', PHP_INT_MAX, 2 );

function order_by_featured ( $posts, $query ) {
  // run only on admin, on main query and only if \'orderby\' is featured
  if ( is_admin() && $query->is_main_query() && $query->get(\'orderby\') === \'featured\' ) {
    // run once
    remove_filter( current_filter(), __FUNCTION__, PHP_INT_MAX, 2 );
    $nonfeatured = array();
    $featured = array();
    foreach ( $posts as $post ) {
      if ( get_post_meta( $post->ID, \'featured\', TRUE ) ) {
        $featured[] = $post;
      } else {
        $nonfeatured[] = $post;
      }
    }
    $order = strtoupper( $query->get(\'order\') ) === \'ASC\' ? \'DESC\' : \'ASC\';
    // if order is ASC put featured at top, otherwise put featured at bottm
    $posts = ( $order === \'ASC\' )
      ? array_merge( $nonfeatured, $featured )
      : array_merge( $featured, $nonfeatured );
  }
  return $posts;
}
此外,我在\'pre_get_post\' 使用\'ASC\' 如果查询中未设置订单,则作为默认订单:

add_action( \'pre_get_posts\', function( $query ) {
  // if no order is set set order to ASC
  if (
    is_admin() && $query->is_main_query()
    && $query->get(\'orderby\') === \'featured\' 
    && $query->get(\'order\') === \'\'
  ) {
    $query->set( \'order\', \'ASC\' );
  }
});

SO网友:Celso Bessa

为什么不给所有帖子提供一个自定义值的meta属性呢?

我的意思是,你可以将所有帖子设置为特色=否/假/0/低数值valeu,然后更改为是/真/1/高数值所有应该特色化的帖子都会被订购,不是吗?

结束

相关推荐

MENU_ORDER不能处理以admin.php开头的插件

我正在过滤menu\\u order挂钩(codex链接->http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order) 更改“管理”菜单中“我的链接”的顺序。目前,以admin开头的slug无法进行排序。因此,带有slug“admin.php?page=custom\\u settings\\u page”的设置页面将位于列表的底部。有人知道这方面的解决方法吗?//change admin menu order add