【发布时间】:2023-03-05 23:43:01
【问题描述】:
我在 PHP 中构建的用于 WordPress 的自动加载器类有一个奇怪的问题。
核心概念是无论你是子主题、父主题还是插件,它都应该加载类。它应该根据名称找到类(对应文件夹结构:CoreTheme_Folder_SubFolder_ClassName(){} = CoreTheme/Folder/SubFolder/ClassName.php
这在子主题和父主题中运行良好,在子主题中我包含父主题 function.php 并从那里加载自动加载器,这样我就可以在子主题中调用父主题类而没有一堆 @987654326 @无处不在。
问题来了,当我在插件中做同样的概念时。 Autoloader 是一个框架的一部分(想想 zend),您将其包含在主题的根目录中。如果该主题是活动的并且我在插件中设置了自动加载器,它会发出“这个自动加载器有两个实例,你在做什么?”如果我停用所述主题然后在插件中实例化自动加载器,它找不到我使用梨命名标准创建的任何类。
所以,对于那些更深入地了解 WordPress 和 PHP 的人来说,我的问题是,我如何创建我的自动加载器,这样,无论您的主题、子主题或插件如何,它总能找到您正在寻找的类。
下面的代码是 autloader 类。如果你取出:plugin_dir_path(__FILE__),那么自动加载器会加载主题中的任何类和相应的子主题。
class AisisCore_Loader_AutoLoader{
protected static $_instance;
protected static $_directories;
public function get_instance(){
if(null == self::$_instance){
self::$_instance = new self();
}
self::$_directories = array(
get_template_directory(),
get_stylesheet_directory(),
plugin_dir_path(__FILE__),
);
return self::$_instance;
}
public function reset_instance(){
self::$_instance = null;
}
public function register_auto_loader(){
spl_autoload_register(array($this, 'load_class'));
}
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');
}
}
}
}
该类在您的父functions.php中通过以下方式实例化:
// Load the autoloader.
require_once(get_template_directory() . '/AisisCore/Loader/AutoLoader.php');
// Setup the autoloader.
$auto_loader = AisisCore_Loader_AutoLoader::get_instance();
$auto_loader->register_auto_loader();
然后在子主题中你所要做的就是:
require_once(TEMPLATEPATH . '/functions.php');
这允许自动加载器在子主题和父主题中工作。主要问题是,当您创建插件时,您将框架的副本放置在插件的名称根目录中:plugins/myplugin/AisisCore/ 和主题(父)中的一个副本Themes/MyTheme/AisisCore
所以我明白它为什么会发疯了 - 有点,有什么办法可以绕过它?
【问题讨论】:
-
plugin_dir_path(__FILE__)可能是错误的。此外,您不需要单例,只允许添加目录,然后您可以在运行时注册新的插件或主题目录。改用抽象类,它在 Wordpress 中效果更好。就像@hakre 在your previous question 中建议你一样。 -
实际上函数是正确的,如 WordPress 中所述,如果不是整个应用程序会崩溃,我的类的实现是正确的,因为它可以工作 - 我看不到抽象类的优势,但是感谢那 ;)。这里的问题是,如果任何活动主题中包含 AisisCore 库,它就会吓坏了。这里的问题:wordpress.stackexchange.com/questions/95742/… 是关于 autloader 在插件的插件目录中没有看到任何内容。
-
有条件地检查自动加载器是否在插件或主题中初始化。您需要对此进行一些故障排除(在此过程中您还将学到有用的东西)。而
plugin_dir_path(__FILE__)是个骗子。注意__FILE__是什么。见来源:core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/… -
我知道
__File__指向调用代码的文件的根目录。所以对我来说,我在文件的根目录调用plugin_dir_path(__FILE__)。理论上,这应该会看到 AisisCore/,它也在我的插件目录的根目录中,就像get_template_directory在文件夹中看到的一样。
标签: php wordpress wordpress-theming autoloader