[WordPress]テンプレートファイルをプラグインフォルダ内のファイルに置き換える

  • 更新日:
  • 公開日:

WordPressの親・子テーマが編集できない場合、プラグインによるカスタマイズが必要となります。

そんなときにプラグインからテンプレートファイルを置き換える方法について。

テンプレートファイルの置き換え方法

プラグインからtemplate_includeフックでメソッドを実行します。

プラグインのフォルダ構造

custom-plugin
│  custom-plugin.php
└─templates
        archive.php
        single.php

実際のコード例

投稿タイプworksのアーカイブや詳細ページのテンプレートを置き換える場合は以下のようにします。

<?php
if ( ! defined( 'ABSPATH' ) ) exit;

define( 'MY_CUSTOM_PLUGIN', __FILE__ );
define( 'MY_CUSTOM_PLUGIN_DIR', untrailingslashit( dirname( MY_CUSTOM_PLUGIN ) ) );

class Customize_Plugin {
    function __construct() {
        // フック
        add_filter( 'template_include', array( $this, 'template_replacement' ), 10 );
    }

    // テンプレートの置き換え
    function template_replacement( $template_path ) {
        // worksアーカイブの場合
        if( is_post_type_archive( 'works' ) ) {
            $theme_file = MY_CUSTOM_PLUGIN_DIR . '/templates/archive.php';

            $template_path = $theme_file;
        }

        // works詳細の場合
        if ( is_singular( 'works' ) ) {
            $theme_file = MY_CUSTOM_PLUGIN_DIR . '/templates/single.php';

            $template_path = $theme_file;
        }

        return $template_path;
    }
}

new Customize_Plugin();

get_template_partを使っている箇所の対応

get_template_part()はどうやら読み込みファイルを変更するフックがないようでした。

なので、以下のようにincludeを使った読み込みに変更する必要があります。

while ( have_posts() ) :

    the_post();

    include MY_CUSTOM_PLUGIN_DIR . '/templates/content.php';

endwhile;

参考スレッド:get template part – How to include a file using get_template_part() in a plugin? – WordPress Development Stack Exchange

参考ソース:template.php in tags/3.7.1/src/wp-includes – WordPress Trac

書いた人

Symbol Mark

Ryoichi(しつ)

除菌ティッシュを買い込んで使いきれずによく乾かす人。

療養目的で退職し、どうやって生きていくか模索中。最近は勉強目的でLaravelやVue.js弄ったり、趣味で音で遊んでます。

※2019年10月16日現在ブログリニューアル中です。崩れなどが発生していたらすみません。

うぇぶ: @s_ryone