目次

var_dump でデータ構造確認

今、 WordPress をカスタマイズするために色々と試行錯誤しながら勉強をしているところですが、その時に、 WordPress の関数で取得した変数の中身を確認したいことが多々あり、その都度、 PHP の var_dump 関数を実行して、配列、オブジェクト、または単体の文字列をブラウザに出力してデータ構造を確認しています。ここで、 htmlspecialchars 関数を適用したいことがあるんです。

目次まで戻る

配列、オブジェクトに htmlspecialchars を適用したい

単体の文字列であれば、難なく htmlspecialchars 関数を適用して HTML タグを無効にできるのですが、配列、オブジェクトとなると、難しい再帰処理をしなければならないようなのです。私の場合、変数の配列構造、オブジェクト構造を目で見て確認したいだけなので、いつもは以下のような PHP のコードでやっているのですが、変数の中に HTML タグが含まれている時に、リンクはリンク、画像は画像で表示されてしまい、時に不都合が生じてしまうのです。

例えば、 WordPress の get_post 関数で戻り値を「投稿オブジェクト」で取得して変数に格納。その変数を  var_dump() してみるとします。 820 は当ブログの投稿 ID で、以下のリンクの投稿を取得します。

ブログ公開しました。 – pulogu.net
https://pulogu.net/blog/999-update/blog-publishing/

PHP コード : 

<?php
    echo "<pre>";
var_dump( get_post( 820 , 'OBJECT' ) ); // WordPress の単一投稿を取得する関数です。 echo "</pre>"; ?>

出力結果は、載せませんがスクリーンショットの画像で表示すれば、表示崩れしないんだというこで、下の方に画像で載せてみました。本文に書いてあるリンクがリンクのまま出力され、挿入した画像も画像のまま表示されてしまっています。データの構造を目視で確認したり、配列のキーをコピーするだけのことがほとんどなので、問題ないのですが、やはり、ソースコードの状態で確認したくもあります。いまの段階では、ブラウザで更にソースを表示して見てみなければなりません。

下記の画像の post_content の中身に入っている、 <a href=""></a> のリンクタグと <img src="" /> の画像タグが HTML タグとしての役割を果たしています。

var_dump の出力結果。
var_dump の出力結果。

目次まで戻る

出力制御関数

やはり、 htmlspecialchars() をかけたい。ということで、調べて見た結果、 var_export という PHP の関数もあるようですが、PHP マニュアルの  PHP: var_dump - Manual ページの下の方に例で書いてあった ob_start() , ob_get_clean() 関数を試してみたいと思います。

PHP コード : 

<?php
    echo "<pre>";
    ob_start(); // PHP の出力制御関数の一つで、これ以降のブラウザ出力が内部メモリ的なところ(バッファ)に一時的に記録されるようです。
    var_dump( get_post( 820 , 'OBJECT' ) ); // WordPress の単一投稿を取得する関数です。この var_dump での出力は、内部メモリに保存されてブラウザには出力されません。
    $d = ob_get_clean(); // 内部メモリに記録されたデータを $d に返して、記録されていたデータを消去する関数のようです。同時に ob_start() で始めた内部メモリへのデータ蓄積は解除されて、これ以降のブラウザ出力は有効になるようです。
    echo htmlspecialchars( $d , ENT_QUOTES ); //通常の htmlspecialchars の処理です。
    echo "</pre>";
?>

コメント抜きの PHP コード :

<?php
    echo "<pre>";
    ob_start();
    var_dump( get_post( 820 , 'OBJECT' ) );
    $d = ob_get_clean();
    echo htmlspecialchars( $d , ENT_QUOTES );
    echo "</pre>";
?>

今度の出力結果は載せてみましょう。 "post_content" の部分のリンク、画像が表示されておらずソースコードの状態で表示されていますね。

出力結果 :

object(WP_Post)#2414 (24) {
["ID"]=>
int(820)
["post_author"]=>
string(xxx) "xxx"
["post_date"]=>
string(19) "2016-07-07 16:43:38"
["post_date_gmt"]=>
string(19) "2016-07-07 07:43:38"
["post_content"]=> //ここにページの本文が入っています。
string(638) "<p>よろしくお願い致します。</p>
<p>リンクテスト</p>
<dl>
<dt>当ブログについて ? pulogu.net</dt>
<dd><a href="https://pulogu.net/about-this-blog/" title="当ブログについて ? pulogu.net" target="_blank">https://pulogu.net/about-this-blog/</a></dd> //リンクがソースのままの表示されています。
</dl>
<p>画像テスト</p>
<p><a target="_blank" href="https://pulogu.net/wordpress/wp-content/uploads/2016/04/cropped-pulogu_logo-5.png"><img src="https://pulogu.net/wordpress/wp-content/uploads/2016/04/cropped-pulogu_logo-5-150x150.png" alt="cropped-pulogu_logo-5.png" class="alignnone wp-image-431 size-thumbnail" width="150" height="150"></a></p>" //リンクと画像がソースのままの状態で表示されています。
["post_title"]=>
string(30) "ブログ公開しました。"
["post_excerpt"]=>
string(0) ""
["post_status"]=>
string(7) "publish"
["comment_status"]=>
string(4) "open"
["ping_status"]=>
string(6) "closed"
["post_password"]=>
string(0) ""
["post_name"]=>
string(15) "blog-publishing"
["to_ping"]=>
string(0) ""
["pinged"]=>
string(0) ""
["post_modified"]=>
string(19) "2016-09-19 15:41:20"
["post_modified_gmt"]=>
string(19) "2016-09-19 06:41:20"
["post_content_filtered"]=>
string(0) ""
["post_parent"]=>
int(0)
["guid"]=>
string(24) "https://pulogu.net/?p=820"
["menu_order"]=>
int(0)
["post_type"]=>
string(4) "post"
["post_mime_type"]=>
string(0) ""
["comment_count"]=>
string(1) "0"
["filter"]=>
string(3) "raw"
}

目次まで戻る

参考情報

目次まで戻る

あとがき

出力制御関数。覚えておかないと。

後で知りましたが、 get_post() 関数で取得した情報をブラウザに出力する際は、 get_post() 関数の第 3 引数の $filter に 'display' を設定したほうが良いのかもしれません。 display フィルターをかけると、ブラウザ表示用に無害化された結果を返してくれるようです。

PHP のコード :

<?php
var_dump( get_post( 820 , 'OBJECT' , 'display' ) ); //無害化のフィルター種類が 6 つほどあるようで、その中の一つが display フィルターです。
?>

以上、閲覧ありがとうございました。

目次まで戻る

[ Amazon.co.jp アソシエイト ] PHP 関係の本
https://amzn.to/41Kpx4Q

同じカテゴリの投稿(PHP)

前後の投稿