【问题标题】:PHP Auto-load and WordPressPHP 自动加载和 WordPress
【发布时间】: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


【解决方案1】:

我想你只想加载一个类,所以像这样使用return;

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');
            return;
        }
    }
}

否则您将加载多个类。看一下这个: http://php.net/return

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2015-07-15
    相关资源
    最近更新 更多