web-dev-qa-db-ja.com

どうやって WP メディアアップローダーが3つの異なるサイズの画像を作成し、それを複製する方法

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

私は投稿に画像をアップロードして添付するためのカスタムメタボックスを作りました、そしてそれはあなたがWPに組み込まれた恐ろしいthickboxメディアアップローダーを使うことを必要としません。私はそのことが嫌いです。いいえ、私がしたのは単なる入力のグループ(タイトル、説明、ファイル)です。これを複製して、必要に応じて添付ファイルを追加することもできます。そのため、あなたはフィールドに記入し、アップロードする画像を選択し、そして下書きを保存するか、あるいは投稿を公開します。添付ファイルが投稿に追加されると、追加した各添付ファイルの添付画像のプレビュー画像とともに、メタボックスは入力フィールドを表示します。 titleおよびdescriptionフィールドはファイルのメタデータを生成するために使用されます。私が知っている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 media/upload/image関連ファイルのソースを読み、メディアアップロードのものにあるほぼすべての機能で再生しましたが、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'] );
  }
}

それが適切に機能するように私がようやくこれを修正するのを手伝うことができれば誰でも愛されるでしょう。私はこのことを開発するために非常に多くのばかげた数え切れないほどの数え切れないほどの時間を費やしましたそしてドキュメンテーションは吸います、そしてそれをする方法についてどこにも本当に良い投稿がありません。

ありがとう

16
jaredwilli

こんにちは @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 をダウンロードしてください。

P.Sこれは私の前の答えです。 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を設定することで自動的にそれらのサイズを作成します。あなたは何を必要としていますか?

6
MikeSchinkel

私があなたが質問を理解するならば、あなたは最初にこのようにサイズのリストを得る必要があります:

$image_sizes = get_intermediate_image_sizes();

これは、登録されているすべての画像サイズの配列を返します(デフォルト:大、中、サムネイル、 "add_image_size()"を使って登録された任意のカスタムサイズです)。この:

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

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

0
Bainternet