質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.81%

  • WordPress

    6239questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • アップロード

    53questions

    アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Wordpress でアップロードした画像をサイズに応じて名前を変えたい

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 117

sanokoyuki

score 0

 前提・実現したいこと

WordPress で image.jpg という画像をアップロードすると
image.jpg の他に

  • image-150x150.jpg(サムネイル)
  • image-300x225.jpg(中)
  • image-1024x768.jpg(大)

という画像が作成されます。

これを

  • image-thumbnail.jpg
  • image-medium.jpg
  • image-large.jpg

というように作成したいと思います。

 発生している問題・エラーメッセージ

sanitize_file_name で…というのを見かけてやってみたのですが、ファイル名そのもの(この場合は image )を変更はできるものの、ファイル名の後の部分(この場合は thumbnail や large 等)を変更する方法がわかりません。
add_image_size() 等で追加する場合はそれに準じたものが、"-" 以降に入る…というのが理想ですが、こういうことは不可能でしょうか?

 該当のソースコード

以下は http://stackoverflow.com/questions/3259696 からの引用です。
ファイル名を MD5 変換した文字に変換するというものでした。

function so_3261107_hash_filename( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    return md5( $name ) . $ext;
}

add_filter( 'sanitize_file_name', 'so_3261107_hash_filename', 10 );


teratil にも似たような質問があったのですが、やはり少し違うようです。

 試したこと

以前 WordPress のフォーラム で質問して格闘していたのですが解決せず、放置しておりました。
一応これをいじってみたのですが、行き詰ってしまいました…。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

ざっくり見ただけなので未検証です。


WordPress の画像操作は WP_Image_Editor クラスで行われています。(WP3.5以降)

で、GD か Imagick が用意されていますが、どちらも同じ方法で名前を取得しています。
wp-includes/class-wp-image-editor-gd.php#L384
wp-includes/class-wp-image-editor-imagick.php#L619

$filename = $this->generate_filename( null, null, $extension );

で generate_filename() 内で get_suffix() を使っているため、下記パターンに固定されます。

return "{$this->size['width']}x{$this->size['height']}";

なので、たぶん、WP_Image_Editor クラスを自作して(既存の物をコピーとか継承とかして)置き換えることが出来るとは思います。

GD / Imagick のどれを使うかは下記 WP_Image_Editor クラス取得関数内の _wp_image_editor_choose関数で分岐されています。

【wp_get_image_editor() | Function | WordPress Developer Resources】
https://developer.wordpress.org/reference/functions/wp_get_image_editor/

【media.php in tags/4.9/src/wp-includes – WordPress Trac】
https://core.trac.wordpress.org/browser/tags/4.9/src/wp-includes/media.php#L2900

$implementations = apply_filters( 'wp_image_editors', array( 'WP_Image_Editor_Imagick', 'WP_Image_Editor_GD' ) );

と、ここで画像操作用クラスを差し込めそうなので、試してみるとか。(未検証です)

add_filter( 'wp_image_editors', 'change_graphic_lib' );
function change_graphic_lib( $array ) {
    require_once TEMPLATEPATH.'/class-my-wp-image-editor-imagick.php';/* ← とりあえずテンプレートフォルダにおいてみた(プラグインにするならプラグインのパスにどうぞ) */ 
    return array( 'MY_WP_Image_Editor_Imagick',/* ← コピーか継承して作った自作のクラス*/ 'WP_Image_Editor_Imagick', 'WP_Image_Editor_GD' );
}

【wp_image_editors | Hook | WordPress Developer Resources】
https://developer.wordpress.org/reference/hooks/wp_image_editors-9/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/19 23:40

    kei344 さま
    ご回答ありがとうございます。
    WordPress を表面だけ触るのと中の方まで触るのとでは奥深さが違うなぁと感じさせられました。
    気軽にできるとは思っていませんでしたが、書かれたことを理解するだけでも結構大変そうですが頑張ってみようと思います。

    正直どこをどういじればいいのかわかりませんでしたので、大変参考になりました。
    本当にありがとうございました。

    追加の情報等ありましたら、またよろしくお願いいたします。

    キャンセル

+2

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/19 23:34

    Space-Monkey さま
    素敵なプラグインのご紹介ありがとうございます。
    これって WordPress のプラグイン検索では出てこないんですね。
    テストに時間がかかってしまいお返事が遅くなりました。
    このプラグインを導入して、以下の操作をしてみました。

    1. image.jpg をアップロード
    2. image.jpg を回転 → 確定

    すると image.jpg の他に image-e0123456789012.jpg ( e 以降の 13 桁の数字はランダムな数字)というファイルができていました(これは WordPress の仕様でしょうか?)。
    image.jpg の画像については -thumbnail.jpg 、-medium.jpg 、-large.jpg ができたのですが、image-e0123456789012.jpg については WxH 形式でファイル名が付いていました。

    Regenerate Thumbnails を実行すると WxH 形式のファイルは消えずに(残念…)、期待通りの -thumbnail.jpg 、-medium.jpg 、-large.jpg ができました。

    回転した時に余計なファイルができるのと WxH 形式のファイルができるのが残念ですが、もう少し頑張ってみようと思います。
    ありがとうございました。

    また修正について情報がありましたらお願いいたします。

    キャンセル

  • 2018/04/19 23:44

    作者の方のホームページはなくなっちゃってたんですね…残念…

    キャンセル

  • 2018/04/20 07:35

    WordPressに登録されてないものはWordPressのサイトで検索しても出てきません。

    管理画面でファイルを編集した場合際にランダムな文字列が付与されたファイルが出来るのはWordPressの仕様です。
    対策はファイルを上書きする方法を考えるかアップロード前に回転しておくかの二択だと思いますが、やりたいことは
    『Wordpress でアップロードした画像をサイズに応じて名前を変えたい』
    なので本件とは別問題です。

    キャンセル

  • 2018/04/20 12:32

    Space-Monkey さま
    おっしゃる通りですね。
    また機会がありましたらよろしくお願いいたします。
    もう少しがんばって解決した時点でまたご報告させていただきます。

    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • WordPress

    6239questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

  • アップロード

    53questions

    アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。