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

2018年10月18日

この記事の評価: 4.1(7件のレビュー)

簡単にレビュー機能を追加できるプラグイン「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にすると

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にすると

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はこんな感じになります。

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のテンプレートを弄ってレビューの平均評価を出力しましょう。

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

<?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.1 - 投票数:7

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

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

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

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

こんな感じ↓

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

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

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

Average rating:  
 7 reviews
by on わだなつ

by わに on わだなつ
わにだよ

わにー!

by tama on わだなつ
質問なのですが

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

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

by てs on わだなつ
st

ppppppppppppppppppppp

by ズビシュ on わだなつ
ズビシュ

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

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

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

by てすと on わだなつ
てすとだお

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

by (^q^) on わだなつ
(*^^*)

😀

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

Create your own review

wordpress

Posted by wadanatu