🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1085閲覧

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

pineappleman

総合スコア26

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/12/23 11:17

編集2019/12/23 11:52

概要

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; が前任者作成部分でして、ワタシも完全に理解しておらず...

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/12/23 11:25

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

2019/12/23 11:30

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

回答1

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/23 11:57

編集2019/12/26 03:06
CHERRY

総合スコア25218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pineappleman

2019/12/24 12:07

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問