Ich weiß, dass dies sehr alt ist, aber ich musste dieses Problem noch lösen. Dies hat möglicherweise für neue Bilder funktioniert, als ich es in functions.php verwendet habe, aber ich hatte einige Probleme und Bilder, die unbrauchbar wurden, und ich konnte dies auch nicht zum Aktualisieren nutzen vorhandene Bilder. Ich hatte ungefähr 2000 vorhandene Bilder, die ich brauchte, um sie alle durchzugehen und alle alten großen Bilder kleiner zu machen. Ich habe im Frontend eine Seite erstellt, auf die nur ein Administrator zugreifen kann, und diesen Code verwendet.
Der große Unterschied besteht darin, dass anstatt das OG-Bild zu löschen und das 'große' Bild in den OG-Namen umzubenennen. (Dies hat bei mir nicht funktioniert, ich habe bei dieser Methode einige Bilder verloren.) Stattdessen habe ich das große Bild kopiert und die Kopie genauso benannt wie das OG-Bild. Daher wird das große Bild durch das kleinere "große" Bild überschrieben. Auch im Frontend musste ich ändern, wie die Metadaten aktualisiert werden.
Testen Sie dies zuerst an einzelnen Posts. Stellen Sie sicher, dass dies für Sie funktioniert, bevor Sie numposts auf -1 ändern. Ich habe dumm ungefähr 100 Bilder verloren, die versucht haben, den Originalcode auszuführen, ohne zuerst die Ergebnisse sorgfältig zu überprüfen.
FRONT END CODE ZUM AKTUALISIEREN BESTEHENDER BILDER:
function replace_uploaded_image_frontend($image_data, $attachment_id) {
// 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'];
$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];
//Original code was delete OG file and rename the large file to the OG name. This means you no longer have the large size image. So...
//Instead I want to take the large file and make a copy and overwrite it over the large file.
$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";
}
fixImageMeta($attachment_id );
}
function fixImageMeta($attach_id) {
$file = get_attached_file($attach_id);
if (!empty($file)) {
$info = getimagesize($file);
$meta = array (
'width' => $info[0],
'height' => $info[1],
'hwstring_small' => "height='{$info[1]}' width='{$info[0]}'",
'file' => basename($file),
'sizes' => array(), // thumbnails etc.
'image_meta' => array(), // EXIF data
);
update_post_meta($attach_id, '_wp_attachment_metadata', $meta);
}
}
$args = array(
'post_type' => 'exhibitions',
'p' => 12926,
'order' => 'DESC',
/*'date_query' => array(
'after' => array(
'year' => 2016,
'month' => 2,
'day' => 28,
),
'before' => array(
'year' => 2016,
'month' => 6,
'day' => 30,
),
),*/
'numberposts' => 1
);
$myposts = get_posts($args);
foreach ($myposts as $mypost){
$attachment_id = get_post_thumbnail_id( $mypost->ID );
echo '<br>Attach ID: ' . $attachment_id . ' ';
$unfiltered = false;
$image_data = wp_get_attachment_metadata( $attachment_id, $unfiltered );
print_r($image_data);
replace_uploaded_image_frontend($image_data, $attachment_id);
}
Dies ist natürlich mehrmals auf Fehler gestoßen, wie ich mir aufgrund einiger beschädigter Bilder vorstellen kann. Nachdem ich versucht hatte, sie alle auf einmal durchzugehen und Fehler zu erhalten, musste ich einige Zeit damit verbringen, Datumsbereiche durchzugehen, um sicherzugehen, dass ich sie alle aktualisiert habe.
CODE FÜR NEUE BILDER, In 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'];
$current_subdir = substr($image_data['file'],0,strrpos($image_data['file'],"/"));
$large_image_location = $upload_dir['basedir'] . '/'.$current_subdir.'/'.$image_data['sizes']['large']['file'];
//Instead I want to take the large file and make a copy and overwrite it over the original file.
$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";
}
// update image metadata and return them
$image_data['width'] = $image_data['sizes']['large']['width'];
$image_data['height'] = $image_data['sizes']['large']['height'];
return $image_data;
}
add_filter('wp_generate_attachment_metadata','replace_uploaded_image');