回答編集履歴
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 );
         | 
