回答編集履歴

7

ほげほげ

2019/07/31 03:01

投稿

yukikp
yukikp

スコア797

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- ※大人しく、get_the_titleを含めて、通常のWP_Queryで選択するfieldに、
15
+ ※大人しく、通常のWP_Queryで選択するfieldに、
16
16
 
17
17
  ```PHP
18
18
 
@@ -30,7 +30,7 @@
30
30
 
31
31
  を追加するやり方にしました。またページネーションなしの方は邪魔なので削除しました。
32
32
 
33
- これできっと大丈夫なはずです。
33
+ これできっとget_the_titleを含めて他の関数も使えるはずです。
34
34
 
35
35
 
36
36
 

6

最終版かな?

2019/07/31 03:01

投稿

yukikp
yukikp

スコア797

test CHANGED
@@ -1,8 +1,4 @@
1
1
  説明不足だけど、Advanced Custom Fields プラグイン使われてますよね?
2
-
3
-
4
-
5
- 0. ページネーションなし
6
2
 
7
3
 
8
4
 
@@ -16,115 +12,25 @@
16
12
 
17
13
 
18
14
 
19
- それと**このコードの弱点は、SUBSTRING( PM.meta_key, 1, 13)です。**(ほかにもあると思いますが)
20
-
21
- GROUP BYでこれを使う事で、繰り返しフィールド内で「同じ繰り返しに属する」タイトル、コメント、画像のデータを集めてますが、一つの投稿に対し、繰り返し数が3桁を超えると、例えば、**123回目の繰り返し(shop_voice_12)と12回目の繰り返し(shop_voice_12)が同じになり、区別つきません。**
22
-
23
-
24
-
25
- そこでLOCATE( 検索文字列, 検索対象文字列, 数値 )使う事変更。
15
+ ※大人しくget_the_title含めて、通常のWP_Queryで選択するfield
26
-
27
-
28
16
 
29
17
  ```PHP
30
18
 
31
- //SUBSTRING( PM.meta_key, 1, 12) => SUBSTRING( PM.meta_key, 1, 13)に変更しました
19
+ GROUP_CONCAT(
32
20
 
33
- //さらに、SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )とすることで、_が'shop_voice_'以降に出てくる文字位置を調べて、そこまで切り取るように変更
21
+ {$wpdb->postmeta}.meta_value
34
22
 
35
- //function custom_posts_fields( $fields )で、{$wpdb->post_title}を追加
36
-
37
-
38
-
39
- global $wpdb;
40
-
41
-
42
-
43
- $results = $wpdb->get_results("
44
-
45
- SELECT
46
-
47
- P.ID
48
-
49
- ,GROUP_CONCAT(
50
-
51
- PM.meta_value
52
-
53
- ORDER BY PM.meta_key DESC
23
+ ORDER BY {$wpdb->postmeta}.meta_key DESC
54
24
 
55
25
  SEPARATOR '@@'
56
26
 
57
27
  ) AS comment
58
28
 
59
-
60
-
61
- FROM
62
-
63
- $wpdb->posts AS P
64
-
65
- INNER JOIN $wpdb->postmeta AS PM ON P.ID = PM.post_id
66
-
67
- WHERE
68
-
69
- P.post_status IN ('publish')
70
-
71
- AND (
72
-
73
- PM.meta_key like 'shop_voice_%_ttl'
74
-
75
- OR
76
-
77
- PM.meta_key like 'shop_voice_%_comment'
78
-
79
- OR
80
-
81
- PM.meta_key like 'shop_voice_%_img'
82
-
83
- )
84
-
85
- GROUP BY
86
-
87
- P.ID
88
-
89
- ,SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )
90
-
91
- ");
92
-
93
-
94
-
95
-
96
-
97
- $all_comments = [];
98
-
99
- foreach( $results as $r ){
100
-
101
- $all_comments[] = $r->comment;
102
-
103
- }
104
-
105
-
106
-
107
- shuffle( $all_comments );
108
-
109
-
110
-
111
- foreach( $all_coments as $comment ){
112
-
113
- echo "<pre>";
114
-
115
- var_dump( explode( "@@", $comment ) );
116
-
117
- echo "</pre>";
118
-
119
- }
120
-
121
-
122
-
123
29
  ```
124
30
 
31
+ を追加するやり方にしました。またページネーションなしの方は邪魔なので削除しました。
125
32
 
126
-
127
- 1. ページネーションあり
33
+ これできっと大丈夫なはずです。
128
34
 
129
35
 
130
36
 
@@ -196,11 +102,7 @@
196
102
 
197
103
  global $wpdb;
198
104
 
199
- return $fields = "
105
+ return $fields .= "
200
-
201
- {$wpdb->posts}.ID
202
-
203
- ,{$wpdb->posts}.post_title
204
106
 
205
107
  ,GROUP_CONCAT(
206
108
 

5

get_the_titleでタイトルが取得できるように修正。

2019/07/31 03:00

投稿

yukikp
yukikp

スコア797

test CHANGED
@@ -32,6 +32,8 @@
32
32
 
33
33
  //さらに、SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )とすることで、_が'shop_voice_'以降に出てくる文字位置を調べて、そこまで切り取るように変更
34
34
 
35
+ //function custom_posts_fields( $fields )で、{$wpdb->post_title}を追加
36
+
35
37
 
36
38
 
37
39
  global $wpdb;
@@ -196,7 +198,9 @@
196
198
 
197
199
  return $fields = "
198
200
 
199
- {$wpdb->posts}.ID
201
+ {$wpdb->posts}.ID
202
+
203
+ ,{$wpdb->posts}.post_title
200
204
 
201
205
  ,GROUP_CONCAT(
202
206
 

4

ページネーション使えるようなパターンを追記

2019/07/31 02:55

投稿

yukikp
yukikp

スコア797

test CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
 
4
4
 
5
+ 0. ページネーションなし
6
+
7
+
8
+
5
9
  簡易で良ければこんな感じで取得できます。
6
10
 
7
11
 
@@ -115,3 +119,147 @@
115
119
 
116
120
 
117
121
  ```
122
+
123
+
124
+
125
+ 1. ページネーションあり
126
+
127
+
128
+
129
+ ```PHP
130
+
131
+ $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
132
+
133
+ $args = array(
134
+
135
+ 'post_type' => 'shop',
136
+
137
+ 'paged' => $paged,
138
+
139
+ 'posts_per_page' => 10,
140
+
141
+ 'orderby' => 'rand',
142
+
143
+ );
144
+
145
+
146
+
147
+ add_filter( 'posts_fields', 'custom_posts_fields' );
148
+
149
+ add_filter( 'posts_where', 'custom_posts_where' );
150
+
151
+ add_filter( 'posts_join', 'custom_posts_join' );
152
+
153
+ add_filter( 'posts_groupby', 'custom_groupby' );
154
+
155
+ $comments = new WP_Query( $args );
156
+
157
+ remove_filter( 'posts_fields', 'custom_posts_fields' );
158
+
159
+ remove_filter( 'posts_where', 'custom_posts_where' );
160
+
161
+ remove_filter( 'posts_join', 'custom_posts_join' );
162
+
163
+ remove_filter( 'posts_groupby', 'custom_groupby' );
164
+
165
+
166
+
167
+ if( $comments->have_posts()): while( $comments->have_posts() ):$comments->the_post();
168
+
169
+
170
+
171
+ echo $post->comment;
172
+
173
+
174
+
175
+ endwhile;endif;
176
+
177
+ if( function_exists( 'wp_pagenavi' ) ){
178
+
179
+ wp_pagenavi( array( 'query'=>$comments ) );
180
+
181
+ }
182
+
183
+ wp_reset_postdata();
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+ //以下functcions.phpに追記
192
+
193
+ function custom_posts_fields( $fields ){
194
+
195
+ global $wpdb;
196
+
197
+ return $fields = "
198
+
199
+ {$wpdb->posts}.ID
200
+
201
+ ,GROUP_CONCAT(
202
+
203
+ {$wpdb->postmeta}.meta_value
204
+
205
+ ORDER BY {$wpdb->postmeta}.meta_key DESC
206
+
207
+ SEPARATOR '@@'
208
+
209
+ ) AS comment
210
+
211
+ ";
212
+
213
+ }
214
+
215
+
216
+
217
+ function custom_posts_join( $join ){
218
+
219
+ global $wpdb;
220
+
221
+ return $join = " INNER JOIN {$wpdb->postmeta} ON {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id ";
222
+
223
+ }
224
+
225
+
226
+
227
+ function custom_posts_where( $where ){
228
+
229
+ global $wpdb;
230
+
231
+ return $where .= "
232
+
233
+ AND (
234
+
235
+ {$wpdb->postmeta}.meta_key like 'shop_voice_%_ttl'
236
+
237
+ OR
238
+
239
+ {$wpdb->postmeta}.meta_key like 'shop_voice_%_comment'
240
+
241
+ OR
242
+
243
+ {$wpdb->postmeta}.meta_key like 'shop_voice_%_img'
244
+
245
+ ) ";
246
+
247
+
248
+
249
+ }
250
+
251
+
252
+
253
+ function custom_groupby( $groupby ){
254
+
255
+ global $wpdb;
256
+
257
+ return $groupby = "
258
+
259
+ {$wpdb->posts}.ID
260
+
261
+ ,SUBSTRING( {$wpdb->postmeta}.meta_key, 1, LOCATE( '_', {$wpdb->postmeta}.meta_key, 12 ) )";
262
+
263
+ }
264
+
265
+ ```

3

LOCATEを使って、より一般化してみました。

2019/07/30 05:09

投稿

yukikp
yukikp

スコア797

test CHANGED
@@ -18,11 +18,17 @@
18
18
 
19
19
 
20
20
 
21
+ そこで、LOCATE( 検索文字列, 検索対象文字列, 数値 )を使う事に変更。
22
+
21
23
 
22
24
 
23
25
  ```PHP
24
26
 
25
27
  //SUBSTRING( PM.meta_key, 1, 12) => SUBSTRING( PM.meta_key, 1, 13)に変更しました
28
+
29
+ //さらに、SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )とすることで、_が'shop_voice_'以降に出てくる文字位置を調べて、そこまで切り取るように変更
30
+
31
+
26
32
 
27
33
  global $wpdb;
28
34
 
@@ -74,7 +80,7 @@
74
80
 
75
81
  P.ID
76
82
 
77
- ,SUBSTRING( PM.meta_key, 1, 13)
83
+ ,SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )
78
84
 
79
85
  ");
80
86
 

2

修正とコメント

2019/07/30 03:13

投稿

yukikp
yukikp

スコア797

test CHANGED
@@ -12,9 +12,17 @@
12
12
 
13
13
 
14
14
 
15
+ それと**このコードの弱点は、SUBSTRING( PM.meta_key, 1, 13)です。**(ほかにもあると思いますが)
16
+
17
+ GROUP BYでこれを使う事で、繰り返しフィールド内で「同じ繰り返しに属する」タイトル、コメント、画像のデータを集めてますが、一つの投稿に対し、繰り返し数が3桁を超えると、例えば、**123回目の繰り返し(shop_voice_12)と12回目の繰り返し(shop_voice_12)が同じになり、区別つきません。**
18
+
19
+
20
+
15
21
 
16
22
 
17
23
  ```PHP
24
+
25
+ //SUBSTRING( PM.meta_key, 1, 12) => SUBSTRING( PM.meta_key, 1, 13)に変更しました
18
26
 
19
27
  global $wpdb;
20
28
 
@@ -66,7 +74,7 @@
66
74
 
67
75
  P.ID
68
76
 
69
- ,SUBSTRING( PM.meta_key, 1, 12)
77
+ ,SUBSTRING( PM.meta_key, 1, 13)
70
78
 
71
79
  ");
72
80
 

1

$r->commentの修正

2019/07/30 03:02

投稿

yukikp
yukikp

スコア797

test CHANGED
@@ -78,7 +78,7 @@
78
78
 
79
79
  foreach( $results as $r ){
80
80
 
81
- $all_comments[] = [$r->comment];
81
+ $all_comments[] = $r->comment;
82
82
 
83
83
  }
84
84