web-dev-qa-db-fra.com

Ajout de points d’action dans le thème parent pour faciliter la personnalisation du thème enfant

Je me demandais pourquoi personne (ne pouvant en trouver aucun) n'ajoute de points d'ancrage personnalisés au début et à la fin du function.php du thème pour le développement du thème.

La raison pour laquelle je pose cette question est lors de la création d'un thème enfant, j'ai dû écraser certaines configurations par défaut, telles que les tailles d'image définies dans le function.php du thème parent (pas de !function_exists à écraser). Donc tout ce que j'écris dans le function.php de mon enfant sera écrasé.

Mis à part l'ajout de l'encapsuleur function_exists, la solution que j'avais en tête consistait simplement à ajouter une do_action() au début et à la fin du fichier function.php. Mais est-ce une mauvaise pratique? Si oui, pourquoi?

Je suis incapable de trouver des réponses ou quelqu'un qui demande cela n'importe où.

4
Bobby

Le code dans un functions.php (ou tout fichier chargé par ce fichier) ne doit pas s'exécuter automatiquement, par exemple. quand le fichier est inclus. Tout le code doit être lié à des crochets.
Cela signifie que vous n’avez pas besoin d’une action spéciale dans le thème parent. Le thème enfant peut désactiver tous les rappels de thème parent avec remove_action() et remove_filter().

Mais vous pouvez faciliter la tâche aux auteurs de thèmes enfants en ajoutant une action personnalisée après avoir enregistré les rappels.

Exemple

Thème parent

namespace ParentTheme;
// register callbacks
add_action( 'after_setup_theme', __NAMESPACE__ . '\setup_custom_background' );
add_action( 'after_setup_theme', __NAMESPACE__ . '\setup_custom_header' );
add_filter( 'body_class',        __NAMESPACE__ . '\enhance_body_class' );

// provide an entry point
do_action( 'parent_theme_loaded', __NAMESPACE__ );

Thème enfant

add_action( 'parent_theme_loaded', function( $namespace )
{
    remove_action( 'after_setup_theme', $namespace . '\setup_custom_header' );
});

Voir aussi cet exemple similaire pour les versions obsolètes PHP.


Si votre thème parent ignore le principe de séparation des problèmes et mélange tout en une ou deux fonctions d'installation, utilisez une priorité ultérieure et écrasez les appels suivants:

Thème parent

add_action( 'after_setup_theme', 'some_setup_function' ); // priority = 10

Thème enfant

add_action( 'after_setup_theme', 'fix_theme_setup', 11 ); // priority = 11

function fix_theme_setup()
{
    remove_theme_support( 'post-formats' );
    // more changes here
}
7
fuxia