首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对WP查询中的分类法术语进行排序

如何对WP查询中的分类法术语进行排序
EN

WordPress Development用户
提问于 2022-10-04 15:57:29
回答 3查看 382关注 0票数 0

这里有人告诉我,将数据保存为元数据正在创建缓慢的查询。

我开始将用于分类的所有数据转换为分类法数据。我将“wpcf发行年”中存储的所有数据转换为一个名为“release”的分类法,并为每年创建了术语。

现在,我想按release-year对帖子进行排序。我似乎找不到一种方法让它与我的新分类法一起工作。这是我的旧密码

代码语言:javascript
复制
$my_query_args = array( 
    'posts_per_page' => -1,
    'post_type' => 'release',
    'meta_key'       => 'wpcf-release-year', //I want this to be my taxonomy instead of the meta data
    'orderby'        => array(
        'meta_value_num' => 'ASC',
        'title' => 'ASC',
    ),               
    'tax_query' => $release_type_query,
);

在这段代码中,我如何引用分类法术语而不是meta-key?我试过使用meta_key => 'release-year'这个名字,但这使得所有的帖子都不正确。我需要添加一个新的税务查询吗?我不知道该怎么办。谢谢!

EN

回答 3

WordPress Development用户

回答已采纳

发布于 2022-10-04 17:21:44

您不能按分类法术语排序,当您试图处理一个分类法中有多个术语的帖子时,这个概念就会崩溃。你可能知道只有一个学期会被选中,但是WP_Query不是这样构建的。

相反,保留分类法,以便保留所有性能/主题/管理UI的好处,但也可以将信息保存在post中,以便进行排序。这样,您就可以从这两个世界中获益,并且可以在术语更改时自动更新post元数据。这还允许您在tax_query中使用post元排序。

虽然这确实会导致重复,但成本是最低的,而且性能收益是非常真实的。您甚至可能决定在将来存储仅用于提高性能的数据,例如中间预计算数据或存储桶(例如,将价格存储在后置元中,但将post放入预定义的存储桶(如$100-150))。

票数 1
EN

WordPress Development用户

发布于 2022-10-04 17:06:27

这里有很多东西要打开,所以我要尽我最大的努力。

您的基本代码--我将更改为:

代码语言:javascript
复制
$my_query_args = array( 
    'posts_per_page' => -1,
    'post_type' => 'release',
    'meta_key'       => 'release-year',
    'orderby'        => 'meta_value_num',
    'order'          => 'ASC',              
    'tax_query' => $release_type_query,
);

我更改了您的自定义分类法release-year的元键。此外,我还剥离了您的orderby arg,只按数字排序。

这只有在release-year中的所有术语实际上都是数字的情况下才能起作用。

这是你正在做的said...what,这似乎没有道理。我认为使用post是一个更好的选择。如果上面的内容不起作用,请检查以下问题:使用wp_查询是否可以进行orderby分类?

票数 1
EN

WordPress Development用户

发布于 2022-10-05 06:34:15

实际上,可以将主查询按分类法排序.只是不太漂亮。首先,也是最重要的:这将通过操作WordPress执行的查询来工作。如果您不知道如何绕过WordPress数据库,我可能不会建议您这样做,因为您可以创建您的网站。不过,让我们谈谈事情的实质,好吗?

Step 1:添加过滤器

首先,也是最重要的,我假设您希望在“发布”--Post类型-Archive上订购"releases“。

若要直接更改WordPress执行的SQL-查询,可以使用筛选器"posts_clauses",可以获得有关这里的更多信息。

要只在定制post类型的归档文件中添加筛选器,我们将使用pre_get_posts筛选器,如下所示:

代码语言:javascript
复制
add_action('pre_get_posts','setup_my_query_interception');

function setup_my_query_interception($query){
    if( !is_admin() && $query->is_post_type_archive( 'release' ) && $query->is_main_query() ){
     add_filter( 'posts_clauses', 'order_by_taxonomy_intercept_query_clauses', 20, 1 );
  }
}

在执行之前,数据库查询片段将发送到我们的函数order_by_taxonomy_intercept_query_clauses (该函数将在步骤2中)。

Step 2:更改查询

我们必须扩展MySQL查询以包括术语和分类法表。为此,我们使用了过滤器函数order_by_taxonomy_intercept_query_clauses

代码语言:javascript
复制
function order_by_taxonomy_intercept_query_clauses($pieces){
        global $wpdb;
        $pieces['join'].=" LEFT JOIN $wpdb->term_relationships trt ON ($wpdb->posts.ID = trt.object_id) LEFT JOIN $wpdb->term_taxonomy ttt ON (trt.term_taxonomy_id = ttt.term_taxonomy_id) INNER JOIN $wpdb->terms termts ON (termts.term_id = ttt.term_id)";
        $pieces['where'].=" AND ttt.taxonomy = 'release-year'";
        $pieces['orderby']="termts.name ASC, ".$pieces['orderby'];
        //Remove the filter so it only runs once in our main query
        remove_filter('posts_clauses', 'order_by_taxonomy_intercept_query_clauses');
        return $pieces;
}

Step 3:成功!

你的释放现在将按发行年下达命令。

编码愉快!

票数 1
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/410150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档