2022-03-24

WordPress記事内にショートコードでPHPスクリプトを埋め込む

WordPressに関する記事

WordPresの投稿ページでは、セキュリティ上の理由により、投稿内容に直接PHPスクリプトを含めることができません。
どうしてもPHPスクリプトを実行させたい場合は、ショートコード機能を利用するか、プラグインを利用するというのが一般的です。

今回はショートコード機能を利用した方法をご紹介します。

ショートコードとは

記事内でプログラムや表示を呼び出す仕組みです。プログラムを実行できるので、表示したい内容やマークアップを動的に作ることができます。自作のショートコードのみならず、デフォルトで用意されているものも多くあります。

https://wordpress.com/support/shortcodes/

個人的にはパーツのテンプレート化によく使用しています。呼び出しタグにパラメータを指定することで、動的な表示も可能です。記事内で直接PHPは使用できませんが、ショートコードを利用することで、PHPの実装と同様の機能が利用可能となります。

スポンサーリンク

ショートコード実装方法

2つのサンプルを通して確認してみましょう。

サンプル①

ショートコードを記述した場所にテキストを表示するという、シンプルなロジックです。基本的な仕組みが理解できると思います。まずfunction.phpにショートコードを記述します。

add_shortcode()の第1引数にショートコード名(任意)、第2引数に実行する関数名を定義(任意)。第2引数で記載した関数をfunctionで定義しています。関数をショートコードで隠して間接的に実行する仕組、といったところでしょうか。

function.php

function test_code() {
    return 'ショートコードの呼び出しテスト';
}
// sc_testという名前でショートコードを定義、呼び出すとtest_code関数が実行される
add_shortcode('sc_test','test_code');

次に記事の投稿内容に、先ほど設定したショートコードの呼び出しタグを記述します。[]内にショートコード名を記述するだけ。function.phpで定義したsc_testを指定します。すると、タグを記述した場所に「ショートコードの呼び出しテスト」と表示されます。

ショートコードを記事の投稿内容に記載

[sc_test]

余談ですが、グーテンベルクの場合ショートコードブロックが用意されています。

ショートコードブロック

サンプル②

先ほど作成したサンプルの応用編です。外部ファイルを読み込み表示してみましょう。

大まかな仕組は先ほどと同じですが、こちらは引数(正確には属性)を受け取り処理内容に使用しています。ショートコードの呼び出しの際、file=""で読み込むファイル名を引数で渡しています。load_external_file側で受け取りで受け取り、include関数でファイルの読み込みを行っています。
なお、引数が指定されなかった場合は、default.phpが読み込まれるという仕様です。

function.php

function load_external_file($args) {
    // 記事側から渡された引数を$fileに定義(ここではtest.php)
    extract(shortcode_atts(array('file' => 'default.php'), $args));
    // バッファリングを用いて外部ファイルを読み込み
    ob_start();// バッファスタート
    include(STYLESHEETPATH . "/" . "elements" . "/" . "$file");// ファイルの読み込み
    return ob_get_clean();// バッファの内容取得、出力バッファを削除
}
add_shortcode('load_file', 'load_external_file');

ショートコードを記事の投稿内容に記載

[loadFile file="test.php"]

function.phpの取り扱いに注意

今回に限ったことではありませんが、function.phpファイルの編集には注意が必要です。記述ミスによる文法エラーなどが発生するとサイト自体が表示されなくなるなどします。編集前にバックアップを作成し、すぐに復旧できるような状況で編集をおこないましょう。

まとめ

基本的なショートコードの実装方法をご紹介しました。WordPress自体がPHPで構築されていることもあり、WordPressを触りはじめたころは直接コードを埋め込めるものだと勘違いしていました。

よく考えればセキュリティ上、保守上も望ましくないですね。しかし、「こういうことができたらなー」ということは大概何らかの仕組みが用意されているということですね。

日々、より利便性、保守性の高いサイト構築を目指してゆきましょう!