WordPressにショートコードを使ってPHPを埋め込む方法

- 環境
    - Windows 10 Pro 64bit バージョン1909
    - Local by Flywheel 5.6.1
        - PHP 7.4.1 / MySQL 8.0.16 / Apach / WordPress 5.4.2
        - テーマ : [Lightning](https://lightning.nagoya/ja/)

# ショートコードをつくる基本の方法
1. functions.phpを開く
1. PHPで関数を定義して処理を書く
1. `add_shortcode('{ショートコード用文字}', '{関数名}');`を書く
1. WordPressの記事などに`[{ショートコード用文字}]`を書く
1. プレビューなんかで見ると処理の結果が出力される

- functions.phpの場所 : `{サイトのディレクトリ}/app/public/wp-content/themes/{テーマのディレクトリ}/functions.php`
    - 今回の環境では、`/c/Users/{ユーザ}/Local Sites/sample/app/public/wp-content/themes/{テーマ}/functions.php`

- 参考
    - [ショートコード API - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89_API)
    - [関数リファレンス/add shortcode - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_shortcode)

```php:functions.phpに書く
function short_cord_func() {
    return 'ショートコードをつくる基本の方法';
}
add_shortcode('short_cord_string', 'short_cord_func');
```

```text:記事ショートコードを書く
[short_cord_string]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/f59a5430-d6b6-c215-d638-b0c5be9e2d15.png)

# 外部ファイルを読み込んでショートコードをつくる方法
1. 外部ファイルにPHPで処理を書く
1. functions.phpを開く
1. PHPで関数を定義して外部ファイルを呼び出す処理を書く
1. あとは「ショートコードをつくる基本の方法」と同じ

- 参考
    - [関数リファレンス/get template part - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_template_part)
    - [PHP: ob_start - Manual](https://www.php.net/manual/ja/function.ob-start)
    - [PHP: ob_get_clean - Manual](https://www.php.net/manual/ja/function.ob-get-clean.php)
    - [プラグインを使わず WordPress の投稿ページで PHP の外部ファイルを呼び出す方法](https://webllica.com/call-php-on-wordpress-pot-new/)
    - [WordPress 外部PHPファイル読み込み include非推奨 get_template_partに変更 | モバイル・スマホWeb・WordPressのSEO塾.com](https://www.seojuku.com/blog/wptitle-include-no.html)

```text:テーマ用ディレクトリ配下にディレクトを作って外部ファイルをおいてみた
テーマのディレクトリ
├ functions.php
└ customphp
　└ short-cord.php << 外部ファイル
```

```php:short-cord.phpという外部ファイルにPHPで処理を書く
// この外部ファイルからの出力がそのまま埋め込まれるイメージ
<p><?php echo '外部ファイルを読み込んでショートコードをつくる方法'; ?><p>
```

```php:functions.phpにPHPで関数を定義して外部ファイルを呼び出す処理を書く
function short_cord_func() {
    // 出力バッファリングを有効化する
    ob_start();
    // 外部ファイルを読み込む
    // 「.php(拡張子部分)」は不要
    get_template_part('customphp/short-cord');
    // 出力バッファを削除する
    return ob_get_clean();
}
add_shortcode('short_cord_string', 'short_cord_func');
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/c050a7d3-b627-eb4c-9f82-fed68d766387.png)

## 外部ファイルを読み込むショートコードを複数作る場合
外部ファイルを読み込む専用の関数を作っておくと便利

- 参考
    - [関数リファレンス/shortcode atts - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/shortcode_atts)
    - [PHP: extract - Manual](https://www.php.net/manual/ja/function.extract.php)

```text:こんな風に外部ファイルおいてみた
テーマのディレクトリ
├ functions.php
└ customphp
　├ hoge.php << 外部ファイル
　└ fuga.php << 外部ファイル
```

```php:functions.php
/**
 * 外部ファイルを読み込む専用関数.
 * @param array 読み込む外部ファイル名(拡張子なし)を値に持つ連想配列(keyはfile).
 **/
function custom_func($args) {
    // $file変数を配列からインポートする
    extract(shortcode_atts(array('file' => 'default'), $args));
    // 出力バッファリングを有効化する
    ob_start();
    // 外部ファイルを読み込む
    get_template_part("$file");
    // 出力バッファを削除する
    return ob_get_clean();
}

/** hoge.phpを使うショートコード用関数. */
function hoge() {
    return custom_func(['file' => 'customphp/hoge']);
}
add_shortcode('hoge', 'hoge');

/** fuga.phpを使うショートコード用関数. */
function fuga() {
    return custom_func(['file' => 'customphp/fuga']);
}
add_shortcode('fuga', 'fuga');
```
## テーマを選定中でちょいちょい変える場合
外部ファイルを複数作っている場合にはどっかのディレクトリにまとめておくとテーマが変わった時にディレクトリ毎持っていけるから便利
だけど、テーマを選定中で使うテーマのディレクトリ毎にコピーしていくのは面倒くさい
そんな時はシンボリックリンクを使うと便利

```text:外部ファイルを入れるディレクトリを作る
{サイトのディレクトリ}/app/public
├ wp-admin
├ wp-includes
├ wp-content
｜└ themes
｜　├ lightning         << テーマのディレクトリ
｜　｜├ functions.php
｜　｜└ customphp       << シンボリックリンク
｜　└ twentynineteen   << テーマのディレクトリ
｜　　├ functions.php
｜　　└ customphp       << シンボリックリンク
└ customphp  << 外部ファイル用ディレクトリ
　├ hoge.php
　└ fuga.php
```

```bash:Windowsのコマンドプロンプトでシンボリックリンクを作る方法
# 1. 管理者権限でコマンドプロンプトを起動する
# 2. シンボリックリンクを作りたいところに移動する
>cd "c:\Users\{ユーザ}\Local Sites\sample\app\public\wp-content\themes\twentynineteen"
# 3. ディレクトリ(/D)のシンボリックリンクをつくる(mklink)
>mklink /D customphp "c:\Users\{ユーザ}\Local Sites\sample\app\public\customphp"
customphp <<===>> c:\Users\{ユーザ}\Local Sites\sample\app\public\customphp のシンボリック リンクが作成されました
```

# ショートコードを作ってみた
WordPressでPHPを埋め込む方法がなんとなくわかったので早速Google検索した結果を表示するショートコードを作ってみた。
[WordPressでGoogleのCustom Search APIを使ってみる - ponsuke_tarou’s blog](https://ponsuke-tarou.hatenablog.com/entry/2020/06/29/184108)