web-dev-qa-db-ja.com

wp_get_attachment_image_srcとサーバーパス

wp_get_attachment_image_src は画像のURLと寸法を教えてくれます。

しかし、拡大縮小した画像のサーバーパスを取得する方法はありますか(/html/wordpress/wp-content/uploads/2015/03/cat-2-300x225.jpegのように)。 get_attached_file については知っていますが、これは元の画像のみを返します。

ハックな解決策(文字列を置換するドメインなど)や、WP_Image_Editorを直接使用しないようにしたいまたマルチサイトプルーフであるべきです。今見逃したことのある公式のものはありますか?

6
maryisdead

WordPressは生成されたサイズのパスをどこにも保存しないため、buildする必要があります。

コメントの @ kraftner で示唆されているように、 wp_get_attachment_metadata() を使用して、パスを構築するために必要な部分を取得できます。代替手段は image_get_intermediate_size() です。

missing pieceは、アップロードフォルダーの絶対パスです。 理論上、これは wp_upload_dir() で取得できますが、問題があります:この関数は呼び出された瞬間にアップロードフォルダーを返しますが、ファイルがアップロードされましたが、アップロードパスが異なりました。

そのため、onlyの可能性は、スケーリングされた画像が元の画像と同じフォルダにあると仮定することです。

この仮定はハックのように見えるかもしれませんが、おそらくWordPressコア自体で image_downsize() のような関数によって使用されます-string-replacing (行 #184 of media.php を参照してください。したがって、公式な方法 ..を探している場合は、これが1つです。

物事を非常に置く:

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

上記の関数は、添付ファイルIDとサイズを取得し、パスを返します。

realpath をパスを返す前に適用したのは、その関数が存在しないファイルに対してfalseを返すためです。

このフローの唯一の代替方法は、スケーリングされた画像のパスをどこかに保存し、おそらくメタを投稿し、必要なときに取得することですが、それはプラグインがアクティブ化された後にアップロードされたファイルに対してのみ機能します...

10
gmazzap