it-swarm.com.de

wp_get_attachment_image_src und Serverpfad

wp_get_attachment_image_src gibt mir URL und Abmessungen für ein Bild.

Aber gibt es eine Möglichkeit, den Serverpfad für ein skaliertes Bild (wie /html/wordpress/wp-content/uploads/2015/03/cat-2-300x225.jpeg) abzurufen? Ich kenne get_attached_file , aber dies gibt nur das Originalbild zurück.

Ich möchte hackige Lösungen vermeiden (das Ersetzen von Domänen und dergleichen durch Zeichenfolgen) oder WP_Image_Editor direkt verwenden. Auch sollte es multisite-proof sein. Gibt es etwas offizielles, das ich gerade verpasst habe?

6
maryisdead

WordPress speichert keinen Pfad generierter Größen, Sie müssen ihn build.

Wie von @kraftner in Kommentaren vorgeschlagen, kann wp_get_attachment_metadata() verwendet werden, um einige der Teile zu erhalten, die Sie zum Erstellen des Pfades benötigen. Eine Alternative ist image_get_intermediate_size() .

Das fehlende Stück ist der absolute Pfad des Upload-Ordners. Theoretisch, das über wp_upload_dir() abgerufen werden kann, aber es gibt ein Problem: Diese Funktion gibt den Upload-Ordner in dem Moment zurück, in dem sie aufgerufen wird, aber es besteht immer die Möglichkeit, dass beim Hochladen der Datei der Upload erfolgt Weg war anders.

Mit der Option only wird angenommen, dass sich das skalierte Bild im selben Ordner wie das Originalbild befindet.

Diese Annahme mag hackisch erscheinen und ist es wahrscheinlich auch, aber sie wird im WordPress-Kern selbst von Funktionen wie image_downsize () verwendet, die genau Zeichenketten ersetzen ausführen (siehe Zeile # 184 von media.php ), also wenn du nach dem offiziellen Weg suchst ... das ist der eine.

Dinge zusammenfassen:

function scaled_image_path($attachment_id, $size = 'thumbnail') {
    $file = get_attached_file($attachment_id, true);
    if (empty($size) || $size === 'full') {
        // for the original size get_attached_file is fine
        return realpath($file);
    }
    if (! wp_attachment_is_image($attachment_id) ) {
        return false; // the id is not referring to a media
    }
    $info = image_get_intermediate_size($attachment_id, $size);
    if (!is_array($info) || ! isset($info['file'])) {
        return false; // probably a bad size argument
    }

    return realpath(str_replace(wp_basename($file), $info['file'], $file));
}

Die obige Funktion übernimmt die Anhangs-ID und eine Größe und gibt den Pfad zurück.

Ich habe realpath zuvor angewendet, um Pfade zurückzugeben, da diese Funktion für nicht vorhandene Dateien false zurückgibt, sodass die gesamte Funktion immer false zurückgibt, wenn ein Fehler aufgetreten ist.

Die einzige Alternative zu diesem Ablauf wäre, den Pfad der skalierten Bilder selbst zu speichern, wahrscheinlich Meta zu posten und bei Bedarf abzurufen. Dies funktioniert jedoch nur für Dateien, die hochgeladen wurden, nachdem Ihr Plugin aktiviert wurde ...

10
gmazzap