关于WordPress,您有两个主要功能:get_template_directory()
、get_stylesheet_directory()
,其中第一个将在主题文件夹中查找,而另一个将在子主题目录中查找。
如果我们将这些结合起来,我们可以制作一个自动加载器,它包括:
public function get_instance(){
if(null == self::$_instance){
self::$_instance = new self();
}
self::$_directories = array(
get_template_directory(),
get_stylesheet_directory(),
);
return self::$_instance;
}
public function load_class($class){
$path = str_replace('_', '/', $class);
foreach(self::$_directories as $directories){
if(file_exists($directories . '/' . $path . '.php')){
require_once($directories . '/' . $path . '.php');
}
}
}
这些函数显然属于一个随后被实例化的类。这里所做的只是说,使用Folder_SubFolder_ClassName的命名标准查找一个类,将"_"替换为"/",并在末尾附加.php。没那么难。
它每次都有效。子主题类可以加载父主题类,父主题类可以相互调用,不必担心require_once()
现在让我们在混合中加入一些东西。假设您的主题使用自定义/包,并且其中有一个类,显而易见的答案是将get_instance()
更改为:
public function get_instance(){
if(null == self::$_instance){
self::$_instance = new self();
}
self::$_directories = array(
get_template_directory(),
get_stylesheet_directory(),
get_template_directory() . '/custom/packages/'
);
return self::$_instance;
}
通过这种方式类,应该加载一个类,比如:PackageName_Folder_SubFolder_ClassName{}
,因为它位于custom/packages/PackageName/Folder/SubFolder/ClassName.php
内部,我们告诉自动加载器,在这三个地方查找该类。
那么问题出在哪里呢
我收到一个错误,说明PackageName_Folder_SubFolder_ClassName
不存在或找不到。
为什么?我做错了什么?
我认为问题是由于/location/包的位置造成的。
在输出$directories . '/' . $path . '.php'
的load_classforeach循环中放入一个echo。我打赌这会让你明白的。您可能需要将public_html路径硬编码到自动加载功能中。