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

回答編集履歴

7

ほげほげ

2019/07/31 03:01

投稿

yukikp
yukikp

スコア797

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  「簡易」としたのは、本来ならば、ACFでは、それぞれのカスタムフィールドの名前とfieldkeyというのが対になって作成され、同じ名前のカスタムフィールドのでも別々に扱う事ができるようになっているからです。
6
6
  そこをこのコードでは無視しています。
7
7
 
8
- ※大人しく、get_the_titleを含めて、通常のWP_Queryで選択するfieldに、
8
+ ※大人しく、通常のWP_Queryで選択するfieldに、
9
9
  ```PHP
10
10
  GROUP_CONCAT(
11
11
  {$wpdb->postmeta}.meta_value
@@ -14,7 +14,7 @@
14
14
  ) AS comment
15
15
  ```
16
16
  を追加するやり方にしました。またページネーションなしの方は邪魔なので削除しました。
17
- これできっと大丈夫なはずです。
17
+ これできっとget_the_titleを含めて他の関数も使えるはずです。
18
18
 
19
19
  ```PHP
20
20
  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

6

最終版かな?

2019/07/31 03:01

投稿

yukikp
yukikp

スコア797

answer CHANGED
@@ -1,68 +1,21 @@
1
1
  説明不足だけど、Advanced Custom Fields プラグイン使われてますよね?
2
2
 
3
- 0. ページネーションなし
4
-
5
3
  簡易で良ければこんな感じで取得できます。
6
4
 
7
5
  「簡易」としたのは、本来ならば、ACFでは、それぞれのカスタムフィールドの名前とfieldkeyというのが対になって作成され、同じ名前のカスタムフィールドのでも別々に扱う事ができるようになっているからです。
8
6
  そこをこのコードでは無視しています。
9
7
 
10
- それと**このコードの弱点は、SUBSTRING( PM.meta_key, 1, 13)です。**(ほかにもあると思いますが)
11
- GROUP BYでこれを使う事で、繰り返しフィールド内で「同じ繰り返しに属する」タイトル、コメント、画像のデータを集めてますが、一つの投稿に対し、繰り返し数が3桁を超えると、例えば、**123回目の繰り返し(shop_voice_12)と12回目の繰り返し(shop_voice_12)が同じになり、区別つきません。**
12
-
13
- そこでLOCATE( 検索文字列, 検索対象文字列, 数値 )使う事変更。
8
+ ※大人しくget_the_title含めて、通常のWP_Queryで選択するfield
14
-
15
9
  ```PHP
16
- //SUBSTRING( PM.meta_key, 1, 12) => SUBSTRING( PM.meta_key, 1, 13)に変更しました
17
- //さらに、SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )とすることで、_が'shop_voice_'以降に出てくる文字位置を調べて、そこまで切り取るように変更
18
- //function custom_posts_fields( $fields )で、{$wpdb->post_title}を追加
19
-
20
- global $wpdb;
21
-
22
- $results = $wpdb->get_results("
23
- SELECT
24
- P.ID
25
- ,GROUP_CONCAT(
10
+ GROUP_CONCAT(
26
- PM.meta_value
11
+ {$wpdb->postmeta}.meta_value
27
- ORDER BY PM.meta_key DESC
12
+ ORDER BY {$wpdb->postmeta}.meta_key DESC
28
13
  SEPARATOR '@@'
29
14
  ) AS comment
30
-
31
- FROM
32
- $wpdb->posts AS P
33
- INNER JOIN $wpdb->postmeta AS PM ON P.ID = PM.post_id
34
- WHERE
35
- P.post_status IN ('publish')
36
- AND (
37
- PM.meta_key like 'shop_voice_%_ttl'
38
- OR
39
- PM.meta_key like 'shop_voice_%_comment'
40
- OR
41
- PM.meta_key like 'shop_voice_%_img'
42
- )
43
- GROUP BY
44
- P.ID
45
- ,SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )
46
- ");
47
-
48
-
49
- $all_comments = [];
50
- foreach( $results as $r ){
51
- $all_comments[] = $r->comment;
52
- }
53
-
54
- shuffle( $all_comments );
55
-
56
- foreach( $all_coments as $comment ){
57
- echo "<pre>";
58
- var_dump( explode( "@@", $comment ) );
59
- echo "</pre>";
60
- }
61
-
62
15
  ```
16
+ を追加するやり方にしました。またページネーションなしの方は邪魔なので削除しました。
17
+ これできっと大丈夫なはずです。
63
18
 
64
- 1. ページネーションあり
65
-
66
19
  ```PHP
67
20
  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
68
21
  $args = array(
@@ -97,9 +50,7 @@
97
50
  //以下functcions.phpに追記
98
51
  function custom_posts_fields( $fields ){
99
52
  global $wpdb;
100
- return $fields = "
53
+ return $fields .= "
101
- {$wpdb->posts}.ID
102
- ,{$wpdb->posts}.post_title
103
54
  ,GROUP_CONCAT(
104
55
  {$wpdb->postmeta}.meta_value
105
56
  ORDER BY {$wpdb->postmeta}.meta_key DESC

5

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

2019/07/31 03:00

投稿

yukikp
yukikp

スコア797

answer CHANGED
@@ -15,6 +15,7 @@
15
15
  ```PHP
16
16
  //SUBSTRING( PM.meta_key, 1, 12) => SUBSTRING( PM.meta_key, 1, 13)に変更しました
17
17
  //さらに、SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )とすることで、_が'shop_voice_'以降に出てくる文字位置を調べて、そこまで切り取るように変更
18
+ //function custom_posts_fields( $fields )で、{$wpdb->post_title}を追加
18
19
 
19
20
  global $wpdb;
20
21
 
@@ -97,7 +98,8 @@
97
98
  function custom_posts_fields( $fields ){
98
99
  global $wpdb;
99
100
  return $fields = "
100
- {$wpdb->posts}.ID
101
+ {$wpdb->posts}.ID
102
+ ,{$wpdb->posts}.post_title
101
103
  ,GROUP_CONCAT(
102
104
  {$wpdb->postmeta}.meta_value
103
105
  ORDER BY {$wpdb->postmeta}.meta_key DESC

4

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

2019/07/31 02:55

投稿

yukikp
yukikp

スコア797

answer CHANGED
@@ -1,5 +1,7 @@
1
1
  説明不足だけど、Advanced Custom Fields プラグイン使われてますよね?
2
2
 
3
+ 0. ページネーションなし
4
+
3
5
  簡易で良ければこんな感じで取得できます。
4
6
 
5
7
  「簡易」としたのは、本来ならば、ACFでは、それぞれのカスタムフィールドの名前とfieldkeyというのが対になって作成され、同じ名前のカスタムフィールドのでも別々に扱う事ができるようになっているからです。
@@ -56,4 +58,76 @@
56
58
  echo "</pre>";
57
59
  }
58
60
 
61
+ ```
62
+
63
+ 1. ページネーションあり
64
+
65
+ ```PHP
66
+ $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
67
+ $args = array(
68
+ 'post_type' => 'shop',
69
+ 'paged' => $paged,
70
+ 'posts_per_page' => 10,
71
+ 'orderby' => 'rand',
72
+ );
73
+
74
+ add_filter( 'posts_fields', 'custom_posts_fields' );
75
+ add_filter( 'posts_where', 'custom_posts_where' );
76
+ add_filter( 'posts_join', 'custom_posts_join' );
77
+ add_filter( 'posts_groupby', 'custom_groupby' );
78
+ $comments = new WP_Query( $args );
79
+ remove_filter( 'posts_fields', 'custom_posts_fields' );
80
+ remove_filter( 'posts_where', 'custom_posts_where' );
81
+ remove_filter( 'posts_join', 'custom_posts_join' );
82
+ remove_filter( 'posts_groupby', 'custom_groupby' );
83
+
84
+ if( $comments->have_posts()): while( $comments->have_posts() ):$comments->the_post();
85
+
86
+ echo $post->comment;
87
+
88
+ endwhile;endif;
89
+ if( function_exists( 'wp_pagenavi' ) ){
90
+ wp_pagenavi( array( 'query'=>$comments ) );
91
+ }
92
+ wp_reset_postdata();
93
+
94
+
95
+
96
+ //以下functcions.phpに追記
97
+ function custom_posts_fields( $fields ){
98
+ global $wpdb;
99
+ return $fields = "
100
+ {$wpdb->posts}.ID
101
+ ,GROUP_CONCAT(
102
+ {$wpdb->postmeta}.meta_value
103
+ ORDER BY {$wpdb->postmeta}.meta_key DESC
104
+ SEPARATOR '@@'
105
+ ) AS comment
106
+ ";
107
+ }
108
+
109
+ function custom_posts_join( $join ){
110
+ global $wpdb;
111
+ return $join = " INNER JOIN {$wpdb->postmeta} ON {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id ";
112
+ }
113
+
114
+ function custom_posts_where( $where ){
115
+ global $wpdb;
116
+ return $where .= "
117
+ AND (
118
+ {$wpdb->postmeta}.meta_key like 'shop_voice_%_ttl'
119
+ OR
120
+ {$wpdb->postmeta}.meta_key like 'shop_voice_%_comment'
121
+ OR
122
+ {$wpdb->postmeta}.meta_key like 'shop_voice_%_img'
123
+ ) ";
124
+
125
+ }
126
+
127
+ function custom_groupby( $groupby ){
128
+ global $wpdb;
129
+ return $groupby = "
130
+ {$wpdb->posts}.ID
131
+ ,SUBSTRING( {$wpdb->postmeta}.meta_key, 1, LOCATE( '_', {$wpdb->postmeta}.meta_key, 12 ) )";
132
+ }
59
133
  ```

3

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

2019/07/30 05:09

投稿

yukikp
yukikp

スコア797

answer CHANGED
@@ -8,9 +8,12 @@
8
8
  それと**このコードの弱点は、SUBSTRING( PM.meta_key, 1, 13)です。**(ほかにもあると思いますが)
9
9
  GROUP BYでこれを使う事で、繰り返しフィールド内で「同じ繰り返しに属する」タイトル、コメント、画像のデータを集めてますが、一つの投稿に対し、繰り返し数が3桁を超えると、例えば、**123回目の繰り返し(shop_voice_12)と12回目の繰り返し(shop_voice_12)が同じになり、区別つきません。**
10
10
 
11
+ そこで、LOCATE( 検索文字列, 検索対象文字列, 数値 )を使う事に変更。
11
12
 
12
13
  ```PHP
13
14
  //SUBSTRING( PM.meta_key, 1, 12) => SUBSTRING( PM.meta_key, 1, 13)に変更しました
15
+ //さらに、SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )とすることで、_が'shop_voice_'以降に出てくる文字位置を調べて、そこまで切り取るように変更
16
+
14
17
  global $wpdb;
15
18
 
16
19
  $results = $wpdb->get_results("
@@ -36,7 +39,7 @@
36
39
  )
37
40
  GROUP BY
38
41
  P.ID
39
- ,SUBSTRING( PM.meta_key, 1, 13)
42
+ ,SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )
40
43
  ");
41
44
 
42
45
 

2

修正とコメント

2019/07/30 03:13

投稿

yukikp
yukikp

スコア797

answer CHANGED
@@ -5,8 +5,12 @@
5
5
  「簡易」としたのは、本来ならば、ACFでは、それぞれのカスタムフィールドの名前とfieldkeyというのが対になって作成され、同じ名前のカスタムフィールドのでも別々に扱う事ができるようになっているからです。
6
6
  そこをこのコードでは無視しています。
7
7
 
8
+ それと**このコードの弱点は、SUBSTRING( PM.meta_key, 1, 13)です。**(ほかにもあると思いますが)
9
+ GROUP BYでこれを使う事で、繰り返しフィールド内で「同じ繰り返しに属する」タイトル、コメント、画像のデータを集めてますが、一つの投稿に対し、繰り返し数が3桁を超えると、例えば、**123回目の繰り返し(shop_voice_12)と12回目の繰り返し(shop_voice_12)が同じになり、区別つきません。**
8
10
 
11
+
9
12
  ```PHP
13
+ //SUBSTRING( PM.meta_key, 1, 12) => SUBSTRING( PM.meta_key, 1, 13)に変更しました
10
14
  global $wpdb;
11
15
 
12
16
  $results = $wpdb->get_results("
@@ -32,7 +36,7 @@
32
36
  )
33
37
  GROUP BY
34
38
  P.ID
35
- ,SUBSTRING( PM.meta_key, 1, 12)
39
+ ,SUBSTRING( PM.meta_key, 1, 13)
36
40
  ");
37
41
 
38
42
 

1

$r->commentの修正

2019/07/30 03:02

投稿

yukikp
yukikp

スコア797

answer CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  $all_comments = [];
40
40
  foreach( $results as $r ){
41
- $all_comments[] = [$r->comment];
41
+ $all_comments[] = $r->comment;
42
42
  }
43
43
 
44
44
  shuffle( $all_comments );