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;
参考ソース:template.php in tags/3.7.1/src/wp-includes – WordPress Trac