ショートコードを使用してPHPを読み込ませる方法

Cocoonカスタマイズ集
この記事は約5分で読めます。
記事内に広告が含まれています。

はじめに

WordPressのサイト運営において、「特定のページだけで複雑なロジックを動かしたい」「functions.phpを肥大化させたくない」という場合に非常に有効なのが、外部ファイルを必要な時だけインクルードする方法です。

子テーマ内の特定のフォルダからPHPファイルを読み込む仕組みを実装し、任意の位置に外部ファイルを挿入します。

この記事では、この方法について説明します。

使用方法

以下にショートコードを示します。

[my_include]
オプション
オプション説明値初期値
filePHPファイル名(必須)

実装方法

以下のコードをfunctions.phpに追加します。

  • cocoon-child-master
    • php
      • ファイル名.php
add_shortcode('my_include', function ($atts) {
  $atts = shortcode_atts([
    'file' => '',
  ], $atts);

  if (empty($atts['file'])) {
    return '<p>ファイル名が指定されていません。</p>';
  }

  $file_name = $atts['file'] . '.php';
  $file_path = get_stylesheet_directory() . '/php/' . $file_name;

  if (!file_exists($file_path)) {
    return '<p>指定されたファイルが見つかりません。</p>';
  }

  include_once $file_path;

  return '';
});

参考:外部ファイルの自動ロードとAjax対応について

呼び出す外部PHPファイル内で「単なる出力」だけでなく、「テンプレートファイルの差し替え・変更(cocoon_template_part)」「CSS/JSの読み込み(wp_enqueue_script)」「Ajax処理(wp_ajax_アクションフックの登録)」を行っている場合、描画が始まる前のタイミングでファイルを事前ロードしておく必要があります。

本実装では、ショートコードを手動で記述することなく、「通常ページ表示時」と「Ajax通信時」のそれぞれで必要なファイルを自動的にinclude_onceします。

実装手順

以下のコードをfunctions.phpに追加します。

// 投稿ページ単位にファイルを自動読み込み
add_action('wp', function () {
  if (!is_single()) {
    return;
  }

  $slug = get_post_field('post_name', get_queried_object_id());
  $file_path = get_stylesheet_directory() . '/php/' . $slug . '.php';

  // サンプルファイルが存在する場合のみ読み込み
  if (file_exists($file_path)) {
    include_once $file_path;
  }
});


// Ajax通信が必要な投稿ページでファイル読み込み
if (wp_doing_ajax()) {

  // Ajax通信が必要な投稿ページのスラッグ一覧を設定
  $ajax_samples = [
    'add-more-button-posts',
    'button-click-counter',
    'shortcode-search-checked-list',
  ];

  // スラッグごとにサンプルファイルを確認
  foreach ($ajax_samples as $slug) {
    $file_path = get_stylesheet_directory() . '/php/' . $slug . '.php';

    // サンプルファイルが存在する場合のみ読み込み
    if (file_exists($file_path)) {
      include_once $file_path;
    }
  }
}

仕組みと命名規則について

本実装では、読み込むPHPファイルのファイル名を「投稿ページのスラッグ名(スラッグ名.php)」として統一しています。

  • 通常の投稿ページ表示時
    表示中の投稿スラッグを取得し、wpフックのタイミングで samples/投稿スラッグ.phpを自動的に include_onceします。
    これにより、テンプレート変更のフック、アセット読み込み、アクションフックの登録などが正しく機能します。
  • Ajax通信時
    Ajaxリクエスト中(admin-ajax.php実行時)は表示画面の判定(is_single)が利かないため、get_ajax_sample_configs()に登録したスラッグ名を元に対象ファイルを事前に自動ロードします。

参考:eval()を使ったPHPコードの実行は危険

以下の記事では、「テキスト」ウィジェットにPHPコードを入力可能とする方法を紹介しています。


しかし、eval()を使った方法は安全性の面で非常に問題があります。

eval()は、与えられた文字列をそのままPHPとして実行してしまうため、管理者以外や意図しない入力でも任意のPHPコードが実行され、サイト全体が乗っ取られたりデータが改ざんされたりする危険があります。
さらに、構文エラーがある場合は致命的なエラーとなり、サイトが停止するリスクもあります。

このため、PHPコードを直接eval()で実行するのではなく、ショートコードを介してファイルを読み込む方法で実行することが推奨されます。

さいごに

今回紹介した方法を使えば、テンプレートファイルのように管理でき、ショートコードを使用して任意の位置に外部ファイルを挿入できます。
functions.phpをクリーンに保ちながら、保守性の高い柔軟なサイト設計が可能になるため、ぜひ活用してみてください。

タイトルとURLをコピーしました