1. ¿Tiene esto efecto en el rendimiento de WP de manera visible?
SI tendría un efecto real para algunos archivos pequeños, tendría un impacto menor que WP: PHP y el rendimiento del servidor. ¿Realmente tiene un efecto? Realmente no. Pero aún puede comenzar a hacer pruebas de rendimiento usted mismo.
2. ¿Es mejor mantenerlo todo dentro de 1 archivo (functions.php)
Ahora la pregunta es "¿Qué es mejor"? ¿Del tiempo total de carga de los archivos? ¿Desde el punto de vista de la organización de archivos? De todos modos, no hace ninguna diferencia. Hágalo de manera que no pierda la visión general y pueda mantener el resultado de una manera agradable para usted.
3. ¿ Cuál es la mejor manera de hacer esto?
Lo que normalmente hago es simplemente engancharme en algún lugar ( plugins_loaded
, after_setup_theme
etc., depende de lo que necesites) y luego solo requerirlos a todos:
foreach ( glob( plugin_dir_path( __FILE__ ) ) as $file )
require_once $file;
De todos modos, también puedes hacerlo un poco más complicado y flexible. Echa un vistazo a ese ejemplo:
<?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;
}
}
Es una clase que hace básicamente lo mismo (necesita PHP 5.3+). El beneficio es que es un poco más fino, por lo que puede cargar fácilmente archivos de carpetas que necesita para realizar una tarea específica:
$fileLoader = new WCM\FilesLoader( 'assets/php' );
foreach ( $fileLoader as $file )
$fileLoader->loadFile( $file );
Actualizar
Como vivimos en un nuevo mundo posterior a PHP v5.2, podemos hacer uso de \FilterIterator
. Ejemplo de la variante más corta:
$files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS );
foreach ( $files as $file )
{
/** @noinspection PhpIncludeInspection */
! $files->isDir() and include $files->getRealPath();
}
Si tiene que seguir con PHP v5.2, entonces aún puede \DirectoryIterator
usar el mismo código.
loadFile()
orequire_once
. Entonces, simplemente ofrezca algo como soporte de temas donde el usuario mismo pueda usaradd_theme_support()/remove_*()
para tomar solo los módulos que desee. Luego simplemente use el resultado para$loadFile()
oglob()
. Por cierto, si esta fue su solución, márquela como tal. Gracias.Rediseñé un poco la respuesta de @kaiser a mis necesidades, pensé en compartirla. Quería más opciones, esas se explican dentro del código y en el ejemplo de uso a continuación.
Código:
Ejemplo de uso:
fuente