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

質問編集履歴

4

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

2020/10/19 05:42

投稿

nekora
nekora

スコア501

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

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

2020/10/19 05:42

投稿

nekora
nekora

スコア501

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を書き換えるコードを記述したので、それを記載

2020/10/14 05:18

投稿

nekora
nekora

スコア501

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

やったことの追記

2020/10/13 03:57

投稿

nekora
nekora

スコア501

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
  以下が検索に使っているコードです。これをどうすれば思い通りの結果が得られるか、お知恵を貸していただけませんでしょうか。