Si j'utilise l'un des frameworks populaires tels que Genesis, est-il possible de créer des thèmes de petits-enfants?
Par exemple, je veux utiliser Genesis comme l’épine dorsale de tous mes sites. Genesis est appelé un framework mais est en réalité un thème parent.
Ensuite, je sélectionne l'un des thèmes enfants Genesis en vente chez StudioPress et je souhaite continuer à le personnaliser pour chacun de mes sites. Est-ce que je créerais un thème de petits-enfants pour tous mes sites, et comment pourrais-je m'y prendre?
Oui et non.
Vous pouvez créer un thème enfant spécifiant un autre thème enfant en tant que parent et WordPress tentera de l'utiliser.
Cependant
Vous rencontrerez des problèmes, sans compter que les développeurs principaux ont explicitement déclaré qu'il ne s'agissait pas d'un comportement souhaitable et qu'ils ne feraient aucun effort pour prendre en charge les thèmes de petits-enfants.
Par exemple, les API WP font la distinction entre les URL/répertoires de feuille de style et de modèle, où feuille de style fait toujours référence au thème actif et où modèle se rapporte au thème parent. Toutefois, si un thème de grands-parents est inclus, get_template_directory_uri
fait référence à le parent ou le grand-parent? De nombreux appels d'API sont maintenant ambigus et différentes personnes pourraient s'attendre à un comportement différent, notamment du code essentiel. Vous devez également charger le functions.php
du parent ou du grand-parent et vous assurer que tout est fait dans le bon ordre.
C'est aussi considéré comme une très mauvaise pratique. Si vous avez besoin de thèmes de petits-enfants, votre approche a mal tourné et vous devez prendre du recul et réévaluer les choses.
Je vous conseillerais d'éviter le concept de thèmes de petits-enfants, cela entraînerait plus de problèmes. Au lieu de cela, davantage d'actions de filtres de crochets et de modularité dans votre thème enfant devraient vous permettre de conserver les composants partagés des thèmes enfants et de vous permettre de créer des branches/fonctions de branche avec peu de difficulté. Essayez de déplacer des éléments communs dans un sous-module svn external/git.
Il y a aussi le modèle _s où vous avez votre thème enfant comme base et le bifurquez, plutôt que de l'avoir en tant que parent avec l'intention de travailler sur la copie, plutôt qu'un enfant/substitution.
Je n'ai pas complètement testé la méthode décrite ci-dessous, ni un thème "petit-enfant" normal, mais en donnant les fonctionnalités du template_include filter:
/*
Plugin Name: Grandchild Themes
Plugin URI: http://www.who-cares.com/
Description: A concept for Grandchild themes Plugin
Author: See Plugin URI
Version: 0.0.0.0.1-Alpha
*/
add_action('wp_head', 'grnd_chld_add_headers', 0);
add_action('init', 'grnd_chld_add_css');
// Load template if exists.
function grandchild_template_include( $template ) {
if ( file_exists( untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template ) ) )
$template = untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template );
return $template;
}
// This is the actual filter that we want .
add_filter( 'template_include', 'grandchild_template_include', 11 );
function grnd_chld_add_headers () {
wp_enqueue_style('my_grandchild_style');
}
function grnd_chld_add_css() {
$stamp = @filemtime(plugin_dir_path(__FILE__).'/style.css'); // easy versioning
wp_register_style ('my_grandchild_style', plugins_url('style.css', __FILE__).'', array(), $stamp);
}
// From here , what you got is like a normal functions.php.
Vous pouvez également, de la même manière, essayer des filtres plus spécifiques comme par exemple archive_template
add_filter ('archive_template', create_function ('', 'return plugin_dir_path(__FILE__)."archive.php";'));
Cela dit, je ne suis pas sûr que ce soit la meilleure façon de faire les choses.