1. Cela a-t-il un effet visible sur les performances de WP?
SI cela aurait un effet réel pour certains petits fichiers, alors il aurait un effet qui aurait un impact inférieur à WP: PHP et aux performances du serveur. Cela a-t-il vraiment un effet? Pas vraiment. Mais vous pouvez tout simplement commencer à faire vous-même des tests de performances.
2. Est-il préférable de tout garder dans un seul fichier (functions.php)
Maintenant, la question est "Quoi de mieux"? Du temps de chargement global des fichiers? Du point de vue de l'organisation des fichiers? De toute façon, cela ne fait aucune différence. Faites-le de manière à ne pas perdre la vue d'ensemble et à maintenir le résultat d'une manière qui vous soit agréable.
3. quelle est la meilleure façon de procéder?
Ce que je fais d' habitude est simplement accrocher quelque part dans ( plugins_loaded
, after_setup_theme
, etc. - dépend de ce que vous avez besoin) et il suffit de les exiger de tous:
foreach ( glob( plugin_dir_path( __FILE__ ) ) as $file )
require_once $file;
Quoi qu'il en soit, vous pouvez également le rendre un peu plus compliqué et flexible. Jetez un œil à cet exemple:
<?php
namespace WCM;
defined( 'ABSPATH' ) OR exit;
class FilesLoader implements \IteratorAggregate
{
private $path = '';
private $files = array();
public function __construct( $path )
{
$this->setPath( $path );
$this->setFiles();
}
public function setPath( $path )
{
if ( empty( $this->path ) )
$this->path = \plugin_dir_path( __FILE__ ).$path;
}
public function setFiles()
{
return $this->files = glob( "{$this->getPath()}/*.php" );
}
public function getPath()
{
return $this->path;
}
public function getFiles()
{
return $this->files;
}
public function getIterator()
{
$iterator = new \ArrayIterator( $this->getFiles() );
return $iterator;
}
public function loadFile( $file )
{
include_once $file;
}
}
C'est une classe qui fait essentiellement la même chose (nécessite PHP 5.3+). L'avantage est qu'il est un peu plus fin, vous pouvez donc simplement charger des fichiers à partir de dossiers dont vous avez besoin pour effectuer une tâche spécifique:
$fileLoader = new WCM\FilesLoader( 'assets/php' );
foreach ( $fileLoader as $file )
$fileLoader->loadFile( $file );
Mise à jour
Comme nous vivons dans un nouveau monde post-PHP v5.2, nous pouvons utiliser le \FilterIterator
. Exemple de la variante la plus courte:
$files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS );
foreach ( $files as $file )
{
/** @noinspection PhpIncludeInspection */
! $files->isDir() and include $files->getRealPath();
}
Si vous devez vous en tenir à PHP v5.2, vous pouvez toujours utiliser \DirectoryIterator
le code à peu près le même.
loadFile()
ourequire_once
. Il suffit donc d'offrir quelque chose comme un support de thème où l'utilisateur lui-même ne peut utiliseradd_theme_support()/remove_*()
que les modules qu'il souhaite. Utilisez ensuite simplement le résultat pour$loadFile()
ouglob()
. Btw, si c'était votre solution, veuillez la marquer comme telle. Merci.J'ai retravaillé @kaiser pour répondre un peu à mes besoins - j'ai pensé le partager. Je voulais plus d'options, celles-ci sont expliquées dans le code et dans l'exemple d'utilisation ci-dessous.
Code:
Exemple d'utilisation:
la source