因此,我尝试使用以下方法从子主题、主题或插件加载类:
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\');
}
}
}
}
但我不明白
plugin_dir_path
功能正在运行。问题是,一旦这个类被实例化,就不能在插件的目录中加载任何类。那就是
/plugin/myplugin/
然而,如果我有一个使用我正在开发的框架的主题,并且该主题被激活,并且我通过以下方式在插件的主php文件中实例化该类:
//require_once(plugin_dir_path(__FILE__) . \'AisisCore/Loader/AutoLoader.php\');
require_once(get_template_directory() . \'/AisisCore/Loader/AutoLoader.php\');
// Setup the autoloader.
$auto_loader = AisisCore_Loader_AutoLoader::get_instance();
$auto_loader->register_auto_loader();
$obj = new AisisCore_Http_Http();
然后一切正常,它会看到AisisCore\\U Http\\U Http类等等,但如果我这样做:
require_once(plugin_dir_path(__FILE__) . \'AisisCore/Loader/AutoLoader.php\');
//require_once(get_template_directory() . \'/AisisCore/Loader/AutoLoader.php\');
// Setup the autoloader.
$auto_loader = AisisCore_Loader_AutoLoader::get_instance();
$auto_loader->register_auto_loader();
$obj = new AisisCore_Http_Http();
它疯了,找不到班级。
想法?
最合适的回答,由SO网友:gmazzap 整理而成
当遇到类似的情况时,我找到了一个解决方案,如果您的框架驻留在插件中(看起来是这样的),那么它就可以工作。
如果您的主插件文件(WordPress识别为插件文件)位于,例如。/plugin/Aisis/
你可以把这条路径设为常数,例如。
define(\'AISISPATH\', dirname(__FILE__));
require ( trailingslashit (AISISPATH) . \'AisisCore/Loader/AutoLoader.php\' );
if ( ! class_exists(\'AisisCore_Loader_AutoLoader\') ) die(\'Something strange happened.\');
AisisCore_Loader_AutoLoader::get_instance();
在您的
get_instance()
方法
AisisCore_Loader_AutoLoader
类别put:
self::$_directories = array(
get_template_directory(),
get_stylesheet_directory(),
trailingslashit( AISISPATH )
);
这样做,
AisisCore_Loader_AutoLoader::$_directories[2]
将是
{wp_path_here}/plugin/Aisis
所以当你打电话的时候
$obj = new AisisCore_Http_Http();
您的自动加载器方法将在中搜索
{wp_path_here}/plugin/Aisis/AisisCore/Http/Http.php
.
当然,如果从WP dashboard激活插件,一切都会正常工作。
如果你遵循这个过程,开始get_instance()
方法:if ( ! defined(\'AISISPATH \') ) die(\'Framework not initilized.\');
你的逻辑可能行不通,因为plugin_dir_path($file)
, 只是一个包装trailingslashit( dirname( $file ) )
(请参见Codex) 所以如果你用这个函数传递__FILE__
作为param,它将返回调用函数的文件所在的文件夹(在您的示例中为“AisisCore/Loader/”),而不是您的框架根目录。
希望这对你有帮助。