插件中的__autoload在WP中引发错误-无法找到Translating_Entry.class.php

时间:2011-01-08 作者:Steven

好的,我会尽可能简单地解释这一点。

我正在尝试修改一个名为smart-lencioni-image-resizer v2。0。用于WP Multisite。

我正在尝试使用以下URL通过SLIR显示图像:

http://subsite.mainsite.no/wp-content/plugins/wp-filebrowser/slir/?w=90&h=90&c=1:1&i=http://bekkelaget.stiengenterprises.no/files/seniorsenter/DSC_3535.jpg

我已经在v.1.4.2中成功地做到了这一点。但是v2。0正在使用其他方法包含文件。这个index.php 文件如下所示:

function __autoload($className)
{
  var_dump($className);  
    require_once strtolower($className) . \'.class.php\';
}

new SLIR();
现在,无论我在哪里尝试包括WP标题:

require_once($_SERVER[\'DOCUMENT_ROOT\'].\'/wp-blog-header.php\');
我收到以下错误消息:

*Warning: require_once(translation_entry.class.php) [function.require-once]: failed to open stream: No such file or directory in I:\\Development\\wamp\\www\\mysite\\wp-content\\plugins\\wp-filebrowser\\slir\\index.php on line 43*

中的第43行index.php 是:

require_once strtolower($className) . \'.class.php\';
由于某种原因__autoload 函数使WP在SLIR目录中查找文件。这当然是错误的:(

UPDATE我在网上找到了一种解决方案,这种方法很有效:

function __autoload($className)
{
  if(file_exists(strtolower($className) . \'.class.php\')) {
    require_once strtolower($className) . \'.class.php\';
  }
}
这允许加载WP头文件。但出于某种原因mainsite.no 并删除执行我在顶部添加的URL。

有没有其他方法可以解决这个问题?

UPDATE2

有一个。SLIR文件夹中的htaccess文件。文件如下所示:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule . index.php [L]
</IfModule>

# Prevent viewing of the error log file in its default location
<Files slir-error-log>
Order Deny,Allow
Deny from All
</Files>
可能是当我包含WP头文件时,它忽略了。来自SLIR的htaccess文件?

3 个回复
SO网友:hakre

丹尼斯指出了正确的方向,但仅仅寻找文件是否存在并不是全部工作。

我通过示例来实现这一点,但您需要对每个无法加载的文件执行此操作:

无法自动加载的类,请找到它。类别为Translation_Entry 它位于/wp-includes/pomo/entry.php. 这是其他库,而不是核心类wp-load.php 在您注册自动加载器之前或期间加入spl_autoload_register() 并注册您的基类自动加载器。然后可以预先添加另一个处理其他类的类我编写了一些示例代码,可能无法运行,但尚未测试。您可能最终甚至不会注册多个自动加载器,而只注册一个(这会调用不同的子例程),因此这只是一个快速编写的模型:

class MyAutoloader {
    public static function bootstrap() {
        spl_autoload_register(__CLASS__.\'::loaderPomo\');
        spl_autoload_register(__CLASS__.\'::loaderWpClasses\');
    }
    public static function getWpClassFile($name) {
        return sprintf(\'%s.class.php\', strtolower($name));
    }
    public static function isWpClass($name) {
        $file = self::getWpClassFile($name);
        return (bool) file_exists($file);
    }
    public static function require($file) {
        require $file;
    }
    // standard wordpress .class.php file loader
    public static function loaderWpClasses($name) {
        if (self::isWpClass($name) {
            $file = self::getWpClassFile($name);
            self::require($file);
        }
    }
    // [...] write any code you need to handle other cases.
    // loader for pomo classes
    public static function loaderPomo($name) {
        if (self::isPomoClass($name)) {
            $file = self::getPomoFile($name);
            self::require($file);
        }
    }
}

SO网友:Denis de Bernardy

每当调用class\\u exists()时,就会触发自动加载。在自动加载器中,添加检查以验证文件是否存在,然后再将其包括在内。

SO网友:Teno

我在编写自己的插件时也遇到了同样的错误。我用以下代码解决了这个问题。

$strDirPath = dirname(__FILE__) . \'\\\\classes\\\\\';
$arrPHPfiles = array_map(create_function( \'$a\', \'return basename($a, ".php");\' ), glob($strDirPath . \'*.php\'));
spl_autoload_register(
    create_function(\'$class_name\', \'
        global $arrPHPfiles, $strDirPath;
        if (in_array(strtolower($class_name), $arrPHPfiles)) 
            include($strDirPath . strtolower($class_name) . ".php");\' )
);
这将检查目录下必要的类文件classes 并且仅当解析类名与现有文件名匹配时才使用include()。

结束

相关推荐

How do you debug plugins?

我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?