質問編集履歴
4
解決したので、コード提示と参考URLとお礼の書き込み
title
CHANGED
File without changes
|
body
CHANGED
@@ -8,6 +8,85 @@
|
|
8
8
|
0. 商品数が多いのと他の処理ではカンマが必要なためデータの変更は出来ない
|
9
9
|
0. どうにかしてカンマが入ってても```12,200 12,300 12,800```のようにソートしたい
|
10
10
|
|
11
|
+
### 追記3 ついに成功・解決したコードと方法論
|
12
|
+
いただいたアドバイスとグーグル先生に聞きまくってついに希望通りの結果が得られましたので記載します。
|
13
|
+
|
14
|
+
クエリーを投げてる部分、このままでは値段順に並ばない。
|
15
|
+
```php
|
16
|
+
$args = array(
|
17
|
+
'post_type' => 'product', // 取得する投稿タイプのスラッグ,
|
18
|
+
'posts_per_page' => 18,
|
19
|
+
'paged' => $paged,
|
20
|
+
'orderby' => 'meta_value_num',
|
21
|
+
'order' => 'DESC',
|
22
|
+
'meta_key' => '値段',
|
23
|
+
'post_status' => 'publish',
|
24
|
+
);
|
25
|
+
$wp_query = new WP_Query( $args );
|
26
|
+
|
27
|
+
```
|
28
|
+
|
29
|
+
アドバイスをいただいて**posts_request**をフックしてSQLを書き換えるコード
|
30
|
+
```php
|
31
|
+
add_filter('posts_request', function ($query) {
|
32
|
+
global $template;
|
33
|
+
|
34
|
+
if( basename($template) != "search.php" ) {
|
35
|
+
return $query;
|
36
|
+
}
|
37
|
+
|
38
|
+
//echo "<br>" . $query . "<br>";
|
39
|
+
|
40
|
+
$pos3 = mb_strrpos( $query, "L" );
|
41
|
+
$queryLimit = mb_substr( $query, $pos3 );
|
42
|
+
|
43
|
+
//echo "<br>" . $queryLimit . "<br>";
|
44
|
+
|
45
|
+
//echo "<br>" . "enter overwite query" . "<br>";
|
46
|
+
$query =
|
47
|
+
"
|
48
|
+
SELECT SQL_CALC_FOUND_ROWS wp_posts.*
|
49
|
+
FROM wp_posts
|
50
|
+
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
|
51
|
+
INNER JOIN (
|
52
|
+
SELECT meta_id, post_id, meta_key, CAST(REPLACE(meta_value,',','') AS DECIMAL) AS meta_value_no_comma
|
53
|
+
FROM wp_postmeta
|
54
|
+
WHERE wp_postmeta.meta_key = '値段'
|
55
|
+
ORDER BY `meta_value_no_comma` DESC ) AS wp_postmeta2 ON ( wp_posts.ID = wp_postmeta2.post_id)
|
56
|
+
WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' ) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish'))
|
57
|
+
GROUP BY wp_posts.ID
|
58
|
+
ORDER BY `meta_value_no_comma` DESC " . $queryLimit;
|
59
|
+
|
60
|
+
//echo "<br>" . $query . "<br>";
|
61
|
+
|
62
|
+
return $query;
|
63
|
+
});
|
64
|
+
```
|
65
|
+
これで思い通りの結果を得られました。キモとなったのは別名に対して ` バッククオートで囲めば別名で使用できるということでした。
|
66
|
+
|
67
|
+
```sql
|
68
|
+
SELECT SQL_CALC_FOUND_ROWS wp_posts.*
|
69
|
+
FROM wp_posts
|
70
|
+
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
|
71
|
+
INNER JOIN ( SELECT meta_id, post_id, meta_key, CAST(REPLACE(meta_value,',','') AS DECIMAL) AS meta_value_no_comma
|
72
|
+
FROM wp_postmeta
|
73
|
+
WHERE wp_postmeta.meta_key = '値段'
|
74
|
+
ORDER BY `meta_value_no_comma` DESC ) AS wp_postmeta2
|
75
|
+
ON ( wp_posts.ID = wp_postmeta2.post_id)
|
76
|
+
WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' )
|
77
|
+
AND wp_posts.post_type = 'product'
|
78
|
+
AND ((wp_posts.post_status = 'publish'))
|
79
|
+
GROUP BY wp_posts.ID
|
80
|
+
ORDER BY `meta_value_no_comma` DESC
|
81
|
+
LIMIT 0, 18
|
82
|
+
```参考になったリンクも記載しておきます
|
83
|
+
|
84
|
+
[MySQL の ORDER BY 句でカラムの別名が使えない](https://techblog.recochoku.jp/2723)
|
85
|
+
|
86
|
+
[MySqlのデベロッパーページの別名の使用方法](https://dev.mysql.com/doc/refman/5.6/ja/problems-with-alias.html)
|
87
|
+
|
88
|
+
---
|
89
|
+
|
11
90
|
### 追記2 さらにアドバイスをいただいて試したこと
|
12
91
|
KazuhiroHatano様がしきりにJOINして別名とおっしゃていたのが何となく引っかかっていて、progateではwhereにしかサブクエリを書くものがなかったので
|
13
92
|
whereにしか書けないのかと、思い込んでいましたが、再度のアドバイスでも同じことをおっしゃってらしたので、
|
3
新たにアドバイスをいただいたことを試みてその結果を追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -8,6 +8,35 @@
|
|
8
8
|
0. 商品数が多いのと他の処理ではカンマが必要なためデータの変更は出来ない
|
9
9
|
0. どうにかしてカンマが入ってても```12,200 12,300 12,800```のようにソートしたい
|
10
10
|
|
11
|
+
### 追記2 さらにアドバイスをいただいて試したこと
|
12
|
+
KazuhiroHatano様がしきりにJOINして別名とおっしゃていたのが何となく引っかかっていて、progateではwhereにしかサブクエリを書くものがなかったので
|
13
|
+
whereにしか書けないのかと、思い込んでいましたが、再度のアドバイスでも同じことをおっしゃってらしたので、
|
14
|
+
もしや・・・と思い。グーグルで```SQL JOIN サブクエリ```で検索かけたらHITして**JOINでも使えるじゃん!**と分かり。
|
15
|
+
**SQLを書き直しました。が、しかし、今度は別のエラーメッセージが表示されるようになりました。**
|
16
|
+
|
17
|
+
再度書き直したSQL
|
18
|
+
```SQL
|
19
|
+
SELECT SQL_CALC_FOUND_ROWS wp_posts.*
|
20
|
+
FROM wp_posts
|
21
|
+
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
|
22
|
+
INNER JOIN (
|
23
|
+
SELECT post_id, meta_key, CAST(REPLACE(meta_value,',','') AS DECIMAL)
|
24
|
+
FROM wp_postmeta
|
25
|
+
WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' ) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish'))
|
26
|
+
) AS wp_postmeta2
|
27
|
+
WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' ) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish'))
|
28
|
+
GROUP BY wp_posts.ID
|
29
|
+
ORDER BY wp_postmeta2.meta_value+0 DESC LIMIT 0, 18"
|
30
|
+
|
31
|
+
```
|
32
|
+
|
33
|
+
新たに出てきたエラーメッセージはこちらです。
|
34
|
+
```
|
35
|
+
Unknown column 'wp_posts.post_type' in 'where clause'
|
36
|
+
```
|
37
|
+
|
38
|
+
申し訳ありませんが、再度アドバイスをいただけたら幸いです。
|
39
|
+
|
11
40
|
### 追記 アドバイスをいただいてから試したこと
|
12
41
|
function.phpに以下の記述を追加
|
13
42
|
```php
|
2
アドバイスをいただいてSQLを学習しqueryのSQLを書き換えるコードを記述したので、それを記載
title
CHANGED
File without changes
|
body
CHANGED
@@ -8,7 +8,87 @@
|
|
8
8
|
0. 商品数が多いのと他の処理ではカンマが必要なためデータの変更は出来ない
|
9
9
|
0. どうにかしてカンマが入ってても```12,200 12,300 12,800```のようにソートしたい
|
10
10
|
|
11
|
+
### 追記 アドバイスをいただいてから試したこと
|
12
|
+
function.phpに以下の記述を追加
|
13
|
+
```php
|
14
|
+
add_filter('posts_request', function ($query) {
|
15
|
+
global $template;
|
16
|
+
$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";
|
11
17
|
|
18
|
+
if( basename($template) != "search.php" ) {
|
19
|
+
return $query;
|
20
|
+
}
|
21
|
+
|
22
|
+
echo "<br>" . $query . "<br>";
|
23
|
+
|
24
|
+
$pos1 = mb_strrpos( $query, "L" );
|
25
|
+
$original_sql = mb_substr( $original_sql, 0, $pos1-6 );
|
26
|
+
|
27
|
+
$pos2 = mb_strrpos( $query, "L" );
|
28
|
+
$queryLimit = mb_substr( $query, $pos2 );
|
29
|
+
|
30
|
+
$query = mb_substr( $query, 0, $pos2 );
|
31
|
+
|
32
|
+
echo "<br>" . str_replace(PHP_EOL, '', str_replace(' ', '', $original_sql)) . "<br>";
|
33
|
+
echo "<br>" . str_replace(PHP_EOL, '', str_replace(' ', '', $query)) . "<br>";
|
34
|
+
|
35
|
+
echo "<br>" . $queryLimit . "<br>";
|
36
|
+
|
37
|
+
if (str_replace(PHP_EOL, '', str_replace(' ', '', $original_sql)) == str_replace(PHP_EOL, '', str_replace(' ', '', $query))) {
|
38
|
+
|
39
|
+
echo "<br>" . "enter overwite query" . "<br>";
|
40
|
+
$query =
|
41
|
+
"
|
42
|
+
SELECT SQL_CALC_FOUND_ROWS wp_posts.*, wp_postmeta.non_comma_value
|
43
|
+
FROM wp_posts
|
44
|
+
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
|
45
|
+
WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' ) AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'publish')) AND (
|
46
|
+
SELECT *, CAST(REPLACE(meta_value,',','') AS DECIMAL) AS non_comma_value
|
47
|
+
FROM wp_postmeta
|
48
|
+
WHERE wp_posts.ID = wp_postmeta.post_id
|
49
|
+
)
|
50
|
+
GROUP BY wp_posts.ID
|
51
|
+
ORDER BY non_comma_value+0 DESC
|
52
|
+
" . $queryLimit;
|
53
|
+
}
|
54
|
+
|
55
|
+
echo "<br>" . $query . "<br>";
|
56
|
+
|
57
|
+
return $query;
|
58
|
+
});
|
59
|
+
|
60
|
+
```
|
61
|
+
上記のコードで変更前のSQLをDUMPしたものが下記で
|
62
|
+
```SQL
|
63
|
+
SELECT SQL_CALC_FOUND_ROWS wp_posts.*
|
64
|
+
FROM wp_posts
|
65
|
+
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'))
|
66
|
+
GROUP BY wp_posts.ID
|
67
|
+
ORDER BY wp_postmeta.meta_value+0 DESC
|
68
|
+
LIMIT 0, 18
|
69
|
+
```
|
70
|
+
私のコードで修正したSQLが以下になります。
|
71
|
+
```SQL
|
72
|
+
SELECT SQL_CALC_FOUND_ROWS wp_posts.*, wp_postmeta.non_comma_value
|
73
|
+
FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( wp_postmeta.meta_key = '値段' )
|
74
|
+
AND wp_posts.post_type = 'product'
|
75
|
+
AND ((wp_posts.post_status = 'publish'))
|
76
|
+
AND ( SELECT *, CAST(REPLACE(meta_value,',','') AS DECIMAL) AS non_comma_value
|
77
|
+
FROM wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id )
|
78
|
+
GROUP BY wp_posts.ID
|
79
|
+
ORDER BY non_comma_value+0 DESC
|
80
|
+
LIMIT 0, 18
|
81
|
+
```
|
82
|
+
|
83
|
+
が、このSQLを実行する前にSQL構文チェッカーで問題なしと出たので、実行してみたところ以下のエラーメッセージが出て
|
84
|
+
ここからどこをどうやって直せばいいのか分かりません。
|
85
|
+
|
86
|
+
```
|
87
|
+
Unknown column 'wp_postmeta.non_comma_value' in 'field list'
|
88
|
+
```
|
89
|
+
|
90
|
+
直すべきところをアドバイスいただけたら幸いですm(_ _)m
|
91
|
+
|
12
92
|
### やったこと、試したこと
|
13
93
|
|
14
94
|
・まずカスタムフィールドでソートする方法が判らず、検索条件を変えて色々グーグル先生に教わって
|
1
やったことの追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
・まずカスタムフィールドでソートする方法が判らず、検索条件を変えて色々グーグル先生に教わって
|
15
15
|
やっと、なんとかカスタムフィールドで値段順にソートできるようになった。
|
16
16
|
・しかし詳細を見てみると上記の通り正しくソートされていないことが判明
|
17
|
+
・custom_WP_Queryみたいなのを作って対応できないかグーグル先生に2時間聞いてみたが、答えが見つからなかった。
|
17
18
|
・再度、検索条件を変えてグーグル先生に質問すること2時間。解決策がHITせず、こちらに来たしだいです
|
18
19
|
|
19
20
|
以下が検索に使っているコードです。これをどうすれば思い通りの結果が得られるか、お知恵を貸していただけませんでしょうか。
|