Spóźniona odpowiedź
Jak dołączyć swoje pliki we właściwy sposób:
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' );
To samo działa również we wtyczkach.
Jak uzyskać właściwą ścieżkę lub URi
Zobacz także funkcje interfejsu API systemu plików, takie jak:
home_url()
plugin_dir_url()
plugin_dir_path()
admin_url()
get_template_directory()
get_template_directory_uri()
get_stylesheet_directory()
get_stylesheet_directory_uri()
- itp.
Jak zmniejszyć liczbę include/require
Jeśli chcesz pobrać wszystkie pliki z katalogu, idź z
foreach ( glob( 'path/to/folder/*.php' ) as $file )
include $file;
Należy pamiętać, że ignoruje to awarie (być może dobre do użytku produkcyjnego) / nieładowalne pliki.
Aby zmienić to zachowanie, możesz chcieć użyć innej konfiguracji podczas programowania:
$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;
Edycja: podejście OOP / SPL
Gdy właśnie wróciłem i zobaczyłem, że ta odpowiedź zyskuje coraz więcej głosów, pomyślałem, że mogę pokazać, jak to robię w dzisiejszych czasach - w świecie PHP 5.3+. Poniższy przykład ładuje wszystkie pliki z podfolderu tematów o nazwie src/
. Tutaj mam swoje biblioteki, które obsługują niektóre zadania, takie jak menu, obrazy itp. Nie musisz nawet przejmować się nazwą, gdy ładuje się każdy plik. Jeśli masz inne podfoldery w tym katalogu, zostaną one zignorowane.
\FilesystemIterator
Jest PHP 5.3+ supercedor nad \DirectoryIterator
. Oba są częścią PHP SPL. Podczas gdy PHP 5.2 umożliwiło wyłączenie wbudowanego rozszerzenia SPL (zrobiło to mniej niż 1% wszystkich instalacji), SPL jest teraz częścią rdzenia PHP.
<?php
namespace Theme;
$files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS );
foreach ( $files as $file )
{
/** @noinspection PhpIncludeInspection */
! $files->isDir() and include $files->getRealPath();
}
Wcześniej, podczas gdy nadal obsługiwałem PHP 5.2.x, użyłem następującego rozwiązania: A \FilterIterator
w src/Filters
katalogu, aby pobrać tylko pliki (a nie kropki wskaźników folderów) oraz a, \DirectoryIterator
aby wykonać zapętlenie i ładowanie.
namespace Theme;
use Theme\Filters\IncludesFilter;
$files = new IncludesFilter( new \DirectoryIterator( __DIR__.'/src' ) );
foreach ( $files as $file )
{
include_once $files->current()->getRealPath();
}
To \FilterIterator
było tak proste:
<?php
namespace Theme\Filters;
class IncludesFilter extends \FilterIterator
{
public function accept()
{
return
! $this->current()->isDot()
and $this->current()->isFile()
and $this->current()->isReadable();
}
}
Poza tym, że PHP 5.2 jest już martwy / EOL (i 5.3 również), istnieje fakt, że jest to więcej kodu i jeszcze jeden plik w grze, więc nie ma powodu, aby iść z późniejszym i wspierać PHP 5.2.x.
Podsumował
Jeszcze bardziej szczegółowy artykuł można znaleźć tutaj na WPKrauts .
EDYCJA Oczywiście poprawnym sposobem jest użycie namespace
kodu d, przygotowanego do automatycznego ładowania PSR-4, poprzez umieszczenie wszystkiego w odpowiednim katalogu, który jest już zdefiniowany przez przestrzeń nazw. Następnie użyj Composer i a composer.json
do zarządzania zależnościami i pozwól mu automatycznie zbudować autoloader PHP (który automatycznie importuje plik po prostu wywołując use \<namespace>\ClassName
). To de facto standard w świecie PHP, najłatwiejsza droga, jeszcze bardziej zautomatyzowana i uproszczona przez WP Starter .