[WP]ショートコードでPHPを読み込んで実行する方法。自作ショートコードを外部ファイルに分ける。プラグインなし!

2021-08-27
Wordpress

Wordpress_外部phpをショートコードで読み込む_004
WordPressでは投稿や固定ページ、ウィジェットなどにphpコードを書き込んで実行することはできません。
構成するファイルのほとんどがphpなのでセキュリティー上そうなっています。

では、Wordpressでphpを使う場合はどのように使用すれば良いのか?
phpを実行するのに推奨されている方法がショートコードを使う方法です。

今回ショートコードでphpを読み込んで実行する方法と、自作ショートコードの保存場所を外部ファイルに分ける方法をまとめました。

プラグインを使用せずfuncitons.phpでphpファイルを呼び出す方法です。

WordPressのショートコードでphpを実行する

WordPressでphpを使う方法は何種類かあります。
ではなぜショートコードを使う方法が推奨されているのか?

それは、投稿やウィジェットでphpを使用可能にするためのプラグインにはeval関数というセキュリティー上危険な関数が使用されている可能性があるためです。
よく見るfunctions.phpにコードを追加してテキストウィジェットでphpを実行できるようにするコードにもeval関数が見受けられますが…これも良くないです。

以下PHPマニュアルからの引用です。

警告
eval() は非常に危険な言語構造です。 というのも、任意の PHP コードを実行できてしまうからです。 これを使うことはおすすめしません。 いろいろ検討した結果どうしても使わざるを得なくなった場合は、細心の注意を払って使いましょう。 ユーザーから受け取ったデータをそのまま渡してはいけません。 渡す前に、適切な検証が必要です。

またセキュリティー、軽量化の面でもプラグインの数は1つでも少ない方が良いです。
そこで推奨される方法がショートコードを使ったphpの読み込みなのです。

この記事では下記の方法を書いています。

  • funcitons.phpでショートコードを作る方法。
  • ショートコードを纏めたファイルを読み込む方法。
  • それぞれのphp外部ファイルを個別に読み込む方法。

日本語が怪しいので上手く伝わるか分かりませんが頑張って書いてみます・w・

functions.phpでショートコードを作る方法

コード自体をfunctions.phpに直接記述する一番簡単な方法です。
使いたいphpが少ない場合には良いかもしれませんが、後々増えてくると管理しにくくなります。

 functions.php
function test() {
return "Hello World";
}
add_shortcode('sc', 'test');

{から}までの間に実行したいphpコードを書いていきます。
functions以下のtestとadd_shortcode内のtestは同じ名前になります。
add_shortcode内の'sc'というのがショートコード名となります。

scというショートコードにて関数testを実行するという感じ。
投稿ページやウィジェットに[sc]と記述すれば「Hello World!」と表示されます。

ショートコードを1つのファイルに纏める方法

続いてショートコードだけを書いたphpファイルを別のファイルとして分け、functions.phpにてインクルードする方法です。

手順は以下です。

  1. ショートコード専用のphpファイルを作成する。
  2. 使いたいショートコードを全て記述する。
  3. 作成したphpファイルをfunctions.phpで読み込む。

まず子テーマ内にショートコード用の専用phpファイルを作成します。
今回はshortcodes.phpというファイル名で作成しました。

Wordpress_ショートコードを纏める_001

shortcodes.phpを子テーマ内に作成

続いてshortcodes.phpに使いたいショートコードを記述して保存します。
以下のようにしました。かなり乱雑ですw

//shortcodes.php
function test() {return "Hello World!";}
add_shortcode('sc', 'test');

function test1() {return "こんにちは!";}
add_shortcode('sc-1', 'test1');

function test2() {return "今日もいい天気!";}
add_shortcode('sc-2', 'test2');

纏めたファイルをfunctions.phpで読み込む

作成したショートコードを有効化するために、子テーマのfunctions.phpに下記のコードを追記してshortcodes.phpを読み込みます。

 functions.php
//ショートコード集の読み込み
include('shortcodes.php');

あとは作成したショートコードを使いたい場所で使うだけ!

Wordpress_ショートコードを纏める_002

投稿ページでテスト

投稿ページで呼び出してみる。

Wordpress_ショートコードを纏める_003

全てのショートコードが動いた

動きました!

個人サイトの場合ショートコードを外部ファイルに纏めるのはこの方法でも十分かとも思います。

phpを外部ファイル化してショートコードで読み込む方法

これは先述の方法とは少し異なるかもしれません。
プログラム単位でphpファイルを外部ファイルとして分けておき、なおかつショートコードでファイル名を指定してそのphpを実行するという方法です。

例えば、人気記事を集計して表示するプログラム「popular.php」。
アフィリエイト用の広告を出し分けて表示するプログラム「ad.php」などそれなりの行数があるphpファイルを外部ファイルとして作成し、任意の場所でショートコードを使って呼び出したい場合にとても便利な方法です。

手順は以下です。

  1. 子テーマに専用のフォルダを作成する。
  2. functions.phpにコードを追記する。
  3. ショートコード+ファイル名で呼び出す。

では早速やってみましょう・w・

phpプログラム専用フォルダの作成

まずは子テーマ内に専用のフォルダを作成しましょう。
もちろん子テーマ直下でもOKなのですが、ファイルが多くなると管理がしにくくなりますので1つ専用のフォルダを作成することをオススメします。

Wordpress_外部phpをショートコードで読み込む_004

子テーマ内にcodeを作成。その中にphpファイルを入れる。

今回「code」という名前のフォルダを作りました。
このcodeフォルダの中にphpファイル達を追加していく形となります。

その中に「hello.php」というサンプルプログラムも作成しました。
内容は以下です。

//hello.php
<?php
echo "Hello World!";
?>

超シンプルw
このhello.phpがショートコードで呼び出したいphpファイルです。

functions.phpにコードを追記する

これで事前準備が整いました。
続いてfunctions.phpに以下のコードを追記します。

注意ポイント

phpの配置が親テーマなのか子テーマなのかによってパスが異なります。
殆どの方が子テーマだと思います。下の方のコードをお使いください。

親テーマを使用する場合

//親テーマにcode/○○.phpを配置する場合のコード
function php_include_shortcode($params = array()) {
  extract(shortcode_atts(array('file' => 'default'), $params));
  ob_start();
  include(get_theme_root() . '/' . get_template() . "/code/$file.php");
  return ob_get_clean();
}
add_shortcode('sc', 'php_include_shortcode');

子テーマを使用する場合

//子テーマにcode/○○.phpを配置する場合のコード
function php_include_shortcode($params = array()) {
extract(shortcode_atts(array('file' => 'default'), $params));
ob_start();
include(STYLESHEETPATH . "/code/$file.php");
return ob_get_clean();
}
add_shortcode('sc', 'php_include_shortcode');

include内のパスが異なります。
scというショートコード名でこのプログラムを実行します。
コードの詳しい内容は興味がない方が多いと思うので後述します。

使い方はショートコード名+ファイル名を指定する形で使用します。

[sc file='hello']

scというショートコード名の後にfile='ファイル名'を付ける形。
※.phpなどの拡張子はつけません。

外部phpをショートコードで実行する

早速使ってみます・w・

Wordpress_外部phpをショートコードで読み込む_005

投稿ページでテスト

こんな感じに記述するとhello.phpが呼び出されます。

Wordpress_外部phpをショートコードで読み込む_006

外部ファイルhello.phpが実行された

子テーマ/code/hello.phpが実行されました。

続いてphpファイルを増やして動作確認します。
この方が分かりやすいので...

Wordpress_外部phpをショートコードで読み込む_007

codeフォルダにphpファイルを追加した

codeフォルダに3つのphpファイルを追加しました。
それぞれ内容は以下です。

//default.phpの内容
<?php
echo "ショートコード呼び出しdefaultファイルです!";
?>
//konnichiwa.phpの内容
<?php
echo "こんにちは!";
?>
//test.phpの内容
<?php
echo "これは「test.php」です!";
?>

※別々のファイルです。
めんどくさいので同時に書いています。

Wordpress_外部phpをショートコードで読み込む_008

ファイル名を変えてショートコードを実行してみる

ショートコードにファイル名を入れて使いますのでそれぞれこんな感じです。

  • [sc file='hello']:hello.phpの呼び出し。
  • [sc file='konnichiwa']:konnichiwa.phpの呼び出し。
  • [sc file='test']:test.phpの呼び出し。
  • [sc]:ファイル名なしはdefaultが呼び出される。
Wordpress_外部phpをショートコードで読み込む_009

ショートコードの実行結果

画像を見てもらった方が早いですね…
使い方はこんな感じで以上です。

外部phpをショートコードで読み込む_ファイル名エラー010

ファイル名を間違えるとエラーが出る

なおfile='○○'の中身を間違えた場合No such file ore directoryとエラーが出ますのでご注意を!

お疲れさまでした。
ご自身に合った方法で是非お試しください!
-----ここから先はマニアックなコード解説-----

使用したプログラムコードとエラーについて

調べるとどのサイトもコードを詳しく解説していなかった?ので今回使用したコードを詳しく見ていこうと思います。
僕の備忘録でもあります・w・

少し見やすくしてコメントを入れてみました。(間違ってたらごめん…)

function php_include_shortcode($params = array()) {
//extractは連想配列のキーから変数を作る関数
//shortcode_attsでショートコードのキーとデフォルト値を決める
  extract(shortcode_atts(array(
//fileがキーでデフォルト値はdefault
    'file' => 'default'
//変数paramsは属性を格納する変数
  ), $params));
//出力バッファリングの有効化
  ob_start();
//スタイルシートのパス=子テーマ直下のパス
  include(STYLESHEETPATH . "/code/$file.php");
//バッファの取得と削除
  return ob_get_clean();
}
//scというショートコードでphp_include_shortcode関数を呼び出す。
  add_shortcode('sc', 'php_include_shortcode');

shortcode atts

属性のデフォルト値を設定する関数。

  • 第一引数:デフォルト設定したい属性名(file)と属性値(default)の連想配列
  • 第二引数:チェックする生の連想配列。通常そのまま使用できるみたい。
  • 第三引数:フィルターしたい文字。任意。
shortcode atts-defaultなしsc実行_011

default.phpなしでの[sc]実行

今回の場合[sc]とだけ記述するとdefault.phpが探され、無い場合はエラーとなる。

shortcode atts-defaultありsc実行_012

default.phpがある場合は呼び出される

あればdefault.phpが呼び出される。

extract関数

連想配列['color']='red'、連想配列['fruit']='apple'
に使ったらキーを変数名、値を変数の値として処理してくれるらしいので...
$color='red'、$fruit='apple'
という感じで処理されるのかね?日本語でお願いします...内容難しすぎw

ちなみに今回extract関数を使っていますが、なくても動きます。
ショートコードの入力値をごにょごにょするだけですので...

extractなしdefaultありでsc実行_013

extractなしdefaultありでの[sc]の実行

ただextractしていないと引数無しでショートコードを実行した時にuninitialized string offset 0エラーが出ます。

外部リンク

【参考】PHP: extract - Manual

ob_start、ob_get_clean

バッファリングを使う関数のセットです。
無くても出力されますが、これが無いと意図しない場所に出力されてしまいます。

これは画像を見ていただいた方が早いです。

ob_start-ob_get_cleanなしで実行_014

意図しない場所に処理結果が表示される

「この下にショートコード」と「この上にショートコード」の間にHello World!が表示されるはずが、バッファリングが無いと変な場所に表示されます。

この項目要らなかいかもwww

まとめ

WordPressでショートコードを使ってphpを実行する方法のまとめでした。

いかがでしたでしょうか?内容は伝わりましたでしょうか...
一見難しそうに思えますが外部phpの読み込み&実行はショートコードという機能のおかげで随分と楽に実装することが出来ます。

phpのコードを使えるようにするプラグインを使用中の方はプラグインレスで実装する方法も是非ご検討ください・w・

関連記事

■ウィジェットでphpを実行する方法です。
WordPressのウィジェットでphpコードを実行する方法。

■single.phpなどテーマphp内でショートコードを使う方法です。
WordPressのphpファイル内にショートコードを使う方法。便利な関数do_shortcodeの使い方。

-Wordpress
-

ありがとうございました。
良かったらシェアしてネ・w・

© 2022 ソロ学