답변:
1. 이것은 WP 성능에 눈에 띄는 방식으로 영향을 미칩니 까?
경우 PHP 서버 성능 : 그것은 실제가 약간 작은 파일에 영향을 줄 것이다, 다음은 그 낮은 WP보다 영향을 영향을 줄 것이다. 실제로 영향을 미칩니 까? 실제로는 아닙니다. 그러나 여전히 성능 테스트를 직접 시작할 수 있습니다.
2. 1 개 파일 (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()
. Btw, 이것이 당신의 해결책이라면, 그렇게 표시하십시오. 감사.
@kaiser가 내 요구에 약간의 답변을 수정했습니다. 더 많은 옵션을 원했습니다.이 옵션은 코드와 아래의 사용 예에 설명되어 있습니다.
암호:
<?php
defined( 'ABSPATH' ) OR exit;
/**
* Functions_File_Loader
*
* Makes it possible to clutter the functions.php into single files.
*
* @author kaiser
* @author ialocin
* @link http://wordpress.stackexchange.com/q/111970/22534
*
*/
class Functions_File_Loader implements IteratorAggregate {
/**
* @var array
*/
private $parameter = array();
/**
* @var string
*/
private $path;
/**
* @var string
*/
private $pattern;
/**
* @var integer
*/
private $flags;
/**
* @var array
*/
private $files = array();
/**
* __construct
*
* @access public
* @param array $parameter
*/
public function __construct( $parameter ) {
$this->set_parameter( $parameter );
$this->set_path( $this->parameter[ 'path' ] );
$this->set_pattern( $this->parameter[ 'pattern' ] );
$this->set_flags( $this->parameter[ 'flags' ] );
$this->set_files();
}
/**
* set_parameter
*
* @access public
* @param array $parameter
*/
public function set_parameter( $parameter ) {
if ( empty( $parameter ) )
$this->parameter = array('','','');
else
$this->parameter = $parameter;
}
/**
* get_parameter
*
* @access public
* @return array
*/
public function get_parameter() {
return $this->parameter;
}
/**
* set_path
*
* defaults to get_stylesheet_directory()
*
* @access public
* @param string $path
*/
public function set_path( $path ) {
if ( empty( $path ) )
$this->path = get_stylesheet_directory().'/';
else
$this->path = get_stylesheet_directory().'/'.$path.'/';
}
/**
* get_path
*
* @access public
* @return string
*/
public function get_path() {
return $this->path;
}
/**
* set_pattern
*
* defaults to path plus asterisk »*«
*
* @access public
* @param string $pattern
*/
public function set_pattern( $pattern ) {
if ( empty( $pattern ) )
$this->pattern = $this->get_path() . '*';
else
$this->pattern = $this->get_path() . $pattern;
}
/**
* get_pattern
*
* @access public
* @return string
*/
public function get_pattern() {
return $this->pattern;
}
/**
* set_flags
*
* @access public
* @param integer $flags
*/
public function set_flags( $flags ) {
if ( empty( $flags ) )
$this->flags = '0';
else
$this->flags = $flags;
}
/**
* get_flags
*
* @access public
* @return integer
*/
public function get_flags() {
return $this->flags;
}
/**
* set_files
*
* @access public
*/
public function set_files() {
$pattern = $this->get_pattern();
$flags = $this->get_flags();
$files = glob( $pattern, $flags );
$this->files = $files;
}
/**
* get_files
*
* @access public
* @return array
*/
public function get_files() {
return $this->files;
}
/**
* getIterator
*
* This function name has to be kept
*
* @access public
* @return void
*/
public function getIterator() {
$iterator = new ArrayIterator( $this->get_files() );
return $iterator;
}
/**
* load_file
*
* @access public
* @param string $file
*/
public function load_file( $file ) {
include_once $file;
}
}
사용 예 :
$parameter = array(
// define path relative to get_stylesheet_directory()
// optional, defaults to get_stylesheet_directory()
'path' => 'includes/plugins',
// optional, defaults to asterisk »*«
// matches all files ending with ».php«
// and not beginning with »_«, good for quickly deactivating
// directories searched are »path« and »subfolders«
// Additional examples:
// '{*/,}{[!_],}func-*.php' same as above but for files with a prefix
// '[!_]*.php' php files in defined »path«, not beginning with »_«
'pattern' => '{*/,}[!_]*.php',
// optional, defaults to 0
// needed if for example brackets are used
// more information: http://www.php.net/manual/en/function.glob.php
'flags' => GLOB_BRACE
);
// create object
$functionsfileloader = new Functions_File_Loader( $parameter );
// load the files
foreach ( $functionsfileloader as $file ) {
$functionsfileloader->load_file( $file );
}