web-dev-qa-db-fra.com

Thème extensible PHP classe en plugin

J'essaie de créer un plugin qui me permet d'étendre une classe définie dans un thème particulier.

Le thème a une classe de 'ET_Builder_Module'

Dans le thème, diverses autres classes définies vont dans ce sens, par exemple:

class ET_Builder_Module_Blurb extends ET_Builder_Module

Je voudrais ajouter mes propres classes pour étendre le thème, mais l'erreur suivante apparaît:

Fatal error: Class 'ET_Builder_Module' not found

J'ai utilisé le code suivant:

class NOOU_ET_Builder_Test_Module extends ET_Builder_Module

J'ai simplement copié et collé une des classes du thème et renommé la classe

Est-ce que quelqu'un pourrait me montrer comment étendre une classe à partir d'un thème dans un plugin?

1
Ben H

Rendez votre classe visible à PHP après le thème a déclaré la classe parente.

Les plugins sont chargés en premier, le thème peut-être plus tard. Cela peut être annulé.

Le code de thème est disponible lorsque l'action after_setup_theme est déclenchée. Vous pouvez donc l'utiliser comme ceci:

add_action( 'after_setup_theme', function() {
    require 'ChildClass.php';   
});

Toutefois, si le thème charge la classe parent ultérieurement, vous risquez de rencontrer le même problème: vous ne savez pas quand il est réellement disponible.

L'alternative est un chargeur automatique : ne chargez pas les classes à l'avance. Laissez PHP attendre la création d'une nouvelle instance d'une classe, puis laissez un autochargeur enregistré inclure le fichier approprié.

Voici un exemple trop simple que vous pouvez mettre dans le fichier principal de votre plugin. Assurez-vous que le nom du fichier correspond au nom de la classe, par exemple. ET_Builder_Module_Blurb.php.

spl_autoload_register( function( $name ) {

    $path = __DIR__ . "/$name.php";

    if ( file_exists( $path ) )
        require $path;
});
1
fuxia