web-dev-qa-db-ja.com

元のアップロードされた画像を自動的に大きな画像サイズに置き換える

私達のユーザーがウェブサイトで使うために6MBの画像を定期的にアップロードするので(そしてそれらを最初にリサイズする方法にはあまり慣れていません)、WordPressはオリジナルを保存し、いくつかの異なるサイズにリサイズします。

アップロードした画像を受け取り、それを管理しやすいものにサイズ変更してから元の画像に置き換える機能またはプラグインが欲しいのですが。

オリジナルを削除してもそれを置き換えない機能を見たことがあるので、後でサムネイルを再生成することは不可能です。ユーザーが大きな画像をアップロードできるようにこれを置き換える必要があります。自動的にサイズ変更され、必要に応じて将来のサイズ変更のために保存されます。

12
Shaun

これをテーマフォルダのfunctions.phpファイルに追加してください。元の画像を設定で設定されている大きな画像に置き換えます。新しい画像フォーマットを設定し、それを新しい元のサイズとして使用することをお勧めします。

function replace_uploaded_image($image_data) {
      // if there is no large image : return
  if (!isset($image_data['sizes']['large'])) return $image_data;

  // paths to the uploaded image and the large image
  $upload_dir = wp_upload_dir();
  $uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
  // $large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file']; // ** This only works for new image uploads - fixed for older images below.
  $current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
  $large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];

  // delete the uploaded image
  unlink($uploaded_image_location);

  // rename the large image
  rename($large_image_location,$uploaded_image_location);

  // update image metadata and return them
  $image_data['width'] = $image_data['sizes']['large']['width'];
  $image_data['height'] = $image_data['sizes']['large']['height'];
  unset($image_data['sizes']['large']);

  return $image_data;
}

add_filter('wp_generate_attachment_metadata','replace_uploaded_image');
10
Paul Phillips

上記の解決策には厄介なバグが1つあります。このソリューションは新しい画像の魅力として機能しますが、古い画像の場合は、今月の現在のアップロードフォルダであるため、$upload_dir['path']と比較しないでください。

以下を交換してください。

//$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];
$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];
3
timocouckuyt

上記の答えのコードの更新を提案できますか。残念ながら、新しいバージョンのWordpressでは、ファイルサイズのためにキー 'path'は提供されていません。そのため、古い投稿のアップロードで機能させるには、最初に元の画像から現在のサブディレクトリを取得し、これを使用して大きな画像のロケーションパスを作成する必要があります。

だからこの行を交換してください:

$large_image_location = $upload_dir['basedir'] . '/'.$image_data['sizes']['large']['path'];

この2行で

$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];
2
leendertvb