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


13

ユーザーが定期的に〜6MBの画像をアップロードしてWebサイトで使用するため(最初にそれらのサイズを変更する方法に慣れていないため)、WordPressはオリジナルを保存し、さまざまなサイズにサイズ変更します。

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

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

回答:


10

これをテーマフォルダーの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');

1
このソリューションが機能する場合、プラグインを作成すると非常に便利です。
アレクセイ

私はこれをもう一度試しましたが、最初に2048x1536(必要な大きさの2倍)である新しいサイズ(「フルサイズ」と呼ばれる)を追加しました。何度もではなく、将来必要に応じて(必要に応じて)必要な大きさです。ありがとう!
ショーン

それはあなたのために働いてくれてうれしいです!
ポールフィリップス

このコードは、functions.phpファイルからすべてを削除しました。WPエディターとFTPでチェックしましたが、ファイルは空でした。バックアップからファイルを復元する必要がありました。:(
jlg 14年

1
@Ciprianすべてを繰り返すスクリプトを設定する必要があります。すべての添付ファイル情報を取得するWordPressの方法があるはずですが、$ wpdb-> get_col( 'SELECT id FROM wp_posts WHERE post_type = "attachment" ORDER BY id'); 画像の投稿IDのリストを取得するために動作します。追加する場合があります:また、post_mime_type = "image / jpeg"もjpegに制限します。各画像の実際の場所はwp_postmetaに保持されます。
ポールフィリップス

3

上記のソリューションには厄介なバグが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'];

2

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

したがって、次の行を置き換えます。

$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'];

0

私はこれを別の非常によく似た質問に投稿しましたが、再投稿する価値があると考えました。

上記のコードに問題があり、私にとってうまくいったのはこれらの行を本質的に変更することでした:

unlink($uploaded_image_location);
rename($large_image_location, $uploaded_image_location);

で:

    $file_to_be_copied = $large_image_location; 
    $copied_file_name = $uploaded_image_location;
  //make a copy of the large image and name that the title of the original image
    if (!copy($file_to_be_copied, $copied_file_name)) {
        echo "failed to copy $file...\n";
    }

完全なコードと詳細な説明をここに投稿しました: 元の画像を削除-サムネイルを保持しますか?

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