我的问题很简单,我正在使用WP_Query来检索使用tax_query通过分类法过滤的一些自定义类型帖子。

现在我的问题是我想对orderby进行taxonomy,但是要从文档中进行搜索Web我找不到解决方案。

orderby中的WP_Query允许您按一堆字段(甚至是自定义元字段)进行排序,但它似乎不支持分类法。

是否有正确方向的指针?

谢谢大家。

#1 楼

不,不可能按分类法进行排序,因为从某种类型的角度来看,这实际上没有多大意义。

分类法是将事物组合在一起的方法。因此,对职位进行分类的重点实际上是让该分类中的术语在职位之间共享。如果一个分类法中每个术语仅在一个帖子上使用,那么这将使分类法变得毫无意义。而且,如果按应有的方式共享这些术语,那么按其排序将不会产生任何特别有用的信息。

在这种情况下,您应该使用的是post meta。您可以按帖子元进行排序,并且每个帖子都是唯一的。

编辑:也就是说,您可以通过使用过滤器进行自定义SQL查询来按分类进行排序,但是您不能通过未经修改的WP_Query:http://scribu.net/wordpress/sortable-taxonomy-columns.html

但是,如果您不得不采取这种方式,那么您的数据设计结构首先是错误的。分类中的“术语”不是实际的“数据”。这些术语本身没有内在的含义,它们只是它们所描述的特定组的标签。如果将它们视为有意义的数据,则说明存在潜在的设计缺陷。

分类法通过为它们分配术语来对事物进行分组。分组是分类法的重点,术语只是分组中的漂亮面孔。如果您有有意义的元数据可分配给帖子,则应改为使用帖子元。而且您可以订购,因为post meta同时使用键和值来存储信息。使用分类法,您实际上只存储键,键的值是按该术语分组的帖子。

如果使用正确的方法,从长远来看,事情会变得更容易。我并不是说您不能对分类法做一些奇怪的事情,但从长远来看,您只是在错误地使用它来使事情变得更艰难。

评论


您好奥托,谢谢您的回答。我明白你的意思,也许我走错了路。在我的示例电视节目站点中,我具有系列1,系列2,系列3等的分类法。因此,我可以按系列号对所有不同的电视节目进行分组。然后我对情节(情节01,情节02等)有相同的要求。我要显示的是按情节和意向排序的所有情节列表。我将分析然后发布元和自定义字段。谢谢奥托。

–yeope
2011年4月8日在16:35

@yeope,您的分类法应该是系列,术语应该是系列1,系列2,依此类推。对于剧集,我假设一个系列包含多个情节,因此它可以使用相同的分类法“系列”,如果它们是等级分类的,则是第1集,第2集等的父词应为“系列x”。然后,您可以按顺序查询整个系列,使剧集按其应有的顺序排列。

– Chris_O
2011年4月8日在19:17

@Chris_O我明白了,您可能在那里有钱!我能看到的唯一问题是必须为每个系列重复术语“第1集”,“第2集”。也不能根据系列不对所有第1集进行分组,但是我认为可能有解决方法。谢谢Chris_O

–yeope
2011年4月8日在22:26

实际上,对分类使用分类法没有多大意义,因为分组是毫无价值的。想想看,如果您将“第1集”作为一个术语,那么您会将第1集与其他电视节目中的第1集进行分组。剧集和系列编号作为post_meta更有意义,因为它们特定于该特定节目,并且不能作为一个组使用。电视节目的名称在电视节目分类法中很有用,因为这样您就可以将整个节目分组在一起。

–奥托
2011年4月15日19:28



Otto在此之后发表了一篇有趣的博客文章:何时(不)使用自定义分类法。

– Jan Fabry
2011年5月5日下午6:55

#2 楼

这个问题的可接受答案是不可接受的。假定按税款“毫无意义”是不合逻辑的。他给出的答案没有道理。

考虑使用菜单项类型。然后,您有一个“ FoodCategories”的自定义税。 FoodCategories税具有“早餐”,“午餐”和“晚餐”术语。如果您使用tax_query参数提交查询,则现在将获得包含所有术语的结果集,但是这些术语将按发布日期排序。

为了获得相对于它们的术语正确的顺序,然后通过将帖子分成不同的类别来适当地显示在前端,您必须遍历结果集,然后查询结果集中的每个帖子,以找到其用语并与当前用语进行比较,过滤成一个数组并继续进行。然后,您必须再次遍历新数组以进行显示。

如果WP具有“ tax__in” orderby选项,就像它执行“ post__in”一样,那将是很好的选择,但是由于它没有,您要么必须执行上述荒谬的过程;您可以通过“ posts_orderby”过滤器和“ posts_join”过滤器自定义查询,以便分别调整orderby方法并将其添加到结果集中;否则您必须在与这些字词相关的html部分中针对要过滤的每个字词进行新查询。

最有效的方法是通过过滤器更改查询字符串。最简单的方法是执行三个单独的查询。 WP API应该按税收或任何限制性查询参数处理订购。如果要基于某些条件限制查询,则很有可能许多人需要在相同条件下进行排序。

评论


抱歉,您错了。在您的情况下,按分类进行排序也没有任何意义。您想展示什么?首先是所有早餐,然后是所有晚餐,然后是所有午餐?您应该选择所需的内容以及所需的顺序,但是分类法只是一个分组标签。应该排序的“数据”没有意义。如果是这样,那么它就不应该是分类法中的术语,而应将其设置为后元。

–奥托
14-10-20在11:57

来吧,当然,在某些情况下,您将需要按分类术语订购帖子。另一个示例是具有分级分类法的电影帖子类型。在电影列表中,可以很容易地想象人们想要通过分级来订购电影列表,因此所有G级,然后PG级等电影都显示在顶部。 (在此示例和进餐示例中,可以通过term_id而不是名称对其进行排序。)在很大的灰色区域中,您可能最好通过分类法而不是元数据来进行服务,但是对分类法进行排序也可能会有所帮助-能够。

–第七钢
2015年3月10日在20:51

PG和G评级等都是很好的分类法选择,只是它们是有关特定电影的数据。因此,它们是元的。它们是数据,而不是类别。分类数量有限,无法做出选择。如果需要排序依据,则可以将其设为元,或通过分类法特定代码按分类法强制排序。 BTW,NC17在PG之后。因此,您仍然需要代码来执行该排序。

–奥托
15年11月10日在1:05



我知道我对这个评论晚到了,但是碰到了这个。在某些情况下,按分类法排序可能很有意义。我们将一个项目的职位列表作为职位类型,然后将职位所在的州和城市分类。我们希望它们容易被弄乱(显示一个州的所有工作或显示一个城市的所有工作),因此分类法是最好的解决方案。同时,在一般的工作搜索中,我们要首先按标题,州,城市分类。

–丹尼斯·普扎克(Dennis Puzak)
18-10-23在10:39



另一个用例:客户有很多文章,每个文章都有一个类别。客户希望有一个列出所有文章的页面,该页面可以按字母,日期或类别进行排序。也可以过滤类别,但是按字母顺序列出所有文章并不是用例那么疯狂,您会看到它经常弹出。

–威尔逊·比格斯(Wilson Biggs)
19年6月6日在16:06

#3 楼

是的,但是确实涉及其中...

添加到主题中的functions.php中:

function orderby_tax_clauses( $clauses, $wp_query ) {
    global $wpdb;
    $taxonomies = get_taxonomies();
    foreach ($taxonomies as $taxonomy) {
        if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby'] ) {
            $clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
            $clauses['groupby'] = "object_id";
            $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
            $clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
        }
    }
    return $clauses;
}

    add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );


东西和我自己做的一些东西。解释非常困难,但最重要的是运行此命令,您可以输入?orderby =(taxonomy query var)&order = ASC(或DESC),然后她马上就可以离开!

评论


谢谢Drew,我将尝试运行该SQL,需要进行一些编辑,但它可能会起作用。我现在唯一的问题是,我可能会按照Otto的指示走错了方向。谢谢你,德鲁。编辑-无需编辑,我可以看到它需要调整的地方:)谢谢

–yeope
2011年4月8日在16:45



如果您在最近两分钟之内抓住它,它将无法正常工作,请立即抓住它,我已将其修复。它针对两种特定的分类法进行了设置,我改进了代码以适用于所有已注册的分类法。

–德鲁·古利(Drew Gourley)
2011年4月8日在16:48

再一次谢谢你。以防万一我尝试了您的解决方案,并且可以正常工作。另外,如果其他人想要使用它,则需要更改add_filter('posts_clauses','orderby_tax_clauses',10,2);添加到add_filter('posts_clauses','todo_tax_clauses',10,2);谢谢 :)

–yeope
2011年4月8日在22:29

是的,现在这已在代码块中修复了,我从一个正在处理的项目中获取了此内容,尽管我在钩子中对其进行了更改,但是却忘记更改该函数的名称。

–德鲁·古利(Drew Gourley)
2011年4月9日下午6:39

您是否知道是否可以通过ID而不是名称来排序分类法?我正在尝试通过ID排序分类组来获得相同的结果

–哈维尔·维拉纽瓦(Javier Villanueva)
13年7月16日在22:43

#4 楼

我在这里玩游戏迟到了,但是有一种更简单的WordPressy方法可以做到这一点。

像平常一样建立您的税收查询。

$tax_query = array();
$tax_query['relation']="OR";
$tax_query[] = array(
    'taxonomy' => 'product_cat',
    'field'    => 'slug',
    'terms'    => $cat_terms,
);
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;


为query_posts或WP_Query设置args

$args = array(
    'post_type'=>'post',
    'posts_per_page'=>12,
    'paged'=>$paged,
    'tax_query' => $tax_query,
);


在进行query_posts / WP_Query调用之前,请插入orderby过滤器并覆盖它

add_filter('posts_orderby', 'edit_posts_orderby');
function edit_posts_orderby($orderby_statement) {
    $orderby_statement = " term_taxonomy_id ASC ";
    return $orderby_statement;
}
query_posts($args);
remove_filter('posts_orderby', 'edit_posts_orderby');


别忘了以后删除过滤器...

这很有效b / c tax_query为您创建了连接等,您只需要按联接中的字段之一排序。

评论


关于如何按名称而不是term_taxonomy_id进行排序的任何想法?在orderby_statement中更改term_taxonomy_id会引发错误

– tehlivi
16-10-4在21:52

这是对任何有兴趣的人的正确答案!

– Mayra M
18年6月21日在10:43

#5 楼

我不确定为什么这里的所有解决方案都过分夸大了。好的,已经有五年了,但是我现在正在运行以下代码,它可以正常工作:

   <?php // Default
    $wheels_args = array(
        'post_type' => 'wheels',
        'posts_per_page' => '96',
        'orderby' => 'taxonomy, name', // Just enter 2 parameters here, seprated by comma
        'order'=>'ASC'
    );
    $loop = new WP_Query($wheels_args);
    ?>


这将首先对CPT的分类法进行排序按字母顺序分类,并且在这些分类组中按字母顺序分类。

评论


@yeope为什么这是公认的答案!?感谢上帝,我滚动

–胡安·索拉诺(Juan Solano)
19-10-21在23:17

无法使它正常工作。您可以指向一个对此有一些解释的网站吗?这里没有任何东西,可以备份您的代码

–honk31
4月9日17:15

#6 楼

好吧,我想展示一下我按类别/分类对自定义帖子类型进行排序的经验。

WEB


在WordPress上运行的旅行社网站
自定义帖子类型的主要内容称为“ ruta”
具有这种结构的分类法旅行类型>大洲>国家

案例

在存档类别列表页面,客户希望按



对大陆分类,按每个路线上的路线数排序。
国家/地区,按字母顺序排序。

步骤

首先,我从未修改的存档页面查询中捕获了恰好是这样的请求:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE 1=1 
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) )
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 20


其次,我根据数据库对Sequel Pro中的sql代码进行了编辑。我想出了这个(是的,可能可以改进:我对MySQL的
知识不是很出色):

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id =  tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    ) AS Total
FROM  wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )
WHERE 1=1  
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) ) 
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY
total DESC,
wp_terms.name  


第三,我迷上了查询在具有三个过滤器的functions.php文件上:posts_fields,posts_join和posts_orderby

functions.php中的代码:

function xc_query_fields( $fields ) {

   $fields = "wp_posts.ID, wp_posts.post_title, wp_terms.name, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id = tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    )
    AS Total";
     return $fields;
}


function xc_query_joins( $join ) {
$join .= "INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
   INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
   INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )";
 return $join;
}


function xc_query_orderby( $join ) {
    $join = "total DESC, wp_terms.name ";
    return $join;
 }


最后我触发了根据某些条件从pre_get_post挂钩中筛选出的过滤器

function filtra_queries( $query )
{

  if (  is_archive()  && $query->is_main_query() && !is_admin()  ) {

$rutes = array('viajes-privados', 'asia', 'africa', 'oceania', 'america', 'oriente-proximo');

if  ( in_array( $query->get('category_name'), $rutes ) ) 
  {
  add_filter( 'posts_fields', 'xc_query_fields' );
  add_filter( 'posts_join', 'xc_query_joins' );
  add_filter( 'posts_orderby', 'xc_query_orderby' );
}// end if in_array

  }// end if is_archive

}
 add_filter('pre_get_posts', 'filtra_queries');


希望这可以对某人有所帮助

评论


很好的工作,荒谬的是,用大量的代码按分类法对事物进行排序。 WP的巨大问题。

–赛龙
17年7月20日在23:27

#7 楼

我遇到了一个非常类似的问题:我想通过自定义分类法(问题)订购自定义的后置存档(杂志文章)。我从不直接在我的网站上进行SQL查询-通常,如果您像其他答案一样,则需要重新考虑您的方法。

问题:

1)Wordpress不会”

2)Wordpress只是不允许orderby在后置类型WP_Query上使用分类法(由Otto阐明)。

解决方案:

1)目前,分类最好由Custom Taxonomy Order NE插件完成。它允许您通过wp-admin中的WYSIWYG来订购分类法,这不是我会做的,但是我没有发现更好的方法。

安装插件时,您会得到类似于我在这里所做的。记下选项Auto-sort Queries of this Taxonomy-将其设置为Custom Order as Defined Above;这可以让您获得所需的订单。屏幕截图:



2)现在有了分类的分类,您现在可以创建一系列贯穿每个术语的WP_Query调用,从而有效地创建由分类。使用get_terms()创建一个包含所有税收条款的数组,然后在每个条款上运行foreach。这将为每个术语项创建一个WP_Query,它将返回给定术语的所有帖子,从而有效地创建了按分类术语排序的档案。实现此目的的代码:

  // Get your terms and put them into an array
  $issue_terms = get_terms([
    'taxonomy' => 'issues',
    'hide_empty' => false,
  ]);

  // Run foreach over each term to setup query and display for posts
  foreach ($issue_terms as $issue_term) {
    $the_query = new WP_Query( array(
      'post_type' => 'post',
      'tax_query' => array(
        array(
          'taxonomy' => 'issues',
          'field' => 'slug',
          'terms' => array( $issue_term->slug ),
          'operator' => 'IN'
        )
      )
    ) );

    // Run loop over each query
    while($the_query->have_posts()) :
      $the_query->the_post();

      // YOUR TEMPLATE OUTPUT FOR EACH POST

    endwhile;
  }


此站点上的相关阅读内容:
以自定义帖子类型显示所有帖子,并按自定义分类法进行分类

#8 楼

这是我用于此特定问题的解决方案。此解决方案适用于无法同时使用pre_get_posts过滤器并且查询中存在现有分页的极端情况(例如:WooCommerce):

global $wpdb;

$taxonomies = array('my-tax-1', 'my-tax-2', 'my-tax-3');

$orderby = "'".implode("', '", array_keys($taxonomies))."'";
$id_sql = $GLOBALS['wp_query']->request;

$id_sql = preg_replace('/LIMIT\s+\d+\s?,?\s\d*/', '', $id_sql);
$id_sql = str_replace('SQL_CALC_FOUND_ROWS', '', $id_sql);

$term_sql = "SELECT
  tt.taxonomy AS `taxonomy`,
  t.name AS `term_name`,
  t.slug AS `term_slug`,
  count(*) AS `term_count`
FROM ({$id_sql}) p 
JOIN wp_term_relationships tr
  ON p.ID = tr.object_id
JOIN wp_term_taxonomy tt
  ON tr.term_taxonomy_id = tt.term_taxonomy_id
JOIN wp_terms t
  ON tt.term_id = t.term_id
WHERE tt.taxonomy IN ({$orderby})
GROUP BY t.slug
ORDER BY
  FIELD(tt.taxonomy, {$orderby})"; // Add further specific ordering here

$results = $wpdb->get_results($term_sql, ARRAY_A);


I' ve使用它来创建按分类,术语和每个术语的计数顺序排序的导航菜单。

如果您只想要这些职位,则将查询更改为SELECT p.*GROUP BY p.ID

#9 楼

就像查询之前的查询一样,但是如果我们不查询太多帖子,也不会打扰...想法是修改主查询,这样我们甚至不需要进入模板并生成新查询,循环...

function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms('my_custom_taxonomy');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                'posts_per_page' => 4, // as you wish...
                'post_type' => 'my_custom_post_type', // If needed... Default is posts
                'fields' => 'ids', // we only want the ids to use later in 'post__in'
                'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars['post_type'] = 'my_custom_post_type'; // Again, if needed... Default is posts
        $query->query_vars['posts_per_page'] = 16; // If needed...
        $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above
        $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop
        $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );


#10 楼

我喜欢手动对我的条款进行排序,因此我使用插件来进行排序。我是pre_get_posts过滤器的粉丝,所以我以Drew Gourley的正确工作示例为例。因此,这是一种特殊情况,但无论如何我都会发布此消息,以防它对某人有所帮助。以下代码进入functions.php或自定义插件。

首先让我们开始使用过滤器。我们通过自定义分类法订购自定义帖子类型music

function so14306_pre_get_posts($query)
{
    if (is_admin()) :
        return;
    endif;

    if ($query->is_main_query()) :
        if (is_post_type_archive('music')) :
            $query->set('orderby', 'style');

        endif;
    endif;
}

add_action('pre_get_posts', 'so14306_pre_get_posts');


,然后我们将post_clauses过滤器称为:

function so14306_posts_clauses($clauses, $wp_query)
{
    global $wpdb;

    if (isset($wp_query->query_vars['orderby']) && $wp_query->query_vars['orderby'] === 'style') {
        $orderby = $wp_query->query_vars['orderby'];
        $clauses['join'] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
        $clauses['where'] .= " AND (taxonomy = '{$orderby}' OR taxonomy IS NULL)";
        $clauses['groupby'] = "object_id";
        $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.term_order ORDER BY {$wpdb->terms}.term_order ASC) ASC";
        $clauses['orderby'] .= ", {$wpdb->posts}.post_name ASC";
    }

    return $clauses;
}

add_filter('posts_clauses', 'so14306_posts_clauses', 10, 2);


现在,您所需要做的就是使用以下插件对分类法进行分类:简单自定义邮购。此插件对于该解决方案是必不可少的,因为它将style列添加到了数据库中!

此行:
term_order按标题对帖子进行排序,因此上述解决方案的完整排序是:分类术语=>帖子标题。

#11 楼

一种相当简单的方法是添加一个如下功能:

发布文章时...
获取类别的ID / slug / etc ...
将其另存为帖子的自定义元值

,然后在循环中按该元值对帖子进行排序。
所以:
// 1
add_action( 'publish_post', 'save_and_add_meta' );

function save_and_add_meta($post_id){

        //Temporarily remove the action to avoid an infinite loop
        remove_action( 'publish_post', 'save_and_add_meta' );

        // 2            
        $category_slug = get_the_terms($post_id, 'your_taxonomys_name')[0]->slug;

        //3
        add_post_meta($post_id, 'cat_slug', $category_slug);

        //Add the action back in.
        add_action( 'publish_post', 'save_and_add_meta' );
}

然后输入您的WP查询会添加到$ args中:
'meta_key' => 'cat_slug',
'orderby' => 'meta_value',
'order' => 'DESC',

如果您可以找到一种方法来限制用户对每个帖子仅分配一个类别,或者您的类别是互斥的,则此方法可以起作用。但是,如果他们分配多个类别,则该职位将被排除在其中之一之外。