WordPress ショートコードで好きなPHPファイルを挿入できるコードをアレンジ

いつだったか、興味本位で、PHPファイルをショートコードで、記事内に挿入して表示させたいと思って、以下の記事のコードを、そのまんまコピペして試したところ、何も表示されませんでした。(コピペ好きなわたしには、よくあることです。)

[fvcon_link url="https://www.sitepoint.com/how-to-develop-a-php-file-include-plugin-for-wordpress/"]How to Develop a PHP File Include Plugin for WordPress[/fvcon_link]

それで、へろへろ調べて、以下のようにコードを修正して、[code]functions.php[/code]に追記したところ、PHPファイルをうまく表示できました。

function fuji_shortcode_gaibufile_purun($params = array()) {
	extract(shortcode_atts(array(
		'file' => 'chiwa'
	), $params));

	ob_start();//バッファリングを開始
	require_once( $_SERVER['DOCUMENT_ROOT'] . '/favo-file/'. esc_attr($file) .'.php' );
	$output_string = ob_get_contents();//バッファの内容を変数($output_string)に代入
	ob_end_clean();//バッファの中身を削除

	return $output_string;
}
//ショートコード登録
add_shortcode('purun_jikkou', 'fuji_shortcode_gaibufile_purun');

上記の例だと、ルート直下に[code]favo-file[/code]という、ディレクトリを作って、そこに好きなPHPファイルを格納してます。

require_once( $_SERVER['DOCUMENT_ROOT'] . '/favo-file/'. esc_attr($file) .'.php' );

ファイルの名前まで、[code]esc_attr($file)[/code]で、無害化(サニタイズ)しなくても、いいのかも、、、なんですが、念のためやっておりますです。

それと、わたしはできるだけ、WordPress のファイルのある場所を隠したい、という方針なので、WordPress が設置されている場所とは、ぜんぜん違う別の場所に、PHPファイルを格納するディレクトリを置いてるので、こんなパスになってます。

ちなみに、コデックスを見ると、このような隠ぺいによるセキュリティというのは、なんだか微妙…みたいですね。

[fvcon_link url="https://wpdocs.osdn.jp/WordPress_%E3%81%AE%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E9%AB%98%E3%82%81%E3%82%8B#.E9.9A.A0.E8.94.BD.E3.81.AB.E3.82.88.E3.82.8B.E3.82.BB.E3.82.AD.E3.83.A5.E3.83.AA.E3.83.86.E3.82.A3″]隠蔽によるセキュリティ[/fvcon_link]

つかいかたは、例えば、挿入したい好きなPHPファイルが[code]konchiwa.php[/code]の場合、[code][purun_jikkou file=konchiwa][/code]といったように、ファイル名を指定してショートコードを、書きます。

ということで、[code]require_once[/code]とか、[code]$_SERVER['DOCUMENT_ROOT’][/code]なんてのは使わずに、そのかわりに以下の記事のように

get_template_part($file);

これで、挿入したいPHPファイルを、子テーマのディレクトリ内に入れておけますよ。

WordPressで子テーマ使用時にショートコードで記事本文中に任意のテンプレートを読み込む方法(リンク切れ)

挿入したいファイルの拡張子が、[code].php[/code]じゃなくて、[code].html[/code]とかだったら、以下の記事のコードで、バッチリ表示できます。

[fvcon_link url="http://blog.s-giken.net/116.html"]WordPress任意のファイルを読み込むショートコードの処理[/fvcon_link]