1. Isso afeta o desempenho do WP de maneira visível?
Se isso tivesse um efeito real em alguns arquivos pequenos, teria um efeito menor que o WP: PHP e desempenho do servidor. Isso realmente afeta? Na verdade não. Mas você ainda pode simplesmente começar a fazer testes de desempenho.
2. É melhor manter tudo dentro de 1 arquivo (functions.php)
Agora, a pergunta é "o que é melhor"? Do (s) arquivo (s) geral (s), carregando o tempo? Do ponto de vista da organização de arquivos? Enfim, isso não faz nenhuma diferença. Faça isso de maneira a não perder a visão geral e manter o resultado de uma maneira agradável para você.
3. qual é a melhor maneira de fazer isso?
O que normalmente faço é simplesmente conectar em algum lugar (( plugins_loaded
, after_setup_theme
etc.) - depende do que você precisa) e depois exigir apenas todos eles:
foreach ( glob( plugin_dir_path( __FILE__ ) ) as $file )
require_once $file;
De qualquer forma, você também pode torná-lo um pouco mais complicado e flexível. Veja esse exemplo:
<?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;
}
}
É uma classe que faz basicamente o mesmo (precisa do PHP 5.3 ou superior). O benefício é que ele é um pouco mais refinado, para que você possa carregar arquivos com facilidade das pastas necessárias para executar uma tarefa específica:
$fileLoader = new WCM\FilesLoader( 'assets/php' );
foreach ( $fileLoader as $file )
$fileLoader->loadFile( $file );
Atualizar
Como vivemos em um novo mundo pós-PHP v5.2, podemos fazer uso do \FilterIterator
. Exemplo da variante mais curta:
$files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS );
foreach ( $files as $file )
{
/** @noinspection PhpIncludeInspection */
! $files->isDir() and include $files->getRealPath();
}
Se você precisa seguir o PHP v5.2, ainda pode seguir \DirectoryIterator
o código e praticamente o mesmo.
loadFile()
ourequire_once
. Portanto, basta oferecer algo como suporte ao tema, onde o próprio usuário pode usaradd_theme_support()/remove_*()
apenas os módulos que deseja. Em seguida, basta usar o resultado para$loadFile()
ouglob()
. Aliás, se essa foi sua solução, marque-a como tal. Obrigado.Eu reformulei a resposta do @kaiser um pouco para as minhas necessidades - pensei em compartilhar. Eu queria mais opções, essas são explicadas dentro do código e no exemplo de uso abaixo.
Código:
Exemplo de uso:
fonte