这里有人告诉我,将数据保存为元数据正在创建缓慢的查询。
我开始将用于分类的所有数据转换为分类法数据。我将“wpcf发行年”中存储的所有数据转换为一个名为“release”的分类法,并为每年创建了术语。
现在,我想按release-year对帖子进行排序。我似乎找不到一种方法让它与我的新分类法一起工作。这是我的旧密码
$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'这个名字,但这使得所有的帖子都不正确。我需要添加一个新的税务查询吗?我不知道该怎么办。谢谢!
发布于 2022-10-04 17:21:44
您不能按分类法术语排序,当您试图处理一个分类法中有多个术语的帖子时,这个概念就会崩溃。你可能知道只有一个学期会被选中,但是WP_Query不是这样构建的。
相反,保留分类法,以便保留所有性能/主题/管理UI的好处,但也可以将信息保存在post中,以便进行排序。这样,您就可以从这两个世界中获益,并且可以在术语更改时自动更新post元数据。这还允许您在tax_query中使用post元排序。
虽然这确实会导致重复,但成本是最低的,而且性能收益是非常真实的。您甚至可能决定在将来存储仅用于提高性能的数据,例如中间预计算数据或存储桶(例如,将价格存储在后置元中,但将post放入预定义的存储桶(如$100-150))。
发布于 2022-10-04 17:06:27
这里有很多东西要打开,所以我要尽我最大的努力。
您的基本代码--我将更改为:
$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分类?
发布于 2022-10-05 06:34:15
实际上,可以将主查询按分类法排序.只是不太漂亮。首先,也是最重要的:这将通过操作WordPress执行的查询来工作。如果您不知道如何绕过WordPress数据库,我可能不会建议您这样做,因为您可以创建您的网站。不过,让我们谈谈事情的实质,好吗?
Step 1:添加过滤器
首先,也是最重要的,我假设您希望在“发布”--Post类型-Archive上订购"releases“。
若要直接更改WordPress执行的SQL-查询,可以使用筛选器"posts_clauses",可以获得有关这里的更多信息。
要只在定制post类型的归档文件中添加筛选器,我们将使用pre_get_posts筛选器,如下所示:
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。
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:成功!
你的释放现在将按发行年下达命令。
编码愉快!
https://wordpress.stackexchange.com/questions/410150
复制相似问题