ตอบช้า
วิธีรวมไฟล์ของคุณอย่างถูกวิธี:
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
เมื่อฉันเพิ่งกลับมาและเห็นว่าคำตอบนี้เพิ่มจำนวนขึ้นอย่างรวดเร็วฉันคิดว่าฉันอาจแสดงให้เห็นว่าฉันกำลังทำอะไรอยู่ทุกวันนี้ในโลก 5.3+ PHP 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