【WordPress】phpスクリプトを記述できるショートコードを作ってみた

 

 

 

概要

 

投稿ページや固定ページでphpスクリプトを直接書くことができるショートコードを作ってみました。

 

 

 

環境

 

IDCFクラウド環境

  • サーバー (仮想マシン・ハードウェア専有マシン)
    S1 プラン メモリ1G

  • ボリューム(ディスク)
    基本 15GB

  • オブジェクトストレージサービス
    50GB

  • WordPressは仮想マシンKUSANAGI環境で使用

 

 

ショートコードとは

 

ショートコードとは投稿ページや固定ページでテキストを装飾するための機能です。HTMLのタグと同様の使い方でさまざまな動作を短いコードで表現することができます。

ショートコードは一般的に[xxxxxx]というように各括弧で囲まれた記述の仕方をします。WordPressを触っている人なら見おぼえがあると思います。

 

 

このショートコードには、自己完結型ショートコードと囲み型ショートコードの二つの使い方があります。

 

自己完結型コードとは、[xxxxxx]で完結します。

 

[garally]

 

一方、囲み型ショートコードは、開始タグと終了タグがあり、[xxxxxx]コンテンツ[/xxxxxx]のようにコンテンツをタグで囲みます。

 

[strong]コンテンツ[/strong]

 

どちらも属性を設定することが可能です。属性を設定する場合は、タグの中に[xxxxxx a=111 b=222]のように記述します。

 

WordPressのショートコードAPIは自己完結型ショートコードと囲み型ショートコードの両方をサポートしています。

詳しい説明は WordPress Codex ショートコードAPI に記載されています。

 

 

 

 

php埋め込みショートコード登録スクリプト

 

 

このスクリプトを使うと、いままでテーマのテンプレートを編集しないと作成できなかったphpプログラムを、登録ページや固定ページの記事の中で記述して実行することができるようになります。

 

 

phpプログラムの呼び出し方には二つの方法を用意しています。

 

  1. あらかじめ登録済みのphpファイルを指定して実行する方法
  2. 記事の中で直接phpスクリプトを記述して実行する方法

 

 

あらかじめ登録済みのphpファイルを指定して実行する方法

 

WordPressショートコードAPIの自己完結型ショートコードを利用しています。あらかじめmyphpfilesフォルダに登録済みのphpファイルを呼び出します。phpファイルの指定は、file属性にファイル名を設定することで行います。

 

[ phpinclude file=myphpcode]

※ファイル名の拡張子は必ず.phpになります。

 

 

記事の中で直接phpスクリプトを記述して実行する方法

 

WordPressショートコードAPIの自己完結型ショートコード(属性にファイル名を指定)を利用しています。ショートコードの開始タグと終了タグの間にphpスクリプトを記述します。

 

file属性のかわりにmode属性を使用します。mode属性にはechoとevalを指定することができます。
phpスクリプトとして実行する場合は、mode属性にevalを指定します。

 

[ phpinclude mode=eval ]phpinfo();//php設定環境を出力します[/phpinclude]

 

 

実際のスクリプトはこちらです。

 

// 2017/8/29 投稿や個別ページでPHPを使えるようにする
function PHP_Include($params = array(), $content = null) {
    extract(shortcode_atts(array('file' => 'none'
    ,'mode' => 'echo'), $params));
    ob_start(); //バッファリング出力開始(ここからreturn ob_get_clean()までの出力データをすべて戻り値として返す)
    //style.cssと同じディレクトリにあるphpファイルをインクルード
    if($file == 'none' and (is_null($content) or $content=='')) { //PHPファイル指定もPHPコードもない
       echo '#phpinclude: Either atts or contents found.';
    } elseif($file == 'none' and $mode='eval') { //PHPファイル指定がなく、PHPスクリプト実行モードの場合
       //contentをphpスクリプトとして実行する
       eval($content);
    } elseif($file == 'none') { //PHPファイル指定がない場合(主にデバッグ時に使用: PHPコードをechoで表示する)
       //contentを表示する
       echo $content;
    } else { //PHPファイルを読み込み実行する
       $filename = get_theme_root() . '/' . get_template() . "/myphpfiles/$file.php";
       if (file_exists($filename)) {
          include($filename);
       } else {
          echo "#phpinclude: $file.php is not found in ". get_theme_root() . '/' . get_template() . "/myphpfiles";
    }
 }
 return ob_get_clean(); //バッファリング出力終了
}
//ショートコードタグphpincludeに関数PHP_Includeを登録
add_shortcode('phpinclude', 'PHP_Include');

 

 

phpスクリプトの実行には、phpのeval関数(引数により与えられた文字列をphpスクリプトとして直接実行する)を使用しています。実際にphpスクリプトを記述する場合はスクリプトを十分に検証されたコートを使用する必要があります。

 

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

 

 

 

自動コード変換抑制スクリプト

 

WordPressは特殊な文字の組み合わせを自動的に判定して変換する機能が動いています。

 

自動変換の対象となる文字列と変換後の文字列の一覧です。
WordPress Codex 関数リファレンス/wptexturize より引用しました

元のテキスト 変換されたテキスト シンボル名
"---" "—" em ダッシュ
" -- " "—" em ダッシュ
"--" "–" en ダッシュ
" - " "–" en ダッシュ
"..." "…" 省略記号
`` 開始引用符
"hello “hello 開始引用符
'hello ‘hello 開始引用符
'' 終了引用符
world." world.” 終了引用符
world.' world.’ 終了引用符
" (tm)" " ™" 商標記号
1234" 1234″ ダブルプライム記号
1234' 1234′ プライム記号
'99 ’99 西暦の省略表現前のアポストロフィ
Webster's Webster’s アポストロフィ
1234x1234 1234×1234 乗算記号
そのままでは、phpスクリプトの一部が自動変換されてしまいますので、今回作成するスクリプトの中ではこの自動変換機能を無効にするようにします。

 

以下が今回作成するショートコード内の自動変換を抑制するスクリプトです。

// 2017/8/29 特殊文字が自動変換されるのを回避する
//すべて変換されないためコメントアウトadd_filter( 'run_wptexturize', '__return_false' );
//対象ショートカットのみ自動変換しない
add_filter( 'no_texturize_shortcodes', 'shortcodes_to_exempt_from_wptexturize' );
function shortcodes_to_exempt_from_wptexturize( $shortcodes ) {
    $shortcodes[] = 'phpinclude';
    return $shortcodes;
}

 

 

 

 

作成したスクリプトの使用例

 

 

 

 

 

まとめ

 
プラグインを使わずに、PHPを投稿ページで利用することができるようになりました。

一度設置してしまえば、かんたんにPHPが利用できるようになりますね。

ただ、phpの記述を間違えばWordPressがエラーになりトップ画面が表示されなくなりますので気をつけましょう^^;
 

 

関連記事

 

 

 

参考