WordPress : héritage du thème enfant et chargement automatique php

Publié par Jean-Michel le

J’ai écrit cette méthode dans un parent eux qui chargera automatiquement une classe basée sur le nom de la classe, donc si le nom de la classe est : SomeFolder_Folder_Folder_Class.php alors il le convertira en : SomeFolder/Folder/Folder/Class.php et le chargera si ça existe:

public function load_class($class){
    $path = str_replace('_', '/', $class);
    if(file_exists(get_template_directory() . '/' . $path . '.php')){
        require_once(get_template_directory() . '/' . $path . '.php');
    }
}

Cela fonctionne en conjonction avec spl_autoload_register()pour réaliser cette fonctionnalité de « chargement automatique ». Ainsi, au lieu d’avoir un tas de require_once, vous faites simplement : new SomeFolder_Folder_Folder_Class()et il le charge automatiquement.

Cela fonctionne très bien dans le parent, et même dans le thème enfant lors du chargement de classes à partir du thème parent. Cependant, lorsque vous essayez de charger des classes à partir du thème enfant, cela échoue et indique qu’il ne peut pas trouver ladite classe.

Alors j’ai pensé faisons:

public function load_class($class){
    $path = str_replace('_', '/', $class);
    if(is_child_theme()){
        if(file_exists(get_template_directory() . '/' . $path . '.php')){
            require_once(get_template_directory() . '/' . $path . '.php');
        }
    }else{
        if(file_exists(get_template_directory() . '/' . $path . '.php')){
            require_once(get_template_directory() . '/' . $path . '.php');
        }
    }
}

Mais ensuite, les classes thématiques parentales commencent à paniquer en gémissant qu’elles sont introuvables, alors j’ai ajouté un nouveau niveau de complexité :

public function load_class($class){
    $path = str_replace('_', '/', $class);
    if(is_child_theme()){
        if(file_exists(get_stylesheet_directory() . '/' . $path . '.php')){
            require_once(get_stylesheet_directory() . '/' . $path . '.php');
        }else{
            if(file_exists(get_template_directory() . '/' . $path . '.php')){
                require_once(get_template_directory() . '/' . $path . '.php');
            }
        }
    }else{
        if(file_exists(get_template_directory() . '/' . $path . '.php')){
            require_once(get_template_directory() . '/' . $path . '.php');
        }
    }
}

Mais ensuite, nous sommes revenus à la case départ où vous ne pouvez pas trouver la classe à thème enfant ….

Donc – cela dit, que faire ? Comment faire fonctionner le chargeur automatique à la fois dans le thème parent et dans le thème enfant ?

Niveau de complexité supplémentaire ? les classes de thème enfant peuvent étendre et implémenter des classes de thème parent.

Les pensées?

Solution n°1 trouvée

utiliser à la locate_template()place.

public function load_class( $class ) 
{
    $path = str_replace('_', '/', $class);
    // returns a path when something was found
    $located = locate_template( $path, TRUE );

    return $located ? TRUE : FALSE;
}

Revenez toujours FALSEdans un chargeur automatique si vous n’avez pas trouvé la classe.

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *