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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

解決済

1回答

4905閲覧

ログインユーザーの「いいね!」数を表示させる方法はありませんか? (WordPress)

unininaritai

総合スコア46

WordPress

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

PHP

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

0グッド

0クリップ

投稿2018/08/03 01:08

編集2018/08/03 01:09

ログインユーザーの「いいね!」数を表示させる方法はありませんか?

下記の<span id="like">●</span>に表示したいです。

html

1<?php if (is_user_logged_in()): ?> 2 <p>あなたは<span id="like"></span>件いいねされてます。</p> 3<?php endif; ?>

「WP ULike」というプラグインで下図のようにユーザー別で集計できているはずなので、$userid = get_current_user_id();などでログインユーザーのIDを取得してからプラグインのデータと合わせれば?と思うのですが、英語圏も含めて検索したものの方法が全く見つからず質問させて頂きました。

下図のように集計データはあるはずです。
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

出先なので簡潔に... ヒントだけです。

<p>あなたは<span id="like">●</span>件いいねされてます。</p>

と書いていますが、Top Likers で表示されているのは、Like した数です。
ちなみにログインしていない状態のユーザが、「いいね」すると Guest User と表示されます。

検索して見つからない場合は、ソースコードを読むのが早いです。

ソースコードをよむと class-wp-ulike-stats.phpget_top_likers() の部分で集計していますので、この関数を呼び出して、$results を取得・参照することになると思います。


WP ULike プラグインが、インストールされていたら、

PHP

1require WP_PLUGIN_DIR . "/wp-ulike/admin/classes/class-wp-ulike-stats.php"; 2$my_ulike_stats = new wp_ulike_stats(); 3$likers = $my_ulike_stats->get_top_likers();

で、 配列 $likers に 以下のようなデータが入ります。

PHP

1array ( 2 0 => 3 stdClass::__set_state(array( 4 'user_id' => '1', 5 'SumUser' => '2', 6 'ip' => '192.168.1.100', 7 )), 8 1 => 9 stdClass::__set_state(array( 10 'user_id' => '2', 11 'SumUser' => '5', 12 'ip' => '192.168.1.101', 13 )), 14 2 => 15 stdClass::__set_state(array( 16 'user_id' => '1037204866', 17 'SumUser' => '1', 18 'ip' => '192.168.1.102', 19 )), 20)

この配列からデータを取り出すのは、foreach を使って、

PHP

1foreach ( $likers as $liker ) { 2 echo "<p>ユーザー ID : ". $liker->user_id ."は、". $liker->SumUser ."件いいねしています。</p>"; 3}

のようにすると順番に表示されます。

特定のユーザーのみ表示したいのであれば、foreach の中で、 if で条件判断して条件に一致する場合のみ表示するようにします。

PHP

1foreach ( $likers as $liker ) { 2 if ( ユーザーID == $liker->user_id ){ 3 echo "<p>ユーザー ID : ". $liker->user_id ."は、". $liker->SumUser ."件いいねしています。</p>"; 4 } 5}

ユーザーID の部分は、WordPress のユーザーID(数字です) で置き換えてください。 ユーザーID は、1 が WordPress をインストールした際の初期Admin です。
ユーザーID は、ユーザーID の編集画面の URL 等で使われていますので、確認可能です。 ( 例: http://example.com/wp-admin/user-edit.php?user_id=3&wp_http_referer=%2Fwp-admin%2Fusers.php )


(追記 2018/08/04 14:16 / 修正 2018/08/06 11:00)

つらつらと眺めていて、postmeta に '_liked' が、追加されていたことに気がついたので、posts と postmeta のデータベースだけで集計できそうです。

global $wpdb; $likers = $wpdb->get_results( " SELECT p.post_author AS user_id, m.meta_value AS SumUser FROM $wpdb->posts AS p, $wpdb->postmeta AS m WHERE p.ID = m.post_ID AND p.post_status = 'publish' AND m.meta_key = '_liked' GROUP BY p.post_author " );

(2018-08-06 11:30 追記)

テスト環境に新しく WordPress をインストールして、試してみました。テンプレートは、twentyfifteen です。
下記の通り、こちらでは、問題なく表示されます。

page-test1.php を下記の内容で作る。

PHP

1<?php 2/** 3* Template Name: page-test1 4* 5*/ 6get_header(); ?> 7 8<div id="primary" class="content-area"> 9<main id="main" class="site-main" role="main"> 10<div id="cherrysan"> 11<?php 12 13global $wpdb; 14$likers = $wpdb->get_results( " 15 SELECT p.post_author AS user_id, m.meta_value AS SumUser 16 FROM $wpdb->posts AS p, $wpdb->postmeta AS m 17 WHERE p.ID = m.post_ID 18 AND p.post_status = 'publish' 19 AND m.meta_key = '_liked' 20 GROUP BY p.post_author 21" ); 22 23foreach ( $likers as $liker ) { 24 if ( 1 == $liker->user_id ){ 25 echo "<p>ユーザー ID : ". $liker->user_id ."は、". $liker->SumUser ."件いいねされています。</p>"; 26 } 27} 28 29?> 30</div> 31</main><!-- .site-main --> 32</div><!-- .content-area --> 33<?php get_footer(); ?>

固定ページの編集画面で、個別テンプレートを選んで固定ページを作成。
個別テンプレートを選ぶ

固定ページを保存・公開して、表示する
イメージ説明


page-test1.php の $likers = $wpdb->get_results( .... ); の行を下記のようにすれば、今月分(1日〜月末)が集計できます。

PHP

1$likers = $wpdb->get_results( " 2 SELECT P.post_author AS user_id, SUM(T.CountUser) AS SumUser 3 FROM $wpdb->posts AS P, ( 4 SELECT user_id, count(user_id) AS CountUser, post_id as post_id 5 FROM `".$wpdb->prefix."ulike` 6 WHERE DATE_FORMAT(date_time, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') 7 GROUP BY user_id, post_id 8 UNION ALL 9 SELECT user_id, count(user_id) AS CountUser, activity_id as post_id 10 FROM `".$wpdb->prefix."ulike_activities` 11 WHERE DATE_FORMAT(date_time, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') 12 GROUP BY user_id, activity_id 13 UNION ALL 14 SELECT user_id, count(user_id) AS CountUser, comment_id as post_id 15 FROM `".$wpdb->prefix."ulike_comments` 16 WHERE DATE_FORMAT(date_time, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') 17 GROUP BY user_id, comment_id 18 UNION ALL 19 SELECT user_id, count(user_id) AS CountUser, topic_id as post_id 20 FROM `".$wpdb->prefix."ulike_forums` 21 WHERE DATE_FORMAT(date_time, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') 22 GROUP BY user_id, topic_id 23 ) AS T 24 WHERE P.ID = T.post_id 25 GROUP BY P.post_author; 26" );

(2018-08-08 18:55追記)
コメント欄では、インデントがつかないので、こちらにも書いておきます。

$sumuser = 0; foreach ( $likers as $liker ) { if ( $UID == $liker->user_id ){ $sumuser = $liker->SumUser; } } echo $sumuser;

投稿2018/08/03 01:45

編集2018/08/08 10:00
CHERRY

総合スコア25171

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

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

unininaritai

2018/08/03 10:02

>Top Likers で表示されているのは、Like した数です。 失礼致しました。そのようでした。 >ソースコードを読むのが早いです。 >この関数を呼び出して、$results を取得・参照する ソースコードを読んでできるレベルではないので質問させて頂いたのですが、ヒントでも感謝致します。お帰りになって一休みしたらぜひ続きを…
unininaritai

2018/08/04 03:18

お世話になっております。 このような感じではございませんでしょうか? <?php $query = ' SELECT (SELECT COUNT(*) AS cnt FROM `%1$sulike` WHERE user_id = %2$d) + (SELECT COUNT(*) AS cnt FROM `%1$sulike_activities` WHERE user_id = %2$d) + (SELECT COUNT(*) AS cnt FROM `%1$sulike_comments` WHERE user_id = %2$d) '; $result = (int)$this->wpbd->get_var(sprintf( $query, $this->wpdb->prefix, get_current_user_id() )); ?> …ったく歯が立ちません。
CHERRY

2018/08/04 03:44

テンプレートのどこで使われるかわからなかったので、汎用的な感じで、とりあえず書いてみました。
unininaritai

2018/08/04 03:53

ありがとうございます!たしかに「した数」を表示することができました。 >で、 配列 $likers に 以下のようなデータが入ります。 ということは、「__set_state」には「ID」「した数」「IP」しか入っておらず、やはり「された数」は入っていないから表示させることは出来なそうでしょうか?
CHERRY

2018/08/04 04:13

いいねされた数をユーザー別に集計することが、「可能」か「不可能」かという話であれば、可能です。 データベース上に集計されたデータはないので、「WP ULike」のデータと WordPress の投稿データを結合して、毎回集計することになります。
unininaritai

2018/08/04 04:18

ありがとうございます。難易度が高そうですね。クラウドワークスなどで依頼を出すとしたら相場はいかほどが妥当だと思われますか?始めての経験で全く相場観がないので、よろしければ主観で構いませんのでお聞かせいただけませんでしょうか?
unininaritai

2018/08/06 01:32

遅くなりまして申し訳ございません。 また、「追記 2018/08/04 14:16」について、お心遣い誠にありがとうございます。 ただ、下記のようにするのだと仰っているのかと存じますが、残念ながら<p>の文章さえ出力されない状況でした。 素人が手を出すべきものではなかったかもしれませんね。反省です。 global $wpdb; $likers = $wpdb->get_results( " SELECT p.post_author, m.meta_value FROM $wpdb->posts AS p, $wpdb->postmeta AS m WHERE p.ID = m.post_ID AND p.post_status = 'publish' AND m.meta_key = '_liked' GROUP BY p.post_author ORDER BY CAST( m.meta_value AS SIGNED ) DESC " ); foreach ( $likers as $liker ) { if ( 1 == $liker->user_id ){ echo "<p>ユーザー ID : ". $liker->user_id ."は、". $liker->SumUser ."件いいねされています。</p>"; } }
CHERRY

2018/08/06 01:38

テーマファイルに記載されているのだと思いますが、どのファイルのどのあたりに記載されていますか?
unininaritai

2018/08/06 01:48

「twentyfifteen」というテーマに、下記「page-front.php」を作り、「//★」に先述のコード(2018/08/06 10:32)を記載いたしました。 <?php /** * Template Name: page-front * */ get_header(); ?> <div id="primary" class="content-area"> <main id="main" class="site-main" role="main"> <div id="cherrysan"> <?php //★ ?> </div> </main><!-- .site-main --> </div><!-- .content-area --> <?php get_footer(); ?>
CHERRY

2018/08/06 02:06 編集

SQL の項目名が変わっているので、 最初の回答の if 文では条件が成立しません。 if 文が使えるように 回答の SQL を修正しました。
CHERRY

2018/08/06 02:09 編集

値が表示されない場合は、`var_dump($likeds )` のように 変数の中身を出力して確認するようにすると原因を見つけやすいです。 var_dump については、PHPマニュアルの http://php.net/manual/ja/function.var-dump.php 参照。
unininaritai

2018/08/06 02:16

ありがとうございます。「修正 2018/08/06 11:00」に沿ってみたところやはり値は表示されず、「var_dump($likeds)」で確認しますとNULLが表示されました。何回もいいねされてはいるのでデータは入っていると思うのですが…
CHERRY

2018/08/06 02:22 編集

これも プログラム側で使っている変数は、$likers なので、 ` var_dump( $likers ); ` にしてください。
unininaritai

2018/08/06 02:27

失礼いたしました。 array(0) { } の表示でした。 これはデータが空ということですよね? 実際に今いいね押してもこの表示なので、やはり「global $wpdb;」で持ってくる「$likers」のどこかに原因があるのでは…と思います。
CHERRY

2018/08/06 02:44 編集

こちらの環境で、試した内容を追記しました。インストール直後のWordPress 4.9.6 + twentyfifteen の状況です。page-front.php と書かれた内容を page-test1.php にして、試しています。
unininaritai

2018/08/07 05:55 編集

WordPressをリセットして同じようにしたら私も表示され、謎が解けました。 どうやら教えて頂いたコードは【投稿へのいいね】のみカウントするようですね。 実はプラグイン「WP ULike」では「BBpress」という掲示板にも自動で「いいねボタン」を表示してくれまして、今回はその【掲示板におけるいいね】をカウントしたかった意図でした。 その意図を伝えずにいたせいで活かせないコードをCHERRYさんに書かせてしまったようです。大変失礼致しました。
CHERRY

2018/08/07 06:16

あぁ、なるほど... bbPress のトピックだと `_topicliked` ですね。
unininaritai

2018/08/07 06:52

ありがとうございました。解決です。 大変なご迷惑をおかけしてしまったので、心ばかりで恐縮ですがビットコイン1000円分受け取っていただけませんでしょうか?アドレス貼ってくださればすぐにお送り致します。
unininaritai

2018/08/07 08:25

申し訳ございません!こちらなんですが、「今月」と「総計」を別で…出せませんでしょうか……?!!
CHERRY

2018/08/07 08:53

お気遣いありがとうございます。ですが、お気持ちだけで十分です。 「人に教えることで、自分の理解も深まり、自分自身も成長できる。」とよく言われます。もし、誰かに恩返ししたいと思われるようであれば、困っている方の質問で分かるものがあれば回答して、困っている方が成長する手助けと自分自身が理解を深めるきっかけにしていただければと思います。
CHERRY

2018/08/07 08:54

たしか posts や postmeta には、累計しかデータがなかったと思うので、「今月」だけを集計したいとなると ulike テーブルや ulike_forums テーブルから直接集計することになると思います。 ちょっと確認してみますのでお待ち下さい。
unininaritai

2018/08/07 09:06

…かないませんね。本当に頭が下がります。どうもありがとうございます。差し出がましい申し出で失礼致しました。 集計の方はお手すきの折にでもご覧頂けましたら幸いです。
CHERRY

2018/08/07 12:46 編集

試してみたところ、今月分の集計が可能でしたので、追記しました。 SQL の実行部分を差し替えてください。 正直なところ、 function 化した方が、色々な意味で使いやすいだろうなぁと思います。
unininaritai

2018/08/07 22:27

おはようございます! 今月版のコード、ありがとうございます。痛み入ります。 ひとまず【投稿へのいいね】も【掲示板におけるいいね】もカウントされなかったようで、「var_dump($likers);」しますと「array(0) { }」でした。 データベースから引っ張るというのが全く初めてで初歩的な確認さえお手伝いできず申し訳ございません。 またお気づきの点がございましたらいつでも仰ってくださればと思います。
CHERRY

2018/08/07 23:07

SQL の WordPress のプリフィクスを戻すのを忘れていましたので修正しました。
unininaritai

2018/08/08 00:14

どうもありがとうございます。無事表示されました。ベストアンサー決定後にたびたび、たびたび、、お付き合い頂いたこと、心から感謝致します。 function化には自分で取り組んでみたいと思います。ありがとうございました!
unininaritai

2018/08/08 09:10

いいねされていないときに「0」を表示したいと思い、「NULLなら0だよ」と書いてみたのですが、これって一体何が間違っているのでしょうか?? 何っ度も申し訳ございません…。 「empty」や「==null」などいろいろ試したのですがどれも出来なくて。 foreach ( $likers as $liker ) { if ( $UID == $liker->user_id ){ if( is_null($liker) ){ echo '0'; }else{ echo $liker->SumUser; } } }
CHERRY

2018/08/08 09:57

0件の場合、検索結果に user_id は、出ないので、` if ( $UID == $liker->user_id ) `の条件は、成立しません。 そのため、ループに入る前に 0 で初期化しておいて、条件が成立したら値を代入して、最後に echo で、表示する方がいいと思います。 例: $sumuser = 0; foreach ( $likers as $liker ) { if ( $UID == $liker->user_id ){ $sumuser = $liker->SumUser; } } echo $sumuser;
unininaritai

2018/08/08 11:26

難しいですね。0件のときに「var_dump($liker)」をやったら「NULL」と出たので、それなら「if( is_null($liker) )」を書けば「0件の場合」という条件分岐になってくれるつもりでした。が、その手前の条件が成立しなかったのですか。ループ前の初期化テク、覚えておきます。今度こそ、どうもありがとうございました!!
unininaritai

2018/08/13 07:54

すみません。こちらの方にバグを発見してしまいました。 内容を資料にまとめめてみましたのでよろしければらご覧くださいませ。 http://xfs.jp/QiDxy7
unininaritai

2018/08/13 07:56 編集

ダウンロードパスワードをここに書いておりました。メールで編集前のパスワードが届いているかと存じます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問