質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

WPループ内のフックでmb_strlenをした箇所に不自然な動作

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 142

pineappleman

score 26

概要

WordPressで、ユーザーが投稿したpostデータをイジっています。
その中でレビュー評価をつける機能があり、特定の商品に対するレビューを集計して出力したいのですがうまくいきません。

やりたいこと

1つの商品につき
(5段階評価の合計値)/(投稿数)
の計算を行い、総合評価値を「★★★★★」で出力したい。

その出力はsingle.postページでは問題なくクリア。
archiveページ(商品一覧)でWordPressループ内に入れたアクションフックで一部のエラーがでてしまうのを治したい。

問題点

アクションフックは機能しているのだが、たまに「★★★★★」の代わりに「8」など数字が出力される。
これは$post->page_titleの文字数であることが判明。
しかしエラーは出ておらず、明確な原因がわかりません。
推測ですが mb_strlen がうまく作動していないと考え、以下に該当部分のコードを掲載します。

global $wpdb;

$numposts = $wpdb->get_var(
  "SELECT count(*)
   FROM $wpdb->posts
    INNER JOIN $wpdb->postmeta pm
    ON ($wpdb->posts.id = pm.post_id)
    WHERE $wpdb->posts.post_status = 'publish'
    AND $wpdb->posts.post_type = 'post_type'
    AND pm.meta_key = '_keyname'
    AND pm.meta_value
    LIKE \"{$posttitleを代入した変数}%\"
    ");
  $numposts = number_format($numposts);

if (0 < $numposts)
{
  global $wpdb;
  $rtn = $wpdb->get_results("
    SELECT id 
    FROM $wpdb->posts 
    INNER JOIN $wpdb->postmeta pm 
    ON ($wpdb->posts.id = pm.post_id) 
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type = 'post_type' 
    AND pm.meta_key = '_keyname' 
    AND pm.meta_value 
    LIKE \"{$posttitleを代入した変数}%\" 
    ");

  foreach ($rtn as $value) {
    $variable[] = $wpdb->get_row($wpdb->prepare("
      SELECT meta_value
      from $wpdb->postmeta
      where meta_key = '_keyname'
      AND post_id = %d", $value->id) );
  }
  if(count($variable) > 0){
      foreach ($variable as $value) {
          $variable_work = $value->meta_value;
      }
      $staravg = round(mb_strlen($variable_work)/$numposts);
      //現状のエラー、たまに☆がタイトルの文字数になる
      if ($staravg == 0) $staravg = '';
      if ($staravg == 1) $staravg = '★';
      if ($staravg == 2) $staravg = '★★';
      if ($staravg == 3) $staravg = '★★★';
      if ($staravg == 4) $staravg = '★★★★';
      if ($staravg == 5) $staravg = '★★★★★';
      return $staravg;
  }
}
else
{
  $numposts = 0;
  $staravg = '';
}

回答頂きたいこと

上記のコードになにか間違った記述はございませんでしょうか。
ご教示頂けますと大変助かります。

追記

  • 投稿数で割る処理をしているため、評価値$staravg が5を超えることはありません。
  • $numpostsの処理を追記しました。
  • foreach ($variable as $value) のループで、$variable_work = $value->meta_value; が前任者作成部分でして、ワタシも完全に理解しておらず...
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2019/12/23 20:25

    そのコードを示されて、そうですかと第三者が簡単に試せないということを念頭に、そもそも $staravg が5を超えてしまうことがNGなのか、それとも5を超えてしまうことがOKでその場合の回避方法を知りたいのか、どちらだろうか。また、 foreach ($variable as $value) のループで、 $variable_work = $value->meta_value; をただ繰り返しているけど、最後の $value->meta_value で単に上書きするのって想定する仕様なのかどうなのか。 $numposts をどこで定義しているかも不明だし、設計が見えてこない。

    キャンセル

  • pineappleman

    2019/12/23 20:30

    コメント誠にありがとうございます!追記修正をしてみます。

    キャンセル

回答 1

checkベストアンサー

0

      $staravg = round(mb_strlen($variable_work)/$numposts);
//現状のエラー、たまに☆がタイトルの文字数になる
if ($staravg == 0) $staravg = '';
if ($staravg == 1) $staravg = '★';
if ($staravg == 2) $staravg = '★★';
if ($staravg == 3) $staravg = '★★★';
if ($staravg == 4) $staravg = '★★★★';
if ($staravg == 5) $staravg = '★★★★★';
return $staravg;

0 から 5 以外の場合は、round(mb_strlen($variable_work)/$numposts); の値をそのまま返す感じですね。
0 から 5 以外の際に $staravg にエラーなどを返すようにすればどうなりますか?


(追記)

どのように書くとエラーが返せるのかわかりません。。

エラーをかえすのもなんですから、範囲外は、 ★ 0個( つまり '' ) とするなら、こんな感じでしょうか。

現状の 0 で判断していた部分の条件を「1 以下または5以上」に広げた形です。

      if ($staravg < 1 or $staravg > 5 ) $staravg = '';
      if ($staravg == 1) $staravg = '★';
      if ($staravg == 2) $staravg = '★★';
      if ($staravg == 3) $staravg = '★★★';
      if ($staravg == 4) $staravg = '★★★★';
      if ($staravg == 5) $staravg = '★★★★★';

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/24 21:07

    すみません...
    どのように書くとエラーが返せるのかわかりません。。
    ご教示いただけませんでしょうか。。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる