web-dev-qa-db-fra.com

Ecraser le fichier de thème du plugin

J'essaie de construire un plugin qui remplacera un fichier du thème. Ce sera plugin pour certain thème qui a un fichier placé dans le dossier includes du chemin serait:

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

Cet exemple-fichier.php est chargé dans l'en-tête et le pied de page également via include

Je veux faire un plugin qui écraserait exemple-fichier.php afin que le thème inclue ce fichier depuis mon plugin et non le dossier includes du thème.

Comment est-ce possible, quel serait le meilleur moyen de le faire?

5
Usce

Manière WordPress (recommandée):

Dans votre plugin, utilisez le hook de filtre WordPress theme_file_path pour changer le fichier du plugin. Utilisez le code suivant dans votre plugin:

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;
}

Ensuite, vous pouvez inclure le fichier dans votre thème en utilisant la fonction get_theme_file_path , comme ceci:

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

Ici, si le fichier correspond au crochet de filtrage du plugin, la version du plugin du fichier sera incluse, sinon la version du thème sera incluse.

De même, même si le plugin est désactivé, le thème fonctionnera avec sa propre version du fichier sans aucune modification.

Contrôler le modèle de page à partir du plugin:

Si vous cherchez à contrôler les modèles de page à partir de votre plugin, vous pouvez consulter cette réponse pour voir comment le faire.

Façon PHP:

Si vous incluez le fichier wp-content/theme/<your-theme>/includes/example-file.php à l'aide d'un simple appel include avec chemin relatif dans l'en-tête, les modèles de pied de page se présentent comme suit:

include 'includes/example-file.php';

alors il est également possible de le remplacer par la version du fichier includes/example-file.php du plugin en utilisant la fonction PHP set_include_path().

De manière générale, pour inclure un fichier avec un chemin relatif, PHP recherche le fichier dans le répertoire en cours. Cependant, vous pouvez le manipuler pour que PHP le cherche d'abord dans un autre chemin. Dans ce cas, utilisez le PHP CODE suivant dans le fichier principal PHP de votre plugin pour inclure le répertoire du plugin dans le chemin d'inclusion par défaut de PHP:

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

Après cela, pour toute include avec un chemin relatif dans header.php, footer.php etc. etc. PHP recherchera le fichier dans le répertoire de votre plugin en premier.

Cependant, cette méthodene fonctionnera passi vous incluez le fichier en utilisant le chemin absolu dans votre en-tête, votre pied de page, etc.

6
Fayaz

Essayez celui-ci. Cela fonctionne si vous utilisez des modèles de page.

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