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.
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:
function.php
) est appelé. Attendez wp_loaded
.Quelques notes:
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.