web-dev-qa-db-fra.com

Déclaration d'une instance de classe incluse dans le thème parent à partir du thème enfant functions.php

Veuillez noter que tout cela "fonctionne" - la question concerne la meilleure pratique et d'essayer de comprendre pourquoi je dois inclure le fichier PHP qui contient la classe à deux endroits pour que celle-ci fonctionne correctement .

Je travaille sur un thème parent simple pour accélérer mon propre cycle de développement - et suis sur le point de tester un thème enfant simple.

Je comprends que le fichier functions.php de l’enfant est appelé avant le functions.php parent, qui inclut toutes les fonctions PHP et une classe permettant d’ajouter des CPT.

J'aimerais créer le CPT à partir du thème enfant (je veux que le parent contienne toutes les fonctionnalités réutilisables et pouvant être mises à jour), mais pas pour pré-construire des fonctionnalités ajoutées dans chaque WP installation utilisée.

Pour la question de code:

J'ai essayé d'inclure la classe (qui se trouve dans un fichier séparé PHP) dans l'enfant functions.php, puis d'instancier une instance - par exemple:

require_once TEMPLATEPATH."/library/cpt/cpt.php"; // CPT class ##
$cpt_tree = new Custom_Post_Type( "tree" ); // New CPT - "tree" ##

Recharger la page donne une erreur:

Fatal error: Class 'Custom_Post_Type' not found in C:\xampp\htdocs\site\wordpress\wp-content\themes\child\functions.php on line 14

Alors, j’ai inclus le même fichier PHP dans le fichier functions.php parent - et tout fonctionne - comme expérience, j'ai supprimé la classe du thème enfant - et le résultat est identique.

Je sais que cette question manque beaucoup d’exemples de code - j’espère que ça va sonner le glas de quelqu'un - ou si quelqu'un qui comprend mieux utiliser Classes pourra me donner des indications - semble idiot de demander ce fichier à deux endroits et Je voudrais garder le fichier functions.php aussi propre que possible.

5
Q Studio

Traitez toute la charge de classe dans votre thème parent sur une action prévisible (point dans le temps) et accrochez-vous plus tard dans votre thème enfant.

Exemple:

add_action( 'wp_loaded', 'parent_prefix_load_classes', 10 );

function parent_prefix_load_classes()
{
    $classes = [ 'Extra_Comment_Walker', 'Extra_Nav_Menu_Walker' ];

    foreach ( $classes as $class )
    {
        locate_template( "php/class.$class.php", TRUE, TRUE );
    }
}

Créez des instances dans votre thème enfant, assurez-vous que votre code s'exécute une fois les classes chargées:

// Priority 11 to run after the parent theme's loader.
add_action( 'wp_loaded', 'child_prefix_create_objects', 11 );

function child_prefix_create_objects()
{
    $nav_walker = new Extra_Nav_Menu_Walker;
}

Règles de base:

  • Ne chargez rien lorsque le fichier (function.php) est appelé. Attendez wp_loaded.
  • Utilisez l'argument de priorité pour contrôler l'ordre d'exécution.

Quelques notes:

  • Les types de post personnalisés, les taxonomies et les codes courts appartiennent aux plugins. Ils ne devraient jamais faire partie d'un thème, car cela créerait un effet de verrouillage pour l'utilisateur. Si un changement de thème casse le contenu, vous faites une erreur.
  • N'utilisez pas require_once dans un thème. locate_template() est plus flexible. Vous pouvez écraser toute la classe maintenant dans votre thème in-child si vous utilisez la même structure de répertoires.
5
fuxia