Est-il possible de faire des thèmes de petits-enfants?

15

Si j'utilise l'un des frameworks populaires tels que Genesis, est-il possible de créer des thèmes de petits-enfants?

À titre d'exemple, je souhaite utiliser Genesis comme colonne vertébrale de tous mes sites. Genesis est appelé un cadre mais est en fait un thème parent.

Ensuite, je sélectionne l'un des thèmes enfants Genesis à vendre sur StudioPress, et je souhaite continuer à le personnaliser pour chacun de mes sites. Est-ce que je créerais un thème de petit-enfant pour tous mes sites, et comment pourrais-je m'y prendre?

urok93
la source

Réponses:

17

Oui et non.

Vous pouvez créer un thème enfant en spécifiant un autre thème enfant comme parent, et WordPress tentera de l'utiliser.

pourtant

Vous rencontrerez des problèmes, sans oublier que les principaux développeurs ont explicitement déclaré que ce n'est pas un comportement souhaitable, et qu'ils ne feront aucun effort pour prendre en charge les thèmes des petits-enfants.

Par exemple, les API WP font une distinction entre la feuille de style et les URL / répertoires de modèle, où la feuille de style fait toujours référence au thème actif et le modèle fait référence au thème parent, mais si un thème de grand-parent est inclus, fait-il get_template_directory_uriréférence au parent ou au grand-parent? De nombreux appels d'API sont désormais ambigus, et différentes personnes s'attendent à un comportement différent, y compris du code qui est au cœur. Vous devez également charger le functions.phpparent ou le grand-parent et vous assurer qu'il est effectué dans le bon ordre.

C'est également considéré comme une très mauvaise pratique. Si vous avez besoin de thèmes de petits-enfants, votre approche a pris une mauvaise tournure et vous devez prendre du recul et réévaluer les choses.

Je vous conseille d'éviter le concept de thèmes de petits-enfants, cela entraînera plus de problèmes. Au lieu de cela, plus de hooks filtrent les actions et la modularité de votre thème enfant devraient vous permettre de garder les composants partagés des thèmes enfants identiques, et vous permettre de vous brancher / bifurquer 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 fork, plutôt que de l'avoir comme parent avec l'intention de travailler sur la copie, plutôt que comme enfant / remplacement.

Tom J Nowell
la source
Donc dans mon cas, si je choisis Genesis, je devrai juste modifier le thème enfant directement, non? Pas très familier avec Git, mais serait intéressé par une approche qui m'aide à garder intact le thème enfant original.
urok93
Oui, vous n'avez pas beaucoup d'options ici.
Tom J Nowell
Je me demande ce qui se passerait si vous essayiez de créer un arrière-petit-fils.
Chris_O
1
Vous mentionnez que la méthode a pris une mauvaise tournure si vous en avez besoin. La raison pour laquelle je suis curieux à ce sujet est à cause d'un scénario comme l'utilisation du thème WooCommerce Storefront. Ils vendent des thèmes enfants à la vitrine qui sont personnalisés pour diverses choses. Donc, si j'utilise l'un de leurs thèmes enfants, mais je veux ensuite apporter mes propres modifications d'une manière qui ne sera pas écrasée lors de la mise à jour de leur thème enfant ... comment faire?
Drew Angell
1
Je ne sais pas, c'est une limitation de la façon dont le thème de la vitrine a été construit, à ce stade, vous êtes obligé de bifurquer le thème enfant
Tom J Nowell
3

Je n'ai pas entièrement testé la méthode décrite ci-dessous, ni un thème "petit-enfant" normal, mais en donnant la fonctionnalité du filtre template_include :

    /*
    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";'));

Tout cela dit et fait, je ne suis pas sûr que ce soit la meilleure façon de faire les choses.

krembo99
la source