我正在开发一个音乐插件。
它使用一个自定义表tracklist_items来存储播放列表中的每个曲目;其结构如下:
|id| |track_id| |tracklist_id| |order| |time|
因此,如果我想计算轨迹列表的总轨迹,我有以下功能:
function get_subtracks_count(){
global $wpdb;
if (!$this->post_id) return false;
$querystr = $wpdb->prepare( "SELECT COUNT(*) FROM `tracklist_items` WHERE tracklist_id = %d", $this->post_id );
return $wpdb->get_var($querystr);
}
但现在,我希望能够
sort 执行查询时,按轨迹列出的轨迹列表会计数。
我应该如何做到这一点?
+:我看到人们通常使用元值对这类东西进行排序。上面的这个查询相当简单,所以我想它很快就会完成。但我应该考虑在每次向轨迹列表添加或删除轨迹时,都存储一个附加到轨迹列表的元值(这一过程对我来说似乎更复杂,因此我希望避免)
谢谢
最合适的回答,由SO网友:vguerrero 整理而成
方法是将自定义筛选器应用于WP_Query
您正在跑步。
add_filter(\'posts_clauses\', function ($clauses, $query) {
global $wpdb;
// only run the filter for a given query
// do your checks and return early
if (!$query->is_main_query() || !$query->is_post_type_archive(\'tracklist\')) {
return $clauses;
}
$clauses[\'fields\'] .= ", COUNT(items.id) AS track_count";
$clauses[\'join\'] .= " LEFT JOIN tracklist_items AS items ON {$wpdb->posts}.ID = items.tracklist_id";
$clauses[\'groupby\'] = "{$wpdb->posts}.ID";
$clauses[\'orderby\'] = "track_count DESC";
return $clauses;
}, 2, 10);
另请参见
https://stackoverflow.com/questions/20119901/counting-number-of-joined-rows-in-left-join