我是不是不了解插件?

时间:2013-04-13 作者:TheWebs

因此,我尝试使用以下方法从子主题、主题或插件加载类:

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();
它疯了,找不到班级。

想法?

1 个回复
最合适的回答,由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/”),而不是您的框架根目录。

希望这对你有帮助。

结束

相关推荐

向php代码添加自定义文本行

下面的代码用于拉入我的推文,并在我的Wordpress网站上以个人博客帖子的形式发布。我想在推特后添加一个“在推特上关注我的链接”,当它显示在帖子的主体中时。我该怎么做?例如,它希望它看起来像:标题-截断的推文正文-全部推特发布推文-在推特上关注我(带链接)这是代码。任何帮助都会很棒。<?php function Keyring_Twitter_Importer() { class Keyring_Twitter_Importer extends Keyring_