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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

WordPress

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

Q&A

解決済

1回答

312閲覧

既存のプラグインを使わずにランキングを表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

WordPress

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

0グッド

0クリップ

投稿2017/08/09 21:21

いつもお世話になっております。WordPress初心者でございます。
下記サイトを参考にランキングを自作で作成しておりましたが、別方法で作成することになり、その別方法だとうまくランキングが機能せず困っております。
http://11neko.com/wordpress-tips/

DBに閲覧数を保持する専用のテーブルを作成し、ランキング機能のコードを書いていますが、その専用のテーブルの中身が空の状態のようで、phpMyAdminで確認しますと「返り値が空でした」とメッセージが出ています。
まず、該当のソースコードを確認していただけたら分かるかと思いますが、どのような意味なのかがまず理解できておりません…。
どこの部分を修正したらいいのか分からないので行き詰まっております…。

説明不足な点もあるかと思います。
お力添えいただければ幸いです。

###該当のソースコード

function log($post_id){ global $wpdb; $tname = self::table(); $post = $wpdb->query($wpdb->prepare("select ID from {$wpdb->posts} where ID=%d and post_status='publish'", array($post_id))); if($post){ $data = array( "post_id" => $post_id, "at" => time(), "ip_addr" => htmlspecialchars($_SERVER["REMOTE_ADDR"]) ); $wpdb->insert($tname, $data); } if(mt_rand(0, 1000) === 0){ self::delete_old_logs(); } } function ranking($days=30,$d=5,$post_type="post"){ global $wpdb; $tname = self::table(); $lower_limit = time() - 60 * 60 * 24 * $days; $sql = "select {$tname}.post_id from {$tname} " . "join {$wpdb->posts} on {$tname}.post_id = {$wpdb->posts}.ID " . "where at > {$lower_limit} and {$wpdb->posts}.post_status = 'publish' and {$wpdb->posts}.post_type = '{$post_type}' " . "group by {$tname}.post_id order by count({$tname}.post_id) desc"; $results = $wpdb->get_results($sql); return array_slice(array_map(function($obj){return intval($obj->post_id);}, $results),0,$d); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

その専用のテーブルの中身が空の状態のようで

とのことなので、log関数のinsertに失敗している(もしくは実行されていない)状況だと考えられます。
問題箇所を切り分けるために、以下のようなデバッグを試みて、想定している値が各変数に入っているか、処理が実行されているかを確認してください。

PHP

1 function log($post_id){ 2 global $wpdb; 3 $tname = self::table(); 4 var_dump($post_id); // デバッグ用 5 var_dump($tname); // デバッグ用 6 7 $post = $wpdb->query($wpdb->prepare("select ID from {$wpdb->posts} where ID=%d and post_status='publish'", array($post_id))); 8 var_dump($post); // デバッグ用 9 10 if($post){ 11 $data = array( 12 "post_id" => $post_id, 13 "at" => time(), 14 "ip_addr" => htmlspecialchars($_SERVER["REMOTE_ADDR"]) 15 ); 16 var_dump("INSERT START"); // デバッグ用 17 $wpdb->insert($tname, $data); 18 var_dump($wpdb->insert_id); // デバッグ用 19 } 20 21 if(mt_rand(0, 1000) === 0){ 22 self::delete_old_logs(); 23 } 24 }

投稿2017/08/14 05:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/08/17 12:15

miz様、お返事が遅くなり大変申し訳ございません。 ご回答いただいた通りvar_dumpでデバッグを試みましたが、何も表示されていません…。 念の為にfunction ranking〜にある$lower_limitをデバッグしてみたら問題なく表示できておりました。 これは処理が実行されていないということでしょうか…?
退会済みユーザー

退会済みユーザー

2017/08/17 12:46

log関数の頭でvar_dump('デバッグ'); die();としても「デバッグ」という文字列が表示されて処理が止まらないようであれば、log関数自体が実行されていない可能性が高いです。 log関数はどのように呼び出していますか。
退会済みユーザー

退会済みユーザー

2017/08/17 14:01

log関数は下記のように呼び出しております。 function cb_the_post($query){ global $post; if(is_single()){ self::log($post->ID); } }
退会済みユーザー

退会済みユーザー

2017/08/17 14:33

cb_the_post関数はどこで呼ばれる関数でしょうか。 なんにしろ、まずはlog関数が実行されているか否かを確認してください。
退会済みユーザー

退会済みユーザー

2017/08/18 03:09

function initialize(){ self::add_action("the_post"); } 上記でcb_the_post関数を呼ぶようにしておりましたが、記述ミスがあったようで問題なくランキング表示ができるようになりました。 お手を煩わせてしまい、大変申し訳ございません。 以後気をつけるよう致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問