回答編集履歴
7
ほげほげ
answer
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
「簡易」としたのは、本来ならば、ACFでは、それぞれのカスタムフィールドの名前とfieldkeyというのが対になって作成され、同じ名前のカスタムフィールドのでも別々に扱う事ができるようになっているからです。
|
6
6
|
そこをこのコードでは無視しています。
|
7
7
|
|
8
|
-
※大人しく、
|
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
最終版かな?
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
|
-
|
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
|
-
|
10
|
+
GROUP_CONCAT(
|
26
|
-
|
11
|
+
{$wpdb->postmeta}.meta_value
|
27
|
-
ORDER BY
|
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でタイトルが取得できるように修正。
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
ページネーション使えるようなパターンを追記
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を使って、より一般化してみました。
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,
|
42
|
+
,SUBSTRING( PM.meta_key, 1, LOCATE( '_', PM.meta_key, 12 ) )
|
40
43
|
");
|
41
44
|
|
42
45
|
|
2
修正とコメント
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,
|
39
|
+
,SUBSTRING( PM.meta_key, 1, 13)
|
36
40
|
");
|
37
41
|
|
38
42
|
|
1
$r->commentの修正
answer
CHANGED
@@ -38,7 +38,7 @@
|
|
38
38
|
|
39
39
|
$all_comments = [];
|
40
40
|
foreach( $results as $r ){
|
41
|
-
$all_comments[] =
|
41
|
+
$all_comments[] = $r->comment;
|
42
42
|
}
|
43
43
|
|
44
44
|
shuffle( $all_comments );
|