web-dev-qa-db-fra.com

Inclure les fichiers dans les thèmes enfants, déclarer dans functions.php

J'utilise un thème pour enfants. Je souhaite modifier un fichier qui réside actuellement dans:

mybasetheme> comprend> sf-content-display> sf-post-layouts.php

J'ai donc copié exactement la même structure de fichier dans mon thème enfant et copié le fichier par dessus:

mychildtheme> comprend> sf-content-display> sf-post-layouts.php

Mais la valeur par défaut est-elle toujours celle du thème de base?

Parce que c’est dans includes je me suis demandé s’il s’agissait du fichier functions.php qui l’appelait. J'ai donc créé un nouveau fichier functions.php dans mon thème enfant, comme suit:

<?php

// Functions specific to child-theme

require_once( get_stylesheet_directory() . '/includes/sf-content-display/sf-post-formats.php' );

Mais maintenant, je vois que cela ne fonctionnera jamais, car le thème de base functions.php l'appelle déjà:

>include(SF_INCLUDES_PATH . '/sf-content-display/sf-post-formats.php');

Alors j'obtiens cette erreur:

Impossible de redéclarer sf_get_post_media () (précédemment déclaré dans /Applications/MAMP/htdocs/syyco/wp-content/themes/flexform-child/includes/sf-content-display/sf-post-formats.php:15) dans/Applications/MAMP/htdocs/syyco/wp-content/themes/flexform/includes/sf-content-display/sf-post-formats.php en ligne 36

Alors qu'est-ce que je fais? Je ne peux pas obliger le thème enfant à inclure mon nouveau fichier sans éditer le thème de base, ce qui gâche le point d'avoir un thème enfant.

1
Francesca

En ce qui concerne la hiérarchie des modèles, WordPress cherchera en effet dans le répertoire du thème enfant avant de se charger à partir du thème principal.

Pour tous les autres fichiers WordPress non spécifiques (comme les fonctions et les inclusions tierces), le choix du chargement dépend du thème principal.

À moins que le thème utilise locate_template pour charger ces éléments inclus ou vérifie d'abord le répertoire de la feuille de style (thème enfant), les remplacements de fichier dans le thème enfant n'auront aucun effet.

Si les fonctions sont encapsulées dans if ( ! function_exists( ..., l'auteur a autorisé le remplacement et vous pouvez simplement écrire votre propre version de la fonction dans le functions.php de votre thème enfant.

Si cela ne fonctionne pas, recherchez les fonctions do_action( ... ) ou apply_filters( ... ) autour du code que vous souhaitez modifier - il s'agit de votre dernier port d'escale pour le comportement par défaut de votre thème enfant (consultez le codex sur les crochets ).

Si aucun des éléments ci-dessus n'a été mis en œuvre par l'auteur d'origine, vous avez l'une des deux options suivantes: éditez le thème d'origine ou contactez l'auteur et demandez à implémenter une API pour les thèmes enfants.

1
TheDeadMedic

En résumé, de nombreux auteurs de thèmes (je le fais également) ont tendance à organiser leurs fonctions dans des fichiers plus petits et plus faciles à gérer, en dehors du fichier functions.php normal. Cela facilite la localisation d’une certaine fonction, mais aussi l’organisation et le regroupement de fonctions relatives à un certain aspect du site.

Exemple rapide:

Dans mon thème, j'ai un fichier appelé comments-functions.php. Dans ce fichier, j'ajoute toutes les fonctions liées à la section commentaire de mon thème.

Comme je l'ai dit, tout cela est fait pour organiser le code, à la fin de la journée, qui veut parcourir 2 000 lignes de code pour une fonction spécifique.

Tous ces fichiers de fonctions plus petits sont ensuite appelés dans le fichier functions.php principal pour les enregistrer et les utiliser.

Lors de la création d'un thème enfant, vous n'avez pas besoin de vous en tenir à cette structure de fichier, vous pouvez simplement ajouter/supprimer/modifier des fonctions dans le fichier functions.php de votre thème enfant. Si vous créez vraiment un thème enfant ayant une fonction, créez simplement un fichier functions.php et ajoutez-y votre fonction.

Le fichier functions.php d'un thème enfant est chargé avant le parent; toutes les fonctions encapsulées dans une balise conditionnelle if(!function_exists('function_name')) peuvent simplement être copiées et modifiées dans un thème enfant. Cette fonction modifiée conserve le nom de la fonction parent. La fonction parent sera ignorée lorsqu’elle est supposée se charger. C'est laSEULEheure à laquelle une fonction peut être redéclarée, c'est-à-dire que deux fonctions ont le même nom.

Si une fonction parent n'est pas encapsulée, vous avez les choix suivants

  • si la fonction est autonome, copiez-la dans le thème enfant, renommez-la et modifiez-la si nécessaire. Ce type de fonction aura un rappel quelque part. Recherchez donc cette fonction dans les modèles parent, copiez ce modèle spécifique dans votre thème enfant et remplacez le nom de la fonction parent par votre nouvelle fonction enfant. Pas besoin de vous soucier de supprimer ou de faire quoi que ce soit avec la fonction parent. Exemple, si le nom du thème parent est parent_function() et qu'il est appelé dans index.php, copiez index.php sur votre thème enfant et remplacez parent_function() par votre fonction enfant, par exemple, child_function().

  • Si une fonction est liée à une action ou à un filtre spécifique, vous devez la supprimer une fois qu'elle est enregistrée. Voir Supprimer des actions et des filtres . Vous pouvez maintenant enregistrer une nouvelle fonction et la relier au même raccord que le thème parent. Rappelez-vous simplement que la priorité est très importante ici, exécuter le mauvais ordre échouera.

1
Pieter Goosen

Il suffit de modifier uniquement la fonction que vous souhaitez modifier. Voir ce post

1) Copiez (en entier) la fonction que vous souhaitez remplacer par le thème parent.

2) Collez-le dans functions.php à la racine du dossier de votre thème enfant. Si functions.php n’existe pas, créez-le.

3) Renommez la fonction de parent_theme_function en child_theme_function.

4) Désactiver la fonction parent.

5) Activer la fonction enfant.

0
Shail