带MENU_ORDER和标题的Orderby

时间:2014-04-15 作者:Warface

因为Wordpress的原生顺序系统有点愚蠢(即:1个香蕉,10个香蕉,2个香蕉,…)

我需要添加一个插件,让我设置数字标题的顺序。问题是当我设置orderby= 具有menu_order title, 菜单的顺序就像我在后端设置的一样。但对于那些订单设置为0的。。。我想回到orderby=title.

总之,我希望orderby=menu_order title 如果顺序设置为0,则返回标题。

菜单顺序的插件链接:http://wordpress.org/plugins/term-menu-order/

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

尽管如此,MySQL并没有以本机方式进行“自然”排序there are attempts to make it work.

我不知道你提到的那个插件是如何工作的,但按排序menu_order 使用post_title 回退是微不足道的。

add_action(
  \'pre_get_posts\',
  function ($qry) {
    if ($qry->is_main_query()) {
      $qry->set(\'orderby\',\'menu_order title\');
    }
  }
);
当然,那会menu_order 在排序的顶部等于0,我认为这不是您想要的。

像MySQL一样,WP_Query 没有“自然排序”功能,但如果您想按menu_order 在哪里menu_order 大于0,否则按标题,这是我认为您想要的(至少在问题的关键点上),您可以使用过滤器来实现。

add_action(
  \'posts_orderby\',
  function ($orderby,$post) {
    global $wpdb;
    return " IF({$wpdb->posts}.menu_order > 0, {$wpdb->posts}.menu_order {$wpdb->posts}.post_title, {$wpdb->posts}.post_title) ";
  },
  10,2
);
几乎未经测试。可能是马车排空警告。不退款。

您可以使用类似的过滤器来尝试实现真正的自然排序,但我没有时间编写、测试和调试它。

结束