web-dev-qa-db-ja.com

変数を使用してアップロード中にファイル名を変更する

アップロード中にファイルの名前を変更して、ファイルの添付先のスラッグにファイル名を設定したいのですが、ファイル名を変えるためにランダムな文字(単純な増分カウンタでも問題ありません)が追加されます。

言い換えれば、私がそのページslugが "test-page-slug"である投稿に画像をアップロード/添付している場合、その画像の名前をその場でtest-page-slug-[C].[extension]に変更したいと思います。

  • test-page-slug-1.jpg
  • test-page-slug-2.jpg
  • など、元のファイル名が何であってもかまいません。

このプラグインがあります、 Custom Upload Dir

このプラグインを使用すると、投稿タイトル、ID、カテゴリ、投稿者、投稿日などの追加の変数からパスを作成できます。

ファイル名に対しても同じことができますか。

7
pereyra

あなたはwp_handle_upload_prefilterフィルタ(私はドキュメントを見つけることができませんが、とても単純に思えます)にフックしたいと思うでしょう。私はこれをローカルで試してみましたが、うまくいくようです。

function wpsx_5505_modify_uploaded_file_names($arr) {

    // Get the parent post ID, if there is one
    if( isset($_REQUEST['post_id']) ) {
        $post_id = $_REQUEST['post_id'];
    } else {
        $post_id = false;
    }

    // Only do this if we got the post ID--otherwise they're probably in
    //  the media section rather than uploading an image from a post.
    if($post_id && is_numeric($post_id)) {

        // Get the post slug
        $post_obj = get_post($post_id); 
        $post_slug = $post_obj->post_name;

        // If we found a slug
        if($post_slug) {

            $random_number = Rand(10000,99999);
            $arr['name'] = $post_slug . '-' . $random_number . '.jpg';

        }

    }

    return $arr;

}
add_filter('wp_handle_upload_prefilter', 'wpsx_5505_modify_uploaded_file_names', 1, 1);

私のテストでは、パーマリンクが有効になっている場合にのみ投稿にスラッグがあるように思われるので、ファイル名を変更する前にスラッグがあることを確認するためのチェックを追加しました。また、ここでは行っていないファイルの種類をチェックすることも検討したいと思います - 私はちょうどそれがjpgであると仮定しました。

_編集_

コメントで要求されているように、この追加機能はアップロードされた画像のメタ属性のいくつかを変更します。 ALTテキストを設定させているようには見えませんが、何らかの理由で「キャプション」として設定した値が実際には説明として割り当てられています。あなたはそれで猿をしなければならないでしょう。このフィルタは、wp-admin/includes/image.phpにあるwp_read_image_metadata()関数にあります。それはメディアのアップロードとwp_generate_attachment_metadata関数が画像からメタデータを引き出すために依存しているものです。もう少し洞察が必要な場合は、そこを見てください。

function wpsx_5505_modify_uploaded_file_meta($meta, $file, $sourceImageType) {

    // Get the parent post ID, if there is one
    if( isset($_REQUEST['post_id']) ) {
        $post_id = $_REQUEST['post_id'];
    } else {
        $post_id = false;
    }

    // Only do this if we got the post ID--otherwise they're probably in
    //  the media section rather than uploading an image from a post.
    if($post_id && is_numeric($post_id)) {

        // Get the post title
        $post_title = get_the_title($post_id);

        // If we found a title
        if($post_title) {

            $meta['title'] = $post_title;
            $meta['caption'] = $post_title;

        }

    }

    return $meta;

}
add_filter('wp_read_image_metadata', 'wpsx_5505_modify_uploaded_file_meta', 1, 3);

GETとPOSTを連続してチェックするのではなく、REQUEST objからpost IDを取得するように2012/04/04を編集しました。コメントの提案に基づいています。

9
MathSmath