1. Влияет ли это на производительность WP видимым образом?
Если бы это оказало реальное влияние на некоторые небольшие файлы, то это имело бы влияние, которое оказало бы влияние ниже, чем WP: PHP и производительность сервера. Это действительно влияет? На самом деле, нет. Но вы все равно можете просто начать делать тесты производительности самостоятельно.
2. Лучше ли хранить все в одном файле (functions.php)
Теперь вопрос «что лучше»? Из общего времени загрузки файлов? С точки зрения организации файлов? Во всяком случае, это не имеет никакого значения. Сделайте это так, чтобы не потерять обзор и сохранить результат так, как вам удобно.
3. как лучше всего это сделать?
То , что я обычно делаю это просто зацепив где - то в ( plugins_loaded
, after_setup_theme
и т.д. - в зависимости от того, что вам нужно) , а затем просто требовать их всех:
foreach ( glob( plugin_dir_path( __FILE__ ) ) as $file )
require_once $file;
В любом случае, вы можете сделать его немного более сложным и гибким. Взгляните на этот пример:
<?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;
}
}
Это класс, который делает в основном то же самое (требуется PHP 5.3+). Преимущество состоит в том, что он немного более детализирован, поэтому вы можете легко загружать файлы из папок, которые необходимы для выполнения определенной задачи:
$fileLoader = new WCM\FilesLoader( 'assets/php' );
foreach ( $fileLoader as $file )
$fileLoader->loadFile( $file );
Обновить
Поскольку мы живем в новом мире PHP v5.2, мы можем использовать его \FilterIterator
. Пример кратчайшего варианта:
$files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS );
foreach ( $files as $file )
{
/** @noinspection PhpIncludeInspection */
! $files->isDir() and include $files->getRealPath();
}
Если вам нужно придерживаться PHP v5.2, то вы все равно можете использовать \DirectoryIterator
и тот же код.
loadFile()
илиrequire_once
. Поэтому просто предложите что-то вроде поддержки тем, где пользователь может использоватьadd_theme_support()/remove_*()
только те модули, которые ему нужны. Затем просто используйте результат для$loadFile()
илиglob()
. Кстати, если это было ваше решение, пожалуйста, пометьте его как таковое. Благодарю.Я переделал ответ @kaiser немного под свои нужды - думал, что поделюсь им. Я хотел больше вариантов, они объясняются внутри кода и в примере использования ниже.
Код:
Пример использования:
источник