web-dev-qa-db-ja.com

テーマファイルをプラグインから上書きする

テーマから1つのファイルを置き換えるプラグインを作成しようとしています。それはパスへのインクルードフォルダに配置されたファイルを持っている特定のテーマのためのプラグインになります:

wp-content/theme/includes/example-file.php

このexample-file.phpはinclude経由でもヘッダーとフッターにロードされます。

Themeがテーマのincludesフォルダではなく、自分のプラグインからそのファイルを含むように、example-file.phpを上書きするプラグインを作りたいです。

それはどのように可能です、これをするための最良の方法は何でしょうか?

5
Usce

WordPressの方法(推奨):

プラグインで、WordPressのtheme_file_pathフィルタフックを使ってプラグインからファイルを変更します。プラグインに次のコードを使用してください。

add_filter( 'theme_file_path', 'wpse_258026_modify_theme_include_file', 20, 2 );
function wpse_258026_modify_theme_include_file( $path, $file = '' ) {
    if( 'includes/example-file.php' === $file ) {
        // change path here as required
        return plugin_dir_path( __FILE__ ) . 'includes/example-file.php';
    }
    return $path;
}

次に、 get_theme_file_path 関数を使用して、ファイルをテーマに含めます。

include get_theme_file_path( 'includes/example-file.php' );

ここで、ファイルがプラグインのフィルタフックに一致すると、ファイルのプラグインバージョンが含まれます。それ以外の場合は、テーマバージョンが含まれます。

また、この方法では、プラグインが無効になっていても、テーマは変更されずに独自のバージョンのファイルで動作します。

プラグインからページテンプレートを制御する:

あなたが自分のプラグインからコントロールするページテンプレートを探しているなら、あなたは この答えをチェックアウトすることができます それを行う方法を見るために。

PHPの方法:

相対パス ヘッダー内の単純なinclude呼び出しを使用してwp-content/theme/<your-theme>/includes/example-file.phpファイルをインクルードする場合、フッターテンプレートは次のようになります。

include 'includes/example-file.php';

PHP set_include_path()関数を使ってプラグインのバージョンのincludes/example-file.phpファイルに置き換えることも可能です。

一般的に言って、相対パスでファイルをインクルードするために、PHPは現在のディレクトリでファイルを探します。ただし、PHPが最初に別のパスで検索するように操作することができます。その場合は、プラグインのメインのPHPファイルで次のPHPコードを使用して、プラグインのディレクトリをPHPのデフォルトのインクルードパスに含めます。

set_include_path(  plugin_dir_path( __FILE__ ) . PATH_SEPARATOR . get_include_path() );

その後、header.phpfooter.phpなどの相対パスを持つincludeについては、PHPはまずプラグインのディレクトリでファイルを探します。

ただし、このメソッドでは、ヘッダー、フッターなどに絶対パスを使用してファイルをインクルードすると、機能しませんとなります。

6
Fayaz

これを試してください。ページテンプレートを使用している場合、これは機能します。

add_filter("page_template", "plugin_function_name");
function plugin_function_name($page_template)
{
   $id = substr($page_template, strrpos($page_template, '/') + 1);
   if ($id == 'includes/example-file.php') {
    $page_template = plugin_dir_path(__FILE__) . 'includes/example-file.php';
   }
   return $page_template;
}
0
Sonali