it-swarm.com.de

__autoload in einem Plugin wirft einen Fehler in WP - translation_entry.class.php kann nicht gefunden werden

Ok, ich werde versuchen, dies so einfach wie möglich zu erklären.

Ich versuche ein Plugin namens smart-lencioni-image-resizer v2.0 zu modifizieren. zur Verwendung in WP-Multisite.

Ich versuche, ein Bild über SLIR unter Verwendung der folgenden URL anzuzeigen:

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

Ich habe das in v.1.4.2 erfolgreich gemacht. V2.0 verwendet jedoch eine andere Methode zum Einschließen von Dateien. Die index.php Datei sieht so aus:

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

new SLIR();

Nun, wo immer ich versuche, WP Header einzuschließen:

require_once($_SERVER['DOCUMENT_ROOT'].'/wp-blog-header.php');

Ich erhalte folgende Fehlermeldung:

* Warnung: require_once (translation_entry.class.php) [function.require-once]: Fehler beim Öffnen des Streams: Keine solche Datei oder Verzeichnis in I:\Development\wamp\www\mysite\wp- content\plugins\wp-filebrowser\slir\index.php in Zeile 43 *

Zeile 43 im index.php lautet:

require_once strtolower($className) . '.class.php';

Aus irgendeinem Grund veranlasst die Funktion __autoload WP, nach Dateien im SLIR-Verzeichnis zu suchen. Das ist natürlich falsch :(

UPDATE Ich habe im Internet eine Lösung gefunden, die funktioniert:

function __autoload($className)
{
  if(file_exists(strtolower($className) . '.class.php')) {
    require_once strtolower($className) . '.class.php';
  }
}

Dadurch kann die Header-Datei WP geladen werden. Aber aus irgendeinem Grund wird mainsite.no geladen und die oben hinzugefügte URL ausgeführt.

Gibt es eine andere Möglichkeit, dieses Problem zu lösen?

UPDATE2

Im SLIR-Ordner befindet sich eine .htaccess-Datei. Die Datei sieht folgendermaßen aus:

<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>

Kann es sein, dass beim Einfügen der Header-Datei WP die .htaccess-Datei von SLIR ignoriert wird?

3
Steven

Denis zeigte in die richtige Richtung, aber nur nach der Existenz der Datei zu suchen, ist nicht der ganze Job.

Ich mache dies anhand eines Beispiels, aber Sie müssen dies für jede Datei tun, die nicht geladen werden kann:

  • Suchen Sie die Klasse, die nicht automatisch geladen werden kann. Die Klasse ist Translation_Entry und befindet sich in /wp-includes/pomo/entry.php. Das ist eine andere Bibliothek und keine Kernklasse.
  • Sie müssen Ihren Autoloader so erweitern, dass entweder alle Fälle behandelt werden - oder - um sicherzustellen, dass wp-load.php vor oder während der Registrierung Ihres Autoloaders enthalten ist.
  • Ihr Autoloader ist so konzipiert, dass nur Klassen geladen werden, die auf einem bestimmten Schema basieren. Und Ihr Autoloader ist mit keinem anderen Autoloader kompatibel. Verwenden Sie stattdessen spl_autoload_register() und registrieren Sie Ihren Basisklassen-Autoloader. Dann können Sie eine weitere hinzufügen, die sich mit den anderen Klassen befasst.

Ich habe Beispielcode geschrieben, der möglicherweise nicht funktioniert. Er ist ungetestet. Möglicherweise registrieren Sie am Ende nicht mehrere Autoloader, sondern nur einen (der stattdessen die verschiedenen Subroutinen aufruft). Dies ist also nur ein kurzes Modell:

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);
        }
    }
}
3
hakre

autoload wird immer dann ausgelöst, wenn class_exists () aufgerufen wird. Fügen Sie in Ihrem Autoloader eine Überprüfung hinzu, um sicherzustellen, dass die Datei vorhanden ist, bevor Sie sie einschließen.

1

Beim Schreiben meines eigenen Plugins ist derselbe Fehler aufgetreten. Ich habe dieses Problem mit dem folgenden Code gelöst.

$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");' )
);

Dadurch werden die erforderlichen Klassendateien in einem Verzeichnis classes überprüft und include () nur verwendet, wenn der Name der Analyseklasse mit den vorhandenen Dateinamen übereinstimmt.

0
Teno