1. Czy ma to widoczny wpływ na wydajność WP?
JEŻELI miałoby to rzeczywisty wpływ na niektóre małe pliki, to miałoby to wpływ, który ma wpływ niższy niż WP: PHP i wydajność serwera. Czy to naprawdę ma wpływ? Nie całkiem. Ale nadal możesz po prostu samodzielnie rozpocząć testy wydajności.
2. Czy lepiej trzymać to wszystko w 1 pliku (functions.php)
Teraz pytanie brzmi „co jest lepsze”? Z ogólnego czasu ładowania plików? Z punktu widzenia organizacji plików? W każdym razie to nie robi różnicy. Zrób to w taki sposób, aby nie stracić widoku i zachować wynik w sposób, który jest dla Ciebie przyjemny.
3. Jak najlepiej to zrobić?
To, co zwykle robię, to po prostu zaczepienie gdzieś ( plugins_loaded
, after_setup_theme
itp. - zależy od tego, czego potrzebujesz), a następnie po prostu wymagam ich wszystkich:
foreach ( glob( plugin_dir_path( __FILE__ ) ) as $file )
require_once $file;
W każdym razie możesz uczynić to trochę bardziej skomplikowanym i elastycznym. Spójrz na ten przykład:
<?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;
}
}
Jest to klasa, która robi to samo (wymaga PHP 5.3+). Zaletą jest to, że jest nieco bardziej drobnoziarnisty, dzięki czemu można łatwo załadować pliki z folderów, które należy wykonać w celu wykonania określonego zadania:
$fileLoader = new WCM\FilesLoader( 'assets/php' );
foreach ( $fileLoader as $file )
$fileLoader->loadFile( $file );
Aktualizacja
Ponieważ żyjemy w nowym świecie po PHP v5.2, możemy skorzystać z \FilterIterator
. Przykład najkrótszego wariantu:
$files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS );
foreach ( $files as $file )
{
/** @noinspection PhpIncludeInspection */
! $files->isDir() and include $files->getRealPath();
}
Jeśli musisz trzymać się PHP wer. 5.2, nadal możesz używać \DirectoryIterator
tego samego kodu.
loadFile()
lubrequire_once
. Więc po prostu zaoferuj coś w rodzaju wsparcia motywu, w którym sam użytkownik może użyćadd_theme_support()/remove_*()
tylko tych modułów, których chce. Następnie po prostu użyj wyniku dla$loadFile()
lubglob()
. Przy okazji, jeśli to było twoje rozwiązanie, proszę oznaczyć je jako takie. Dzięki.Przerobiłem odpowiedź @kaiser trochę na moje potrzeby - pomyślałem, że ją podzielę. Chciałem więcej opcji, są one wyjaśnione w kodzie i na poniższym przykładzie użycia.
Kod:
Przykład użycia:
źródło