質問編集履歴

4

解決したので、コード提示と参考URLとお礼の書き込み

2020/10/19 05:42

投稿

nekora
nekora

スコア501

test CHANGED
File without changes
test CHANGED
@@ -18,6 +18,164 @@
18
18
 
19
19
 
20
20
 
21
+ ### 追記3 ついに成功・解決したコードと方法論
22
+
23
+ いただいたアドバイスとグーグル先生に聞きまくってついに希望通りの結果が得られましたので記載します。
24
+
25
+
26
+
27
+ クエリーを投げてる部分、このままでは値段順に並ばない。
28
+
29
+ ```php
30
+
31
+ $args = array(
32
+
33
+ 'post_type' => 'product', // 取得する投稿タイプのスラッグ,
34
+
35
+ 'posts_per_page' => 18,
36
+
37
+ 'paged' => $paged,
38
+
39
+ 'orderby' => 'meta_value_num',
40
+
41
+ 'order' => 'DESC',
42
+
43
+ 'meta_key' => '値段',
44
+
45
+ 'post_status' => 'publish',
46
+
47
+ );
48
+
49
+ $wp_query = new WP_Query( $args );
50
+
51
+
52
+
53
+ ```
54
+
55
+
56
+
57
+ アドバイスをいただいて**posts_request**をフックしてSQLを書き換えるコード
58
+
59
+ ```php
60
+
61
+ add_filter('posts_request', function ($query) {
62
+
63
+ global $template;
64
+
65
+
66
+
67
+ if( basename($template) != "search.php" ) {
68
+
69
+ return $query;
70
+
71
+ }
72
+
73
+
74
+
75
+ //echo "<br>" . $query . "<br>";
76
+
77
+
78
+
79
+ $pos3 = mb_strrpos( $query, "L" );
80
+
81
+ $queryLimit = mb_substr( $query, $pos3 );
82
+
83
+
84
+
85
+ //echo "<br>" . $queryLimit . "<br>";
86
+
87
+
88
+
89
+ //echo "<br>" . "enter overwite query" . "<br>";
90
+
91
+ $query =
92
+
93
+ "
94
+
95
+ SELECT SQL_CALC_FOUND_ROWS wp_posts.*
96
+
97
+ FROM wp_posts
98
+
99
+ INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
100
+
101
+ INNER JOIN (
102
+
103
+ SELECT meta_id, post_id, meta_key, CAST(REPLACE(meta_value,',','') AS DECIMAL) AS meta_value_no_comma
104
+
105
+ FROM wp_postmeta
106
+
107
+ WHERE wp_postmeta.meta_key = '値段'
108
+
109
+ ORDER BY `meta_value_no_comma` DESC ) AS wp_postmeta2 ON ( wp_posts.ID = wp_postmeta2.post_id)
110
+
111
+ WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' ) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish'))
112
+
113
+ GROUP BY wp_posts.ID
114
+
115
+ ORDER BY `meta_value_no_comma` DESC " . $queryLimit;
116
+
117
+
118
+
119
+ //echo "<br>" . $query . "<br>";
120
+
121
+
122
+
123
+ return $query;
124
+
125
+ });
126
+
127
+ ```
128
+
129
+ これで思い通りの結果を得られました。キモとなったのは別名に対して ` バッククオートで囲めば別名で使用できるということでした。
130
+
131
+
132
+
133
+ ```sql
134
+
135
+ SELECT SQL_CALC_FOUND_ROWS wp_posts.*
136
+
137
+ FROM wp_posts
138
+
139
+ INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
140
+
141
+ INNER JOIN ( SELECT meta_id, post_id, meta_key, CAST(REPLACE(meta_value,',','') AS DECIMAL) AS meta_value_no_comma
142
+
143
+ FROM wp_postmeta
144
+
145
+ WHERE wp_postmeta.meta_key = '値段'
146
+
147
+ ORDER BY `meta_value_no_comma` DESC ) AS wp_postmeta2
148
+
149
+ ON ( wp_posts.ID = wp_postmeta2.post_id)
150
+
151
+ WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' )
152
+
153
+ AND wp_posts.post_type = 'product'
154
+
155
+ AND ((wp_posts.post_status = 'publish'))
156
+
157
+ GROUP BY wp_posts.ID
158
+
159
+ ORDER BY `meta_value_no_comma` DESC
160
+
161
+ LIMIT 0, 18
162
+
163
+ ```参考になったリンクも記載しておきます
164
+
165
+
166
+
167
+ [MySQL の ORDER BY 句でカラムの別名が使えない](https://techblog.recochoku.jp/2723)
168
+
169
+
170
+
171
+ [MySqlのデベロッパーページの別名の使用方法](https://dev.mysql.com/doc/refman/5.6/ja/problems-with-alias.html)
172
+
173
+
174
+
175
+ ---
176
+
177
+
178
+
21
179
  ### 追記2 さらにアドバイスをいただいて試したこと
22
180
 
23
181
  KazuhiroHatano様がしきりにJOINして別名とおっしゃていたのが何となく引っかかっていて、progateではwhereにしかサブクエリを書くものがなかったので

3

新たにアドバイスをいただいたことを試みてその結果を追記

2020/10/19 05:42

投稿

nekora
nekora

スコア501

test CHANGED
File without changes
test CHANGED
@@ -18,6 +18,64 @@
18
18
 
19
19
 
20
20
 
21
+ ### 追記2 さらにアドバイスをいただいて試したこと
22
+
23
+ KazuhiroHatano様がしきりにJOINして別名とおっしゃていたのが何となく引っかかっていて、progateではwhereにしかサブクエリを書くものがなかったので
24
+
25
+ whereにしか書けないのかと、思い込んでいましたが、再度のアドバイスでも同じことをおっしゃってらしたので、
26
+
27
+ もしや・・・と思い。グーグルで```SQL JOIN サブクエリ```で検索かけたらHITして**JOINでも使えるじゃん!**と分かり。
28
+
29
+ **SQLを書き直しました。が、しかし、今度は別のエラーメッセージが表示されるようになりました。**
30
+
31
+
32
+
33
+ 再度書き直したSQL
34
+
35
+ ```SQL
36
+
37
+ SELECT SQL_CALC_FOUND_ROWS wp_posts.*
38
+
39
+ FROM wp_posts
40
+
41
+ INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
42
+
43
+ INNER JOIN (
44
+
45
+ SELECT post_id, meta_key, CAST(REPLACE(meta_value,',','') AS DECIMAL)
46
+
47
+ FROM wp_postmeta
48
+
49
+ WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' ) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish'))
50
+
51
+ ) AS wp_postmeta2
52
+
53
+ WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' ) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish'))
54
+
55
+ GROUP BY wp_posts.ID
56
+
57
+ ORDER BY wp_postmeta2.meta_value+0 DESC LIMIT 0, 18"
58
+
59
+
60
+
61
+ ```
62
+
63
+
64
+
65
+ 新たに出てきたエラーメッセージはこちらです。
66
+
67
+ ```
68
+
69
+ Unknown column 'wp_posts.post_type' in 'where clause'
70
+
71
+ ```
72
+
73
+
74
+
75
+ 申し訳ありませんが、再度アドバイスをいただけたら幸いです。
76
+
77
+
78
+
21
79
  ### 追記 アドバイスをいただいてから試したこと
22
80
 
23
81
  function.phpに以下の記述を追加

2

アドバイスをいただいてSQLを学習しqueryのSQLを書き換えるコードを記述したので、それを記載

2020/10/14 05:18

投稿

nekora
nekora

スコア501

test CHANGED
File without changes
test CHANGED
@@ -18,6 +18,166 @@
18
18
 
19
19
 
20
20
 
21
+ ### 追記 アドバイスをいただいてから試したこと
22
+
23
+ function.phpに以下の記述を追加
24
+
25
+ ```php
26
+
27
+ add_filter('posts_request', function ($query) {
28
+
29
+ global $template;
30
+
31
+ $original_sql = "SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' ) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value+0 DESC LIMIT 0, 18";
32
+
33
+
34
+
35
+ if( basename($template) != "search.php" ) {
36
+
37
+ return $query;
38
+
39
+ }
40
+
41
+
42
+
43
+ echo "<br>" . $query . "<br>";
44
+
45
+
46
+
47
+ $pos1 = mb_strrpos( $query, "L" );
48
+
49
+ $original_sql = mb_substr( $original_sql, 0, $pos1-6 );
50
+
51
+
52
+
53
+ $pos2 = mb_strrpos( $query, "L" );
54
+
55
+ $queryLimit = mb_substr( $query, $pos2 );
56
+
57
+
58
+
59
+ $query = mb_substr( $query, 0, $pos2 );
60
+
61
+
62
+
63
+ echo "<br>" . str_replace(PHP_EOL, '', str_replace(' ', '', $original_sql)) . "<br>";
64
+
65
+ echo "<br>" . str_replace(PHP_EOL, '', str_replace(' ', '', $query)) . "<br>";
66
+
67
+
68
+
69
+ echo "<br>" . $queryLimit . "<br>";
70
+
71
+
72
+
73
+ if (str_replace(PHP_EOL, '', str_replace(' ', '', $original_sql)) == str_replace(PHP_EOL, '', str_replace(' ', '', $query))) {
74
+
75
+
76
+
77
+ echo "<br>" . "enter overwite query" . "<br>";
78
+
79
+ $query =
80
+
81
+ "
82
+
83
+ SELECT SQL_CALC_FOUND_ROWS wp_posts.*, wp_postmeta.non_comma_value  
84
+
85
+ FROM wp_posts
86
+
87
+ INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
88
+
89
+ WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' ) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish')) AND (
90
+
91
+ SELECT *, CAST(REPLACE(meta_value,',','') AS DECIMAL) AS non_comma_value
92
+
93
+ FROM wp_postmeta
94
+
95
+ WHERE wp_posts.ID = wp_postmeta.post_id
96
+
97
+ )
98
+
99
+ GROUP BY wp_posts.ID
100
+
101
+ ORDER BY non_comma_value+0 DESC
102
+
103
+ " . $queryLimit;
104
+
105
+ }
106
+
107
+
108
+
109
+ echo "<br>" . $query . "<br>";
110
+
111
+
112
+
113
+ return $query;
114
+
115
+ });
116
+
117
+
118
+
119
+ ```
120
+
121
+ 上記のコードで変更前のSQLをDUMPしたものが下記で
122
+
123
+ ```SQL
124
+
125
+ SELECT SQL_CALC_FOUND_ROWS wp_posts.*
126
+
127
+ FROM wp_posts
128
+
129
+ INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' ) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish'))
130
+
131
+ GROUP BY wp_posts.ID
132
+
133
+ ORDER BY wp_postmeta.meta_value+0 DESC
134
+
135
+ LIMIT 0, 18
136
+
137
+ ```
138
+
139
+ 私のコードで修正したSQLが以下になります。
140
+
141
+ ```SQL
142
+
143
+ SELECT SQL_CALC_FOUND_ROWS wp_posts.*, wp_postmeta.non_comma_value
144
+
145
+ FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' )
146
+
147
+ AND wp_posts.post_type = 'product'
148
+
149
+ AND ((wp_posts.post_status = 'publish'))
150
+
151
+ AND ( SELECT *, CAST(REPLACE(meta_value,',','') AS DECIMAL) AS non_comma_value
152
+
153
+ FROM wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id )
154
+
155
+ GROUP BY wp_posts.ID
156
+
157
+ ORDER BY non_comma_value+0 DESC
158
+
159
+ LIMIT 0, 18
160
+
161
+ ```
162
+
163
+
164
+
165
+ が、このSQLを実行する前にSQL構文チェッカーで問題なしと出たので、実行してみたところ以下のエラーメッセージが出て
166
+
167
+ ここからどこをどうやって直せばいいのか分かりません。
168
+
169
+
170
+
171
+ ```
172
+
173
+ Unknown column 'wp_postmeta.non_comma_value' in 'field list'
174
+
175
+ ```
176
+
177
+
178
+
179
+ 直すべきところをアドバイスいただけたら幸いですm(_ _)m
180
+
21
181
 
22
182
 
23
183
  ### やったこと、試したこと

1

やったことの追記

2020/10/13 03:57

投稿

nekora
nekora

スコア501

test CHANGED
File without changes
test CHANGED
@@ -29,6 +29,8 @@
29
29
  やっと、なんとかカスタムフィールドで値段順にソートできるようになった。
30
30
 
31
31
  ・しかし詳細を見てみると上記の通り正しくソートされていないことが判明
32
+
33
+ ・custom_WP_Queryみたいなのを作って対応できないかグーグル先生に2時間聞いてみたが、答えが見つからなかった。
32
34
 
33
35
  ・再度、検索条件を変えてグーグル先生に質問すること2時間。解決策がHITせず、こちらに来たしだいです
34
36