teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/10/14 06:12

投稿

KazuhiroHatano
KazuhiroHatano

スコア7834

answer CHANGED
@@ -2,4 +2,59 @@
2
2
 
3
3
  [get_meta_sql](https://developer.wordpress.org/reference/hooks/get_meta_sql/)で当該のフィールドを
4
4
  ``CAST(REPLACE(meta_value,',','') AS DECIMAL)``した値で
5
- エイリアス名をつけてJOINしておいておき、それをorderbyに指定する
5
+ エイリアス名をつけてJOINしておいておき、それをorderbyに指定する
6
+
7
+
8
+ ---
9
+
10
+ 参考までに
11
+
12
+ ウチのプラグインの複数のフィールドの値を利用した計算結果を利用して
13
+ meta_queryを書けるようにするためのフィルタフックとメソッド
14
+
15
+ meta_queryで指定したエイリアス名をorderbyに使えるようにもなってます
16
+
17
+ ```php
18
+ add_filter('get_meta_sql',function($sql,$queries,$type,$primary_table,$primary_id_column,$context){
19
+ $meta_table=_get_meta_table($type);
20
+ foreach($queries as $key=>$query){
21
+ if(!is_array($query) || empty($query['compute'])){continue;}
22
+ if(empty($query['alias'])){error_log('compute meta_query must have alias');continue;}
23
+ if(empty($query['keys'])){error_log('compute meta_query must have keys');continue;}
24
+ $sql['join'].=
25
+ " LEFT JOIN (".
26
+ Catpow\util\sql\meta::select_computed_value($type,$meta_table,$query['keys'],$query['compute'],$query['where']??null).
27
+ ") AS {$query['alias']} ".
28
+ "ON ({$primary_table}.{$primary_id_column} = {$query['alias']}.{$type}_id) ";
29
+ }
30
+ return $sql;
31
+ },10,6);
32
+ add_filter('meta_query_find_compatible_table_alias',function($alias,$clause){
33
+ if(isset($clause['alias'])){return $clause['alias'];}
34
+ return $alias;
35
+ },10,2);
36
+ ```
37
+
38
+
39
+
40
+ ```php
41
+ namespace Catpow\util\sql;
42
+ class meta extends sql{
43
+ public static function select_computed_value($type,$table,$keys,$compute,$where=null){
44
+ $primary_alias=key($keys);
45
+ $primary_key=array_shift($keys);
46
+ if(is_numeric($primary_alias)){$primary_alias = $primary_key;}
47
+ $sql="SELECT {$primary_alias}.{$type}_id,({$compute}) AS meta_value FROM {$table} AS {$primary_alias} ";
48
+ foreach($keys as $alias=>$key){
49
+ if(is_numeric($alias)){$alias = $key;}
50
+ $sql.=
51
+ "INNER JOIN {$table} AS {$alias} ".
52
+ "ON {$primary_alias}.{$type}_id = {$alias}.{$type}_id ".
53
+ "AND {$alias}.meta_key = '{$key}' ";
54
+ }
55
+ $sql.="WHERE {$primary_alias}.meta_key = '{$primary_key}'";
56
+ if(isset($where)){$sql.=' AND '.$where;}
57
+ return $sql;
58
+ }
59
+ }
60
+ ```