「WP Customer Reviews」の平均評価を好きな場所に表示できるようにしてみた

2019年1月25日

この記事の評価: 4.2(26件のレビュー)

簡単にレビュー機能を追加できるプラグイン「WP Customer Reviews」。
日本語化はされていませんが、レビュープラグインとしてはかなり使いやすいほうかと。

ただ残念なことに平均評価を好きなところに表示することができない。

どこに表示されるかと言うと、コンテンツの下の位置。

んー、商品のレビューページとかだと、平均評価は上部に表示したいところ。
商品名(タイトル)のすぐ下が理想的かなぁと。

なのでなんとかして表示位置を変更したい。
しかし「WP Customer Reviews」の設定画面を見てもそんなものはない。

有料のPro版を購入すればできるような気もするけど、ぶっちゃけ英語の公式サイトを読んでもさっぱり理解できず、可能かどうか分からなかったw
WP Customer Reviews公式サイト

購入して実装出来なかったらショックなのでPro版は見送り、自力でなんとかすることにしました。

「WP Customer Reviews」で使われるデータベースを調べよう

レビュー内容はどこかのデータベースに格納されているはずなので、そこから抽出して平均に出力すればOKなはず。

まずはデータベースを漁ってみた。

「WP Customer Reviews」のデータが保存されているのは次の2つのテーブル。

  • wp_posts
  • wp_postmeta

レビューがひとつ投稿されるごとにwp_postsには1レコード追加されます

wp_postsのデータのいくつかを簡単に説明します。

ID
連番のID。記事のIDと被らないように自動で振られる。
post_title
レビューの投稿者+投稿日時が格納される。
post_content
レビューの内容
post_type
wpcr3_reviewが格納される

つまりpost_typeが”wpcr3_review”のものを抽出すればレビューを表示できそうだ。

ところが評価値や、どの記事に対してのレビューなのかを指定する値が見当たらない。

どうやらwp_postmetaに保存されているようです。

レビューがひとつ投稿されるごとにwp_postmetaには複数レコードが追加されます。

meta_id
ユニークなID
post_id
wp_postsのpost_idに紐づく
meta_key
レビューに関するいくつかのキー
meta_value
キーに対する値

レビューの入力項目を増やすとmeta_keyも増えていく。

先程のPOST_ID=581に対するレビューの本文以外の項目がwp_postsmetaに格納される。

wpcr3_review_postの値がレビューを投稿した元記事のID。
wpcr3_review_ratingが評価値となります。

どうやら平均評価値を抽出するならwp_postsmetaの方だけ見ればようさそうです。

平均評価を抽出するSQL

仮に記事のIDが999のレビュー平均値を調べたいとした場合。

まず
meta_key = ‘wpcr3_review_post’
かつ
meta_value = 999

post_id
を取得。
記事999に対してのレビューのIDだけ取得できます。

SQLにすると

1
SELECT post_id FROM wp_postmeta WHERE meta_value=999 and meta_key='wpcr3_review_post'

次に
post_id = 先程取得したpost_id
が含まれて、かつ
meta_key = ‘wpcr3_review_rating’

meta_value
を取得。
記事999に対してのレビューのIDの評価値を取得できます。

SQLにすると

1
SELECT meta_value FROM wp_postmeta WHERE post_id IN (SELECT post_id FROM wp_postmeta WHERE meta_value=999 AND meta_key='wpcr3_review_post') AND meta_key='wpcr3_review_rating'

これをAVGで平均値にして、さらにroundで小数点第一で四捨五入するようにします。

同様に総レビュー数も取得。
あとわかりやすく名前をつけておきます。

最終的にSQLはこんな感じになります。

1
SELECT round(AVG(meta_value),1) AS review_avg,count(meta_value) AS review_cnt FROM wp_postmeta WHERE post_id IN (SELECT post_id FROM wp_postmeta WHERE meta_value=999 AND meta_key='wpcr3_review_post') AND meta_key='wpcr3_review_rating'

「WP Customer Reviews」の平均評価をWPに表示するコード

最後にWPのテンプレートを弄ってレビューの平均評価を出力しましょう。

下記コードをループ内に貼り付ければとりあえず平均評価値とレビュー数を表示できます。

1
2
3
4
5
6
7
8
9
<?php
$review_query="SELECT round(AVG(meta_value),1) AS review_avg,count(meta_value) AS review_cnt FROM $wpdb->postmeta WHERE post_id IN (SELECT post_id FROM $wpdb->postmeta WHERE meta_value=". get_the_ID() ." and meta_key='wpcr3_review_post') AND meta_key='wpcr3_review_rating'";
  
$myreview = $wpdb->get_row($review_query);
  
echo '平均評価:' .$myreview->review_avg;
echo ' - ';
echo '投票数:' .$myreview->review_cnt;
?>

出力結果

平均評価:4.2 - 投票数:26

ループ内ならばカテゴリーアーカイブページでも使えます。

function.phpに書いてショートコードで呼び出す方法もありますが、毎回決まりきった場所に入れることになると思うので、レビュー用のテンプレファイルに直接書き込んで良いと思います。

当然ながら「WP Customer Reviews」プラグインをインストールしていないとエラーになります。

平均評価をさらに丸めて整数値にして、画像ファイル名と紐付ければ★で平均評価を表すこともできますね!

こんな感じ↓

1
<img src="http://hogehoge.com/images/review_star_<?php echo round($myreview->review_avg); ?>.png">

とりあえずはこれで見栄えが良くなるはず!

ショートコードでレビュー平均評価を表示する場合

コピペでこのブログと同じ用に表示したい場合にどうぞ!!

1.画像をアップロード

下記の画像を
★ドメイン名★/wp-content/images/
にアップロード。

 
 

2.function.phpに下記を追記

1
2
3
4
5
6
7
8
9
function fc_reviewrate_output($atts){
    global $wpdb;
$review_query="SELECT round(AVG(meta_value),1) AS review_avg,count(meta_value) AS review_cnt FROM $wpdb->postmeta WHERE post_id IN (SELECT post_id FROM $wpdb->postmeta WHERE meta_value=". get_the_ID() ." and meta_key='wpcr3_review_post') AND meta_key='wpcr3_review_rating'";
   
$myreview = $wpdb->get_row($review_query);
 return '<p class="reviewrate_output">評価:<img src="★ドメイン名★/wp-content/images/rate_star'. round($myreview->review_avg).'.png"> <span style="color: red;">' .$myreview->review_avg. '</span>(' .$myreview->review_cnt .'件のレビュー)</p>';
}
  
add_shortcode('sc_reviewrate_output', 'fc_reviewrate_output');

★ドメイン名★は自分のものに書き換えてください。
画像のアップロード先を変更した場合はドメイン以下のパスも変更。
 
 

3.style.cssに下記を追加

1
2
3
4
5
6
7
.reviewrate_output{
    font-size: 20px;border: 1px solid #CCC; padding: 10px; border-radius: 5px;
}
 
.reviewrate_output img{
    margin-top:-5px;
}

まぁ、CSSは好みに書き換えてください。
 
 

4.ショートコード貼り付け

レビュー平均評価を表示したい箇所に下記のショートコードを貼り付け。
[sc_reviewrate_output]

括弧は半角に変更してください。

↓レビューの投稿テストはご自由にどうぞ(^o^)

【追記】
なんかもっといい感じのレビューいただけると嬉しいです(´;ω;`)

26件のレビューがあります

平均評価:
 (4.153846153846154)
勝手に表示されて困ってます
いっちー

文字を入力した場所すべてにレビュー表示されてしまっています。

なので、ショートコードで非表示にしても非表示コードの下に表示されるといった状況なので困っています。。

test
のぶ

さすがです。

11
111

111

参考になりました。
てすと

こうなるんですね。

てすと
てすと

なるほど。

teste
test

teste

ああ
ああ

テスト

投稿フォームの
テス

評価の星の画像をもっと大きなものにしたいor別の画像orCSSで表現したいのですが、難易度高いでしょうか?

ありがとう
とき

アマ○ンみたいなことやりたかったので、平均値の出し方に困ってました。
こちらの方法を参考にDBのぞいて頑張ってみます。

違うプラグインでは
m

Comment Rating Field Pluginでもやり方は同じですか?

ああああああああ
すすすs

これはてすとてすとてすと

テスト1
テスト1

テスト1

テストです
テスト

ああ

アウアウ

テスト
太郎

参考に鳴尾

あああ
テスト

参考になりました!

にしの

すごー

すごい

どれどれ
てsてs

てst

わにだよ
わに

わにー!

質問なのですが
tama

タイトル付近に平均レビューを出したいと思って探しに探してここにたどり着きました。
ですが、PHPの知識がないのでもう少し素人にもわかるように説明をお願いしたいです。

・子テーマのsingle.phpのタイトル付近にコードを貼り付けたら nonce_failure と出ました。
・レビュー用のテンプレファイルとはどれのことでしょう?
という疑問があるので、どこにどのように貼り付けたら使えるようになるのでしょうか?
あと、下のコメントの方に送信しようとしたらエラーになりました。

st
てs

ppppppppppppppppppppp

ズビシュ
ズビシュ

((^ω^ ≡ ^ω^))キョロキョロ

((^ω^ ≡ ^ω^))キョロキョロ

((^ω^≡^ω<ギャアアアアアアア

てすとだお
てすと

このプラグインはすごいお\(^o^)/

(*^^*)
(^q^)

😀

レビューを投稿しよう\(^o^)/
1
2
3
4
5
投稿する
     
Cancel

Create your own review