web-dev-qa-db-ja.com

media_handle_uploadおかしなこと

フロントエンドスクリプトを使って画像をアップロードしていますが、すべてうまくいきましたが、最近アップロードされた画像が適切なディレクトリに保存されていないことに気付きました。私の設定は、アップロードを月ベースと年ベースのフォルダに整理することです。私のフォルダは2011-> 03,04,05です(3月、4月、5月)。問題は、私が今日ファイルをアップロードするとそれがフォルダー03(3月)に保存されることです。私はwp_handle_uploadを使用する場合、画像は適切なフォルダ05(5月)に保存されますが、その後、画像はメディアライブラリに表示されず、異なるサイズは作られません。

私が使っているコードは

$image = media_handle_upload('async-upload', '');
2
Harjeet Singh

この関数の最初の行を見てください。

function media_handle_upload(
    $file_id, 
    $post_id, 
    $post_data = array(), 
    $overrides = array( 'test_form' => false )
) 
{

    $time = current_time('mysql');
    if ( $post = get_post($post_id) ) {
        if ( substr( $post->post_date, 0, 4 ) > 0 )
            $time = $post->post_date;
    }

    $name = $_FILES[$file_id]['name'];
    $file = wp_handle_upload($_FILES[$file_id], $overrides, $time);

時間は投稿日から取られます。 media_handle_upload()を迂回してwp_handle_upload()を直接使うこともできます。

更新

完全に機能するスタンドアロンの例を書く時間がないのですが、これは私のテーマオプションクラスからの抜粋です。アップロードを処理し、さまざまな画像サイズと添付ファイルIDを生成します。これは一般的な保存機能によって呼び出され、複数のアップロードされたファイルを1回のRushで処理します。

/**
 * Saves uploaded files in media library and the corresponding id in option field.
 *
 * @return void
 */
protected function handle_uploads()
{
    if ( ! isset ( $_FILES ) or empty ( $_FILES ) )
    {
        return;
    }

    foreach ( $_FILES as $file_key => $file_arr )
    {
        // Some bogus upload.
        if ( ! isset ( $this->fields[$file_key] )
            or empty ( $file_arr['type'] )
        )
        {
            continue;
        }

        if ( ! $this->is_allowed_mime( $file_key, $file_arr ) )
        {
            set_theme_mod( $file_key . '_error', 'wrong mime type' );
            continue;
        }

        // The file is allowed, no error until now and the type is correct.
        $uploaded_file = wp_handle_upload(
            $file_arr
        ,   array( 'test_form' => FALSE )
        );

        // error
        if ( isset ( $uploaded_file['error'] ) )
        {
            set_theme_mod( $file_key . '_error', $uploaded_file['error'] );
            continue;
        }

        // add the file to the media library

        // Set up options array to add this file as an attachment
        $attachment = array(
            'post_mime_type' => $uploaded_file['type']
        ,   'post_title'     => $this->get_media_name(
                                    $file_key, $uploaded_file['file']
                                )
        );

        // Adds the file to the media library and generates the thumbnails.
        $attach_id = wp_insert_attachment(
            $attachment
        ,   $uploaded_file['file']
        );

        $this->create_upload_meta( $attach_id, $uploaded_file['file'] );

        // Update the theme mod.
        set_theme_mod( $file_key, $attach_id );
        remove_theme_mod( $file_key . '_error' );
    }
}

/**
 * Adds meta data to the uploaded file
 *
 * @param  int $attach_id
 * @param  string $file
 * @return void
 */
protected function create_upload_meta( $attach_id, $file )
{
    // Create meta data from EXIF fields.
    require_once ABSPATH . 'wp-admin/includes/image.php';
    $attach_data = wp_generate_attachment_metadata(
        $attach_id
    ,   $file
    );
    wp_update_attachment_metadata($attach_id,  $attach_data);
}

いくつかのメモ:

  • is_allowed_mime()は私のコントローラで設定されている$fieldsで設定されているMIMEタイプをチェックします。たとえば、ファビコンのMIMEタイプはimage/x-iconまたはimage/vnd.Microsoft.iconです。
  • get_media_name()は添付ファイルに事前定義された名前を使うかもしれません(例:ロゴ)。
  • あなたの関数ではおそらく$attach_idを返してそれをpost meta fieldかそれに似たものの中で使いたいでしょう。
1
fuxia