WPメディアアップローダーは3つの異なるサイズの画像をどのように作成し、どのように複製できますか


17

いよいよ!! このことを手に入れたのは、約12回の方法と12の異なる方法で試しましたが、ようやく機能するようになりました。

画像をアップロードして投稿に添付するためのカスタムメタボックスを作成しました。WPに組み込まれている恐ろしいシックボックスメディアアップローダーを使用する必要はありません。嫌いです。いいえ、私がしたことは、入力のグループ(タイトル、説明、ファイル)だけです。必要に応じて添付ファイルを追加するために複製することもできます。そのため、フィールドに入力し、アップロードする画像を選択して、下書きを保存するか、投稿を公開します。投稿に添付ファイルが追加されると、メタボックスには入力フィールドと、追加した各添付ファイルの添付画像のプレビュー画像が表示されます。タイトルと説明のフィールドは、ファイルメタデータを生成するために使用されますが、私が知っているpost_metaとしては何も保存されません。現在、私がこれまで取り組んできたのはそれだけです。

投稿を保存/公開するときに、添付ファイルをアップロード/作成するときに、デフォルトのwpアップローダーと同じように3つの画像サイズ、サムネイル、中、大を作成し、フルサイズの画像も保持するようにする必要があります。それがどうにか可能なら。そうでない場合は、別の方法でadd_image_size()新しいカスタムサイズを作成/定義し、アップロード時に代わりにそのように生成したいと思います。

この場合にどの関数を使用するのが最も理想的かはわかりません。おそらく、image_make_intermediate_size()関数の方が優れているか、wp_create_thumbnail()またはwp_crop_image()...誰が知っているか!!

wp_handle_upload()それぞれについて関数を実行する必要がある場合、またはおそらくwp_generate_attachment_metadata()関数に。3つの画像サイズが同じ添付ファイルのバリアントとして関連付けられるため、それをどのように実行するのか、私にとって混乱しています。

私はウェブを精査し、すべてのwpメディア/アップロード/画像関連ファイルのソースを読み、メディアアップロード用のほぼすべての機能でプレイしましたが、WPが3つの画像サイズを作成する方法や方法を見つけることができませんそれ自身。

wp-includes / media.phpのimage_resize()関数は、まさにそのとおりであるため、最適であるように見えます。私は自分の人生のために私が何を失っているのか、またはやってみましたが、画像のサムネイルを作るのは間違っていたのかわかりません。

以下は、wp_handle_upload()物と物事を処理する私の作業関数ですが、100pxのサムを作成し、500pxのような最大幅の画像のサイズ変更バージョンを作成し、アップロードされたものの新しいファイルとして保存する必要があります。

function update_attachment(){
  global $post;

  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );

  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $url = wp_handle_upload( $_FILES['a_image'], $override );

    // $medium = image_make_intermediate_size( $uploaded_file['url'], 500, 400, true );
    // $thumb = = image_make_intermediate_size( $uploaded_file['url'], 100, 100, true );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $array_type = wp_check_filetype
    $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');

    $name_parts = pathinfo( $name );
    $name = trim( substr( $name, 0, - ( 1 + strlen( $name_parts['extension'] )) ));

    $type = $file['type'];
    $file = $file['file'];
    $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
    $content = $_POST['a_desc']

    $post_id = $post->ID;
    $attachment = array(
      'post_title' => $title,
      'post_type' => 'attachment',
      'post_content' => $content,
      'post_parent' => $post_id,
      'post_mime_type' => $type,
      'guid' => $url['url']
    );


    // Save the data
    $id = wp_insert_attachment( $attachment, $_FILES['a_image'][ 'file' ]/*, $post_id - for post_thumbnails*/);

    if ( !is_wp_error( $id )) {
      $attach_meta = wp_generate_attachment_metadata( $id, $uploaded_file['url'] );
      wp_update_attachment_metadata( $attach_id, $attach_meta );
    }
    update_post_meta( $post->ID, 'a_image', $uploaded_file['url'] );
  }
}

適切に動作するように私が最終的にこれを修正するのを助けることができる人は誰でも愛されるでしょう。私はこのことを開発しようとして何度も何度もとんでもない数え切れないほどの時間を費やしてきたし、ドキュメンテーションはひどいものでした。

ありがとう


以下のさまざまな回答のコメントを確認してください。私または@בנייתאתריםまたは私たちのどちらかがあなたが必要なものについて混乱していると思います。
MikeSchinkel

誰もこれを解決しましたか?? 同様の問題を抱えて、これについては何年もの間ウェブを押し寄せてきました。

回答:


6

こんにちは@jaredwilli:

おい!多大な努力と素晴らしい仕事。全体として、WordPressへの素晴らしい追加になる可能性があります。

あなたはとても近かったのですが、5から10の間のどこかで、失敗した仮定や、開始したように見えるコードが機能していなかったために戻ってこなかったのです。私はそれを修正するために必要なだけあなたの機能を作り直しました。解決策は次のとおりです。私は、あなたまたは燃え尽きていない人との比較を残します。:)

function update_attachment() {
  global $post;
  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );
  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $file = wp_handle_upload( $_FILES['a_image'], $override );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $file_type = wp_check_filetype($_FILES['a_image']['name'], array(
      'jpg|jpeg' => 'image/jpeg',
      'gif' => 'image/gif',
      'png' => 'image/png',
    ));
    if ($file_type['type']) {
      $name_parts = pathinfo( $file['file'] );
      $name = $file['filename'];
      $type = $file['type'];
      $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
      $content = $_POST['a_desc'];

      $post_id = $post->ID;
      $attachment = array(
        'post_title' => $title,
        'post_type' => 'attachment',
        'post_content' => $content,
        'post_parent' => $post_id,
        'post_mime_type' => $type,
        'guid' => $file['url'],
      );

      foreach( get_intermediate_image_sizes() as $s ) {
        $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => true );
        $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options
        $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options
        $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options
      }

      $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes );

      foreach( $sizes as $size => $size_data ) {
        $resized = image_make_intermediate_size( $file['file'], $size_data['width'], $size_data['height'], $size_data['crop'] );
        if ( $resized )
          $metadata['sizes'][$size] = $resized;
      }

      $attach_id = wp_insert_attachment( $attachment, $file['file'] /*, $post_id - for post_thumbnails*/);

      if ( !is_wp_error( $id )) {
        $attach_meta = wp_generate_attachment_metadata( $attach_id, $file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_meta );
      }
      update_post_meta( $post->ID, 'a_image', $file['url'] );
    }
  }
}

ねえ、PhpStormのコピーを入手してみませんか?私が今できるようにコードをたどることができたなら、あなたはこれを自分で簡単に解決できたでしょう。その場合は、バグの多いXDEBUGで時間を無駄にせず、代わりにZend Debuggerをダウンロードしてください。

PSこれは私の以前の答えです。Jaredがまさに求めていることを理解する前に、これを投稿しました。それは正しいですが、彼の質問とは関係ありません。:)


私があなたが探しているのはadd_image_size()

add_image_size( $size_id, $width, $height, $crop );

例えば:

add_image_size('headshot', 130, 150);
add_image_size('large-headshot', 260, 300);

この設定により、WordPressはこれらのサイズを自動的に作成します。必要なものは何ですか?


私はそれについて確信がありません、彼はデフォルトのメディアサイズの作成を求めています。
Bainternet

うーん。設定されwp_generate_attachment_metadata()ている場合、関数はそれを行いadd_image_size()ます。たぶん、彼add_image_size()は画像サイズを設定するために使用しようとしなかったのでしょうか?
MikeSchinkel

はい、しかし、jaredwilliは、デフォルトのWordPress組み込みサイズ(大、中、サムネイル)は作成されていないと言っています。
Bainternet

または多分私はまったく質問を得ていません:)
Bainternet

@בנייתאתרים-私も今混乱しています。@jaredwilliからの説明をここまで待つ必要があると思います。
MikeSchinkel

0

私があなたの質問を理解した場合、次のように最初にサイズのリストを取得する必要があります:

$image_sizes = get_intermediate_image_sizes();

これは、登録されたすべての画像サイズの配列を返します(デフォルト:large、medium、thumbnail、 "add_image_size()"を使用して登録されたカスタムサイズ、そして各サイズをループして、そのサイズの画像を作成するだけです。この:

$foreach ($image_sizes as $size){
    images[] = image_make_intermediate_size($file, $size['width'], $size['height'], $crop); 
}

$ fileをアップロードされたファイルパスで置き換え、$ cropを新しいサイズにトリミングする場合はtrueまたはfalseに、サイズを変更するにはfalseを置き換えます。


@בנייתאתרים-でコードを見ると、上で投稿したとおりに動作wp_generate_attachment_metadata()する/wp-admin/includes/image.phpことがわかります。彼はすでにそれを呼び出しています。それらが作成されていない場合、'intermediate_image_sizes_advanced'フックを使用してそれらをフィルタリングするプラグインを持っている可能性がありますか?
MikeSchinkel

私は実際にget_intermediate_image_sizes()を使用しようとしませんでした。私はそれがすべての登録されたサイズを得たことを知りませんでした。これは今知ってうれしいことです。生成された画像サイズが特定の添付ファイルにどのように関連付けられているかはまだよくわかりませんが、メディアライブラリを見ると、3つのサイズオプションが表示されます。 。Idk、それはそれほど重要ではありません。そうでない限り。そのforeachループを実行した後、どの変数を使用して添付ファイルを追加しますか?$ images ['thumb']または何か(どんなサイズでも)
ジャレッドウィリ

@בנייתאתרים-二人とも最初は本当の問題を逃しました。実際の問題は、元の例の約7または8コードのエラーでした。更新された回答をご覧ください。
MikeSchinkel

うん、ここで遅れて、私は脳死した。
Bainternet

@בנייתאתרים-同じ。:)
MikeSchinkel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.