Поздний ответ
Как правильно включить ваши файлы:
function wpse1403_bootstrap()
{
// Here we load from our includes directory
// This considers parent and child themes as well
locate_template( array( 'inc/foo.class.php' ), true, true );
}
add_action( 'after_setup_theme', 'wpse1403_bootstrap' );
То же самое работает и в плагинах.
Как правильно выбрать путь или URi
Также взгляните на функции API файловой системы, такие как:
home_url()
plugin_dir_url()
plugin_dir_path()
admin_url()
get_template_directory()
get_template_directory_uri()
get_stylesheet_directory()
get_stylesheet_directory_uri()
- и т.п.
Как уменьшить количество include/require
Если вам нужно получить все файлы из каталога, перейдите с
foreach ( glob( 'path/to/folder/*.php' ) as $file )
include $file;
Имейте в виду, что это игнорирует сбои (возможно, полезные для производственного использования) / не загружаемые файлы.
Чтобы изменить это поведение, вы можете использовать другой конфиг во время разработки:
$files = ( defined( 'WP_DEBUG' ) AND WP_DEBUG )
? glob( 'path/to/folder/*.php', GLOB_ERR )
: glob( 'path/to/folder/*.php' )
foreach ( $files as $file )
include $file;
Изменить: ООП / SPL подход
Когда я только что вернулся и увидел, что этот ответ получает все больше и больше голосов, я подумал, что мог бы показать, как я это делаю в настоящее время - в мире PHP 5.3+. В следующем примере загружаются все файлы из подпапки тем с именем src/
. Здесь у меня есть мои библиотеки, которые выполняют определенные задачи, такие как меню, изображения и т. Д. Вам даже не нужно заботиться об имени, поскольку каждый отдельный файл загружается. Если у вас есть другие подпапки в этом каталоге, они игнорируются.
\FilesystemIterator
Это в PHP 5.3+ supercedor над \DirectoryIterator
. Оба являются частью PHP SPL. В то время как PHP 5.2 позволял отключать встроенное расширение SPL (это сделали менее 1% всех установок), SPL теперь является частью ядра PHP.
<?php
namespace Theme;
$files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS );
foreach ( $files as $file )
{
/** @noinspection PhpIncludeInspection */
! $files->isDir() and include $files->getRealPath();
}
Ранее, пока я все еще поддерживал PHP 5.2.x, я использовал следующее решение: A \FilterIterator
в src/Filters
каталоге, чтобы получать только файлы (а не точечные указатели на папки), и a \DirectoryIterator
для выполнения циклов и загрузки.
namespace Theme;
use Theme\Filters\IncludesFilter;
$files = new IncludesFilter( new \DirectoryIterator( __DIR__.'/src' ) );
foreach ( $files as $file )
{
include_once $files->current()->getRealPath();
}
Это \FilterIterator
было так просто:
<?php
namespace Theme\Filters;
class IncludesFilter extends \FilterIterator
{
public function accept()
{
return
! $this->current()->isDot()
and $this->current()->isFile()
and $this->current()->isReadable();
}
}
Помимо того, что PHP 5.2 сейчас мертв / EOL (и 5.3 тоже), есть тот факт, что в игре больше кода и еще одного файла, поэтому нет смысла переходить на более позднюю версию и поддерживать PHP 5.2.x.
Подвела
Еще более подробную статью можно найти здесь, на WPKrauts .
РЕДАКТИРОВАТЬ Очевидно, что правильный способ - использовать namespace
d-код, подготовленный для автозагрузки PSR-4 , поместив все в соответствующий каталог, который уже определен через пространство имен. Затем просто используйте Composer и a composer.json
для управления вашими зависимостями и позвольте ему автоматически собрать ваш автозагрузчик PHP (который автоматически импортирует файл, просто вызывая use \<namespace>\ClassName
). Это де-факто стандарт в мире PHP, самый простой способ, и еще более предварительно автоматизированный и упрощенный WP Starter .