タイトルの自動生成をやろうと思った時に、
意図通りに処理が動かず、困っていた時にとても重宝したのが「var_dump」のファイル出力でした。
「var_dump」は変数の情報を画面(ブラウザ)に表示させる機能ですが、
今回は記事投稿時のモジュールやアクションに対してフックさせる処理のデバッグなので
「var_dump」をそのまま使用は難しかったのです。
なので、画面に表示させるのではなく、テキストに出力したらとても便利でしたのでご紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// 指定したデータのダンプをファイルに出力する function fdump($var){ // 画面に出力する情報を、バッファに保存させるための命令 ob_start(); // $varのダンプを出力 // ※ob_start()後なので、出力したい情報はバッファに保存される var_dump( $var ); // バッファに保存された値を取得する $dmp_data = ob_get_contents(); // ob_start()の命令ストップ ob_end_clean(); // 出力するファイルを開く $fp = fopen("./dump.txt", "a+" ); // ファイルに出力 fputs( $fp, $dmp_data ); // ファイルを閉じる fclose( $fp ); } |
処理は単純で、コレでOKです。
ファイルはどこに出力される?
ファイルに出力するようにしたのはいいのですが、最初どこに出力された!?
ってなりました(笑)
探してみたら「/public_html/wp-admin」の直下に作成されてました。
何となく「wp-admin」に出力したくなかったので、ちょっと出力先を変更。
1 |
$fp = fopen("/home/~略~/public_html/wp-content/themes/stinger8/dump.txt", "a+" ); |
私は、作業中は基本的に「/wp-content/themes/stinger8/」ここを開いているので
そこを出力先に設定。
あ、ごらんのとおり、テーマはstinger8使わせて頂いてます(笑)
使用してみる
タイトルの自動生成の際に起きていたのが、「global $post」の$post->post_typeを見ようとしたときにエラーが出ていました。
その際に原因を調べた時のことを例にして試してみます。
1 2 3 4 5 6 7 8 9 |
function auto_review_title($title) { global $post; // $postのダンプをファイルに出力 fdump( $post ); return $title; } add_filter('title_save_pre', 'auto_review_title'); |
とりあえず、タイトル生成の処理とか抜きで「$post」に何が入っているのかを見るために、
先ほど作成した関数「fdump()」に「$post」を渡してみます。
そして「新規追加」を押してみたところ、
その時点でdump.txtが生成されました。
中身を覗いてみると
1 |
NULL |
「NULL」が入っています。
この時点で、まず分かったことが。
「title_save_pre」は「新規追加」を押した時点でも呼ばれるんですね。
そして、このタイミングで「$post」の値はNULL。
1 |
if( $post->post_type == 'review' ){ |
これだと、確かに↑の「$post->post_type」はエラーになりますね。
エラーの原因が分かってちょっとスッキリしました。
次に、公開ボタンを押したタイミングではどうなるか試してみます。
公開ボタンを押して「dump.txt」を開いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
object(WP_Post)#7414 (24) { ["ID"]=> int(581) ["post_author"]=> string(1) "1" ["post_date"]=> string(19) "2017-10-27 01:13:08" ["post_date_gmt"]=> string(19) "0000-00-00 00:00:00" ["post_content"]=> string(0) "" ["post_title"]=> string(15) "自動下書き" ["post_excerpt"]=> string(0) "" ["post_status"]=> string(10) "auto-draft" ["comment_status"]=> string(6) "closed" ["ping_status"]=> string(6) "closed" ["post_password"]=> string(0) "" ["post_name"]=> string(0) "" ["to_ping"]=> string(0) "" ["pinged"]=> string(0) "" ["post_modified"]=> string(19) "2017-10-27 01:13:08" ["post_modified_gmt"]=> string(19) "0000-00-00 00:00:00" ["post_content_filtered"]=> string(0) "" ["post_parent"]=> int(0) ["guid"]=> string(44) "https://pachihyo.com/?post_type=review&p=581" ["menu_order"]=> int(0) ["post_type"]=> string(6) "review" ["post_mime_type"]=> string(0) "" ["comment_count"]=> string(1) "0" ["filter"]=> string(3) "raw" } |
ちゃんと「$post」には情報が入ってますね!!
という具合で、fdumpを使用して色々調べながら作業を行いました♪
最後に
すみません。
なんだか、散らかった記事になってしまいました(笑)
PHPってフックをかまして処理を走らせることが多くて、
それらのデバッグ表示を全て画面(ブラウザ)に表示させて行うのは困難だと思います。
ですので、今回作った「fdump()」みたいなのを用意しておくと、
WordPressにおけるPHP開発のは捗るのではないでしょうか。
ということでまとめとさせていただきます。