WordPress – ショートコードで本文中にテンプレートファイル(PHP)を読み込む

WordPress
この記事は約7分で読めます。
スポンサーリンク

私の場合、WordPressで、例えばトップページに任意のカテゴリーの最新記事のみを任意の件数だけ取得して表示したい場合など、本文中にテンプレートファイルを読み込ませたいことがありました。
頻繁に変わる内容や大量のコードを別ファイルで管理したいといった理由で、テンプレートファイルを読み込みたい場合もあると思います。
そんな時、functions.phpにコードを追加するだけでそれが可能になります。

スポンサーリンク

WordPressの記事本文中にPHPファイルを読み込むショートコードを作る

WordPressのテーマ(子テーマ)の functions.php ファイルに追記します。

以下のコードで、[my_temp file=’ファイル名’] というショートコードが出来ます。なので、ファイル名を変えて複数のファイルに対応できます。
このコードでは、読み込むテンプレートファイルはスタイルシートがあるディレクトリに置いています。

PHP
//PHPファイルを読み込むショートコード作成
function my_temp_Include($atts) {
 extract(shortcode_atts(array('file' => 'default'), $atts));
 ob_start();
 include(STYLESHEETPATH . "/$file.php");
 return ob_get_clean();
}
add_shortcode('my_temp', 'my_temp_Include');

例えば、テーマ(子テーマ)のスタイルシートがあるディレクトリに置く my-info.php というを本文中に読み込みたい場合は、下記のようにショートコードを書きます。

[my_temp file='my-info']

簡単な各所の解説

shortcode_atts( $pairs , $atts)
ショートコードに指定した属性を、予め定義した属性(上記コードでは file )と結合し、必要に応じてデフォルト値(上記コードでは default )をセットします。結果は配列で、キーが予め定義された属性(上記コードでは file )、値が指定された属性値を結合したものになります。
なお、第1パラメータで存在しない属性を第2パラメータで指定したとしても無視されますので、上記の場合、属性(キー)は file となり、キーが文字列の場合の結合は後優先で値が上書きされますので下記のようなイメージです。

PHP
//配列の結合のイメージ
$pairs = array('file' => 'default');
$atts = array('file' => 'my-info');
print_r(array_merge($pairs, $atts));

//上記による出力
Array ( [file] => my-info )
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
extract( $array )
配列から変数を作成($file)します。
PHP: extract - Manual
ob_start()
出力バッファリングを有効にします。
PHP: ob_start - Manual
include()
指定された外部ファイルを読み込みます。
PHP: include - Manual
ob_get_clean()
現在のバッファの内容を取得し、出力バッファを削除します。
PHP: ob_get_clean - Manual
add_shortcode( $tag , $func )
ショートコードタグ用のフックを追加
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

ちなみに任意のカテゴリーの最新記事6件を取得して表示する場合に読み込むテンプレートファイルの中身は下記のような感じです。

PHP
<div class="my-info-container">
<?php
$args = array(
  'post_type' => array( 'post' ), //投稿タイプ
  'cat' => 3, //表示カテゴリ
  'paged' => $paged,
  'posts_per_page' => 6 //取得件数
  );3
?>
<?php $the_query = new WP_Query( $args ); ?>

<?php
//一覧の繰り返し処理
$count = 0;
if ($the_query->have_posts()) : //WordPressループ
  while ($the_query->have_posts()) : $the_query->the_post(); //繰り返し処理開始
?>
  <a href="<?php echo esc_url(get_the_permalink()); ?>" class="my-info" title="<?php echo esc_attr(get_the_title()); ?>">
    <dl>	
      <dt><?php echo get_the_date("Y.m.d"); ?></dt>
      <dd><span><?php the_title(); ?></span></dd>
    </dl>
  </a>
<?php endwhile; //繰り返し処理終了 ?>
<?php else : //ここから記事が見つからなかった場合の処理 ?>
  <div class="posts-not-found">
    <h2>NOT FOUND</h2>
    <p>投稿が見つかりませんでした。</p>
  </div>
<?php endif; ?>
</div>

<?php wp_reset_postdata(); ?>

以上、ご参考になれば幸いです。

ありがとうございます。
皆さまにすべての良きことが雪崩のごとく起きますように。

コメント

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