WordPressで投稿・固定ページでphpファイルを親子テーマで利用できるショートコード

WordPressの投稿・固定ページの編集ページの本文入力欄にphpコードを入力しても何も動作しません。
本文入力欄の中でphpコード・ファイルを呼込むにはショートコードを利用する方法があります。
functions.phpにショートコードを有効にする為のコードを入力し、編集本文に入力します。
親テーマでも子テーマでもショートコードを有効にする為、get_stylesheet_directoryでサーバー絶対パスを取得します。
サイドウィジェットやphpファイル内でもコードを設定すれば使用できます。

ページ内リンク

functions.phpに入力

functions.phpに以下のコードを入力するのですが、functions.phpに何か入力する時は必ずバックアップを取ってから行ってください。
少し間違えただけでサイト全体が動かなくなります。

functions.php内の「<?php」と「?>」の間に入力してください。
functions.php内にすでに入力されている他のプログラムの終わりがわからなくてプログラムの途中に入力してしまったら当然サイト全体が動かなくなります

「<?php」のすぐ下か「?>」のすぐ上に入力するのが無難です。

functions.phpに入力するコードです。

function PHP_Include($params = array()) {
    extract(shortcode_atts(array(
        'file' => 'default'
    ), $params));
    ob_start();
    include(get_stylesheet_directory() . "/$file.php");
    return ob_get_clean();
} 

add_shortcode('hwebphp', 'PHP_Include');

extract(shortcode_atts(array(
extract()はPHPの関数で連想配列のキー名を変数に替えて指定している値を格納することができます。
fileを変数にして/$file.phpで利用しています。
shortcode_attsはショートコードに指定した属性を、予め定義した属性と結合し、無効な属性値を除外、必要に応じてデフォルト値をセットします。

ob_start()
は出力するはずの内容をバッファにため込みます。バッファリングの開始という宣言です。「ob_end_clean();」まで出力されません。

get_stylesheet_directory()
は現在のテーマまたは子テーマのスタイルシートディレクトリの絶対サーバーパスを取得します。
get_stylesheet_directoryを使えば子テーマでも親テーマでも有効になります。

投稿・固定の編集ページの本文に入力

投稿・固定の編集ページの本文入力欄に以下を入力します。

[hwebphp file='']

「’ ’」の間にphpファイル名を入力します。
独自に作ったloo-con.phpファイルがあるとして、その場合

[hwebphp file='loo-con']

となります。

これで投稿・固定の編集ページにphpファイルを呼込むショートコードの設定が完成しました。

書き換え

include(get_stylesheet_directory() . “/$file.php”)」の部分をもっと直接的に絶対サーバーパスで「include(“/public_html/haradaweb.com/wp-content/themes/twenty17-child/$file.php”)」と書き換えることができます。

ただし書き換えた場合テーマを変更した時にテーマフォルダ名「twenty17-child」、ドメインを変えてサイトを引っ越す時にドメイン名「haradaweb.com」の変更も必要になります。

またサーバーによって階層構造が違うので、/public_htmlで始まるかどうかはわからないので、各サーバーで確認して行ってください。

サブフォルダを設定

ショートコードでインクルードさせるファイルだけをまとめておきたい場合、サブフォルダを作る方法があります。
例えば「shortcode」(任意)という名前でフォルダを作ってfunctions.phpやstyle.cssのある所に設置し、「shortcode」フォルダの中にインクルードさせるファイルを保存します。
その場合、
include(get_stylesheet_directory() . “/$file.php”);
の部分が
include(get_stylesheet_directory() . “/shortcode/$file.php”);
となります。

get_templateは子テーマで動作しない

How to Develop a PHP File Include Plugin for WordPress
に参考コードが出ています。
このコードはプラグインなどを作る開発者に向けたショートコードの提案のようです。
「include(get_theme_root() . ‘/’ . get template() . “/$file.php”)」となっています。

include(get_theme_root() . ‘/’ . get template() . “/$file.php”)」で解説しているサイトが多いのですが、get template()では子テーマを設置している場合、親テーマのディレクトリー名を取得してしまうので動作しません

get_theme_root() . ‘/’ . get_template()get_stylesheet_directory()に変更すれば正常に動作します。

サイドウィジェットでショートコードを使用

functions.phpに以下のコードを入力するとサイドウィジェットでショートコードを使用できます。

add_filter('widget_text', 'do_shortcode');

テンプレート内でショートコードを使用

何か本末転倒のような気がしますが、ショートコードをテーマファイル、テンプレートファイルなどphpファイル内で使う場合は以下のコードになります。

<?php echo do_shortcode('[loo-con]'); ?>

参考URL

関数リファレンス/get stylesheet directory
関数リファレンス/get theme root
関数リファレンス/get template

コメントを残す

TOP