概要
WordPressで、ユーザーが投稿したpostデータをイジっています。
その中でレビュー評価をつける機能があり、特定の商品に対するレビューを集計して出力したいのですがうまくいきません。
やりたいこと
1つの商品につき
(5段階評価の合計値)/(投稿数)
の計算を行い、総合評価値を「★★★★★」で出力したい。
その出力はsingle.postページでは問題なくクリア。
archiveページ(商品一覧)でWordPressループ内に入れたアクションフックで一部のエラーがでてしまうのを治したい。
問題点
アクションフックは機能しているのだが、たまに「★★★★★」の代わりに「8」など数字が出力される。
これは$post->page_titleの文字数であることが判明。
しかしエラーは出ておらず、明確な原因がわかりません。
推測ですが mb_strlen がうまく作動していないと考え、以下に該当部分のコードを掲載します。
php
1global $wpdb; 2 3$numposts = $wpdb->get_var( 4 "SELECT count(*) 5 FROM $wpdb->posts 6 INNER JOIN $wpdb->postmeta pm 7 ON ($wpdb->posts.id = pm.post_id) 8 WHERE $wpdb->posts.post_status = 'publish' 9 AND $wpdb->posts.post_type = 'post_type' 10 AND pm.meta_key = '_keyname' 11 AND pm.meta_value 12 LIKE \"{$posttitleを代入した変数}%\" 13 "); 14 $numposts = number_format($numposts); 15 16if (0 < $numposts) 17{ 18 global $wpdb; 19 $rtn = $wpdb->get_results(" 20 SELECT id 21 FROM $wpdb->posts 22 INNER JOIN $wpdb->postmeta pm 23 ON ($wpdb->posts.id = pm.post_id) 24 WHERE $wpdb->posts.post_status = 'publish' 25 AND $wpdb->posts.post_type = 'post_type' 26 AND pm.meta_key = '_keyname' 27 AND pm.meta_value 28 LIKE \"{$posttitleを代入した変数}%\" 29 "); 30 31 foreach ($rtn as $value) { 32 $variable[] = $wpdb->get_row($wpdb->prepare(" 33 SELECT meta_value 34 from $wpdb->postmeta 35 where meta_key = '_keyname' 36 AND post_id = %d", $value->id) ); 37 } 38 if(count($variable) > 0){ 39 foreach ($variable as $value) { 40 $variable_work = $value->meta_value; 41 } 42 $staravg = round(mb_strlen($variable_work)/$numposts); 43 //現状のエラー、たまに☆がタイトルの文字数になる 44 if ($staravg == 0) $staravg = ''; 45 if ($staravg == 1) $staravg = '★'; 46 if ($staravg == 2) $staravg = '★★'; 47 if ($staravg == 3) $staravg = '★★★'; 48 if ($staravg == 4) $staravg = '★★★★'; 49 if ($staravg == 5) $staravg = '★★★★★'; 50 return $staravg; 51 } 52} 53else 54{ 55 $numposts = 0; 56 $staravg = ''; 57}
回答頂きたいこと
上記のコードになにか間違った記述はございませんでしょうか。
ご教示頂けますと大変助かります。
追記
- 投稿数で割る処理をしているため、評価値$staravg が5を超えることはありません。
- $numpostsの処理を追記しました。
- foreach ($variable as $value) のループで、$variable_work = $value->meta_value; が前任者作成部分でして、ワタシも完全に理解しておらず...
回答1件
あなたの回答
tips
プレビュー