Пізня відповідь
Як правильно включити свої файли:
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;
Редагувати: підхід OOP / 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 .
EDIT Очевидно правильним способом є використання namespace
d-коду, підготовленого для автоматичного завантаження PSR-4 , помістивши все у відповідний каталог, який уже визначений через простір імен. Тоді просто використовуйте Composer та a, composer.json
щоб керувати своїми залежностями, і дозвольте йому автоматично створити автозавантажувач PHP (який автоматично імпортує файл, просто зателефонувавши use \<namespace>\ClassName
). Це стандарт де-факто у світі PHP, найпростіший шлях та ще більш попередньо автоматизований та спрощений WP Starter .