Si vous arrivez au point où le code de votre thème functions.php
commence à vous submerger, je dirais certainement que vous êtes prêt à envisager de le scinder en plusieurs fichiers. J'ai tendance à le faire presque par seconde nature à ce stade.
Utilisez les fichiers d'inclusion dans le functions.php
fichier de votre thème
Je crée un sous-répertoire appelé "includes" dans mon répertoire de thèmes et segmente mon code en fichiers include organisés en fonction de ce qui a du sens pour moi à ce moment-là (ce qui signifie que je suis constamment en train de refactoriser et de déplacer le code au fur et à mesure que le site évolue.) mettre n'importe quel code réel dans functions.php
; tout se passe dans les fichiers inclus; juste ma préférence.
Juste pour vous donner un exemple, voici mon installation de test que j'utilise pour tester mes réponses aux questions ici sur WordPress Answers. Chaque fois que je réponds à une question, je garde le code au cas où j'en aurais besoin à nouveau. Ce n'est pas exactement ce que vous ferez pour un site actif, mais cela montre la mécanique de la division du code:
<?php
/*
* functions.php
*
*/
require_once( __DIR__ . '/includes/null-meta-compare.php');
require_once( __DIR__ . '/includes/older-examples.php');
require_once( __DIR__ . '/includes/wp-admin-menu-classes.php');
require_once( __DIR__ . '/includes/admin-menu-function-examples.php');
// WA: Adding a Taxonomy Filter to Admin List for a Custom Post Type?
// http://wordpress.stackexchange.com/questions/578/
require_once( __DIR__ . '/includes/cpt-filtering-in-admin.php');
require_once( __DIR__ . '/includes/category-fields.php');
require_once( __DIR__ . '/includes/post-list-shortcode.php');
require_once( __DIR__ . '/includes/car-type-urls.php');
require_once( __DIR__ . '/includes/buffer-all.php');
require_once( __DIR__ . '/includes/get-page-selector.php');
// http://wordpress.stackexchange.com/questions/907/
require_once( __DIR__ . '/includes/top-5-posts-per-category.php');
// http://wordpress.stackexchange.com/questions/951/
require_once( __DIR__ . '/includes/alternate-category-metabox.php');
// http://lists.automattic.com/pipermail/wp-hackers/2010-August/034384.html
require_once( __DIR__ . '/includes/remove-status.php');
// http://wordpress.stackexchange.com/questions/1027/removing-the-your-backup-folder-might-be-visible-to-the-public-message-generate
require_once( __DIR__ . '/includes/301-redirects.php');
Ou créer des plugins
Une autre option est de commencer à regrouper votre code par fonction et de créer vos propres plugins. Pour moi, je commence à coder dans le functions.php
fichier du thème et au moment où je complète le code, j'ai transféré la plupart de mon code dans des plugins.
Cependant, AUCUN gain de performance significatif de l'organisation du code PHP
D'autre part, structurer vos fichiers PHP concerne 99% de la création d'ordre et de maintenabilité et 1% de performances, si cela (l'organisation .js
et les .css
fichiers appelés par le navigateur via HTTP est un cas complètement différent et a d'énormes implications en termes de performances.) Mais comment vous organisez votre code PHP sur le serveur n'a pas beaucoup d'importance du point de vue des performances.
Et l'organisation du code est la préférence personnelle
Enfin, l'organisation du code est une préférence personnelle. Certaines personnes détesteraient la façon dont j'organise le code, tout comme je le ferais peut-être aussi. Trouvez quelque chose que vous aimez et respectez-le, mais laissez votre stratégie évoluer avec le temps, à mesure que vous en apprendrez plus et en deviendrez plus à l'aise.
Réponse tardive
Comment inclure vos fichiers correctement:
La même chose fonctionne aussi dans les plugins.
Comment obtenir le bon chemin ou URi
Jetez également un coup d'œil aux fonctions de l'API du système de fichiers telles que:
home_url()
plugin_dir_url()
plugin_dir_path()
admin_url()
get_template_directory()
get_template_directory_uri()
get_stylesheet_directory()
get_stylesheet_directory_uri()
Comment réduire le nombre de
include/require
Si vous devez récupérer tous les fichiers d'un répertoire, allez avec
Gardez à l'esprit que cela ignore les échecs (peut-être bons pour une utilisation en production) / les fichiers non chargeables.
Pour modifier ce comportement, vous pouvez utiliser une configuration différente au cours du développement:
Edit: approche OOP / SPL
Alors que je revenais juste et que je voyais que cette réponse recevait de plus en plus de votes positifs, j'ai pensé montrer comment je le fais aujourd'hui - dans un monde PHP 5.3+. L'exemple suivant charge tous les fichiers d'un sous-dossier de thèmes nommé
src/
. C'est là que mes bibliothèques gèrent certaines tâches telles que les menus, les images, etc. Vous n'avez même pas à vous soucier du nom car chaque fichier est chargé. Si vous avez d'autres sous-dossiers dans ce répertoire, ils sont ignorés.Le
\FilesystemIterator
est du PHP de supercedor sur\DirectoryIterator
. Les deux font partie du PHP SPL. Bien que PHP 5.2 ait permis de désactiver l'extension SPL intégrée (moins de 1% de toutes les installations l'ont fait), le SPL fait maintenant partie du noyau PHP.Auparavant, alors que je soutenais encore PHP 5.2.x, j’utilisais la solution suivante: A
\FilterIterator
dans lesrc/Filters
répertoire pour récupérer uniquement les fichiers (et non les pointeurs de dossiers) et a\DirectoryIterator
pour effectuer la mise en boucle et le chargement.Le
\FilterIterator
était aussi simple que cela:En plus de PHP 5.2 mort / EOL maintenant (et 5.3 également), il y a plus de code et un fichier de plus dans le jeu, il n'y a donc aucune raison de continuer avec ce dernier et de supporter PHP 5.2.x.
Résumé
Un article encore plus détaillé peut être trouvé ici sur WPKrauts .
EDIT La manière évidente consiste à utiliser le
namespace
code d, préparé pour le chargement automatique du PSR-4, en plaçant tout dans le répertoire approprié déjà défini via l’espace de nom. Ensuite, utilisez simplement Composer et acomposer.json
pour gérer vos dépendances et laissez-le construire automatiquement votre autochargeur PHP (qui importe automatiquement un fichier en appelant simplementuse \<namespace>\ClassName
). C'est le standard de facto dans le monde PHP, le moyen le plus simple et encore plus pré-automatisé et simplifié par WP Starter .la source
Pour ce qui est de le casser, dans ma plaque de chaudière, j'utilise une fonction personnalisée pour rechercher un dossier appelé fonctions dans le répertoire theme. S'il n'est pas présent, il le crée. Ensuite, crée un tableau de tous les fichiers .php trouvés dans ce dossier (le cas échéant) et exécute un include (); sur chacun d'eux.
Ainsi, chaque fois que je dois écrire de nouvelles fonctionnalités, j'ajoute simplement un fichier PHP au dossier des fonctions, sans avoir à vous soucier de le coder dans le site.
la source
J'aime utiliser une fonction pour les fichiers dans un dossier. Cette approche facilite l'ajout de nouvelles fonctionnalités lors de l'ajout de nouveaux fichiers. Mais j'écris toujours en classe ou avec des espaces de noms - donnez-lui plus de contrôle sur l'espace de noms des fonctions, méthodes, etc.
Ci-dessous un petit exemple; ut également utilisation avec l'accord sur la classe * .php
Dans les thèmes, j'utilise souvent un autre scénario. Je définis la fonction du fichier externel dans un ID de support, voir l'exemple. C’est utile si je vais facilement désactiver la fonction du fichier externel. J'utilise la fonction principale de WP
require_if_theme_supports()
et il ne charge que si l'ID de support était actif. Dans l'exemple suivant, j'ai défini cet ID pris en charge dans la ligne avant de charger le fichier.Vous pouvez en voir plus dans le repo de ce thème .
la source
Je gère un site avec environ 50 types de page personnalisés uniques dans plusieurs langues sur une installation réseau. Avec une tonne de plugins.
Nous avons été obligés de tout séparer à un moment donné. Un fichier de fonctions avec 20-30k lignes de code n'est pas drôle du tout.
Nous avons décidé de complètement refactoriser tout le code afin de mieux gérer la base de code. La structure de thème wordpress par défaut convient aux petits sites, mais pas aux plus grands.
Notre nouveau functions.php ne contient que ce qui est nécessaire pour démarrer le site, mais rien qui appartient à une page spécifique.
La disposition de thème que nous utilisons maintenant est similaire au modèle de conception MCV, mais dans un style de codage procédural.
Par exemple notre page membre:
page-member.php . Responsable de l'initialisation de la page. Appeler les fonctions ajax correctes ou similaires. Pourrait être équivalent à la partie contrôleur dans le style MCV.
functions-member.php . Contient toutes les fonctions liées à cette page. Ceci est également inclus dans plusieurs autres pages qui ont besoin de fonctions pour nos membres.
content-member.php . Prépare les données pour HTML Peut être équivalent au modèle dans MCV.
layout-member.php . La partie HTML.
Après ces modifications, le temps de développement a facilement diminué de 50% et le responsable du produit a maintenant du mal à nous attribuer de nouvelles tâches. :)
la source
A partir du fichier functions.php des thèmes enfants:
la source
Dans functions.php, un moyen plus élégant d’appeler un fichier requis serait:
require_once Locate_template ('/ inc / functions / shortcodes.php');
la source
locate_template()
a un troisième paramètre…J'ai combiné les réponses de @kaiser et de @mikeschinkel .
Toutes mes personnalisations pour mon thème sont placées dans un
/includes
dossier et dans ce dossier, tout est divisé en sous-dossiers.Je veux seulement que
/includes/admin
ses sous-contenus soient inclus quandtrue === is_admin()
Si un dossier est exclu en
iterator_check_traversal_callback
retournantfalse
alors ses sous-répertoires ne seront pas itérés (ou passés àiterator_check_traversal_callback
)la source