web-dev-qa-db-fra.com

get_stylesheet_directory () vs get_template_directory () pour le thème enfant

Disons que j'ai le fichier suivant dans mon dossier de thème parent: 'theme-folder/inc/custom.php'

Ensuite, j'ai créé un thème pour enfants.

Comment puis-je vérifier si ce fichier existe dans le thème enfant, puis le récupérer, sinon le chercher dans le thème parent?

get_template_directory() récupère toujours le fichier à partir du thème parent.

Alors que get_stylesheet_directory() nécessite que le fichier existe dans le thème enfant.

6
Ahmed Saad

locate_template tentera de trouver le fichier spécifié dans le thème enfant et reviendra au thème parent s'il n'existe pas:

locate_template('inc/custom.php', true);

Si vous définissez le second paramètre sur true, le fichier est requis au lieu de simplement déterminer le chemin.

Comme son nom l'indique, locate_template est destiné au chargement de fichiers de modèle. Il comporte des frais généraux supplémentaires dont vous n’auriez probablement pas besoin pour charger des bibliothèques. Une version allégée serait:

function load_theme_file($path) {
    if ( file_exists( STYLESHEETPATH . '/' . $path )) {
        include( STYLESHEETPATH . '/' . $path );
    } else {
        require( TEMPLATEPATH . '/' . $path );
    }
}

Usage:

load_theme_file('inc/custom.php');

Edit: Je voulais juste fournir une note rapide sur les problèmes potentiels avec cette approche globale.

Laisser un thème enfant remplacer les fichiers fonctionne bien pour les modèles, mais pour les bibliothèques, les erreurs sont plus importantes. Si un thème enfant doit modifier une seule fonction, vous devez copier l'intégralité de ce fichier en remplaçant toutes les fonctions de ce fichier dans le processus.

Si le thème parent est mis à jour et que des modifications ont été apportées à l'une des fonctions du fichier écrasé, des problèmes peuvent survenir. Vous pouvez atténuer ce problème en scindant vos bibliothèques en plusieurs morceaux, mais cela peut compliquer la maintenance de votre base de code.

Une meilleure solution, à mon avis, consiste à utiliser une approche orientée objet. Autorisez un thème enfant à extend classes que vous définissez, puis utilisez la classe du thème enfant. Dans les classes d'implémentation, le thème enfant n'aurait plus qu'à définir les méthodes à écraser. Dans le thème parent, vous pouvez spécifier les méthodes à ne pas écraser en les rendant final.

Vous pouvez également limiter le besoin de thèmes enfants pour remplacer des fichiers entiers en utilisant généreusement les filtres et les actions.

3
Mathew Tinsley

get_template_part() ferais cela, si je comprends votre question.

get_template_part('inc/custom');

C'est en quelque sorte construit pour faire exactement cela, si je vous lis bien:

Il est facile pour un thème de réutiliser des sections de code et un moyen simple pour les thèmes enfants de remplacer des sections de leur thème parent.

2
s_ha_dum