Wie erzeuge ich Thumbnails nur bei Bedarf?

Ich habe 1000 Bilder. Wie kann ich WordPress machen, um den Daumen nur bei Bedarf zu erzeugen. Zum Beispiel wird Home-Slider nur 10 Bilder verwenden, ich möchte nicht, dass die anderen 1000 Bilder dieses Thumbnail erzeugt haben, da es eine Verschwendung von Platz und Ressourcen ist.

Es gibt eine Möglichkeit, add_image_size nur bei Bedarf auszulösen.

Vielen Dank

UPDATE Wie du schon erwähnt hast ist nicht wirklich add_image_size was es braucht um gefeuert zu werden. Was wäre toll, wenn ich die Bildgröße ändern würde, wenn ich the_post_thumbnail (‘slider-thumb’) verwende; Vielleicht ist diese Verlangsamung der erste Blick auf das Bild, aber diese Ansicht wird normalerweise von mir erzeugt, wenn ich den Beitrag reviewe, also ist es mir egal.

Also zwischen meinen Posts, Slider, Blog Thumbnails, Portfolio Thumbnails etc Ich habe 1000 Bilder und ich möchte nur 10 Bilder für den Schieberegler Größe ändern Ich sehe eine Menge verschwendeter Ressourcen, um die Thumbnail-Größe für die anderen 990 Bilder zu generieren.

Hoffe es ist jetzt klar, Entschuldigung für mein Englisch

Solutions Collecting From Web of "Wie erzeuge ich Thumbnails nur bei Bedarf?"

Werfen Sie einen Blick auf Ottos Dynamic Image Resizer Plugin

Dieses Plugin ändert die Art und Weise, wie WordPress Bilder erstellt, um die Bilder nur dann zu erzeugen, wenn sie tatsächlich irgendwo im laufenden Betrieb verwendet werden. Bilder, die auf diese Weise erstellt wurden, werden in den normalen Upload-Verzeichnissen gespeichert, um später schnell vom Webserver gesendet werden zu können. Das Ergebnis ist, dass Speicherplatz gespart wird (da Bilder nur bei Bedarf erstellt werden), und das Hochladen von Bildern ist viel schneller (da die Bilder beim Hochladen nicht mehr erzeugt werden).

Setzen Sie dies in Ihre Themenfunktionsdatei. Dadurch wird verhindert, dass WordPress beim Hochladen etwas anderes als die drei Standardgrößen erstellt.

Wenn ein Bild dann in einer bestimmten Größe angefordert wird, die noch nicht erzeugt wurde, wird es nur einmal erzeugt.

add_filter('image_downsize', 'ml_media_downsize', 10, 3); function ml_media_downsize($out, $id, $size) { // If image size exists let WP serve it like normally $imagedata = wp_get_attachment_metadata($id); if (is_array($imagedata) && isset($imagedata['sizes'][$size])) return false; // Check that the requested size exists, or abort global $_wp_additional_image_sizes; if (!isset($_wp_additional_image_sizes[$size])) return false; // Make the new thumb if (!$resized = image_make_intermediate_size( get_attached_file($id), $_wp_additional_image_sizes[$size]['width'], $_wp_additional_image_sizes[$size]['height'], $_wp_additional_image_sizes[$size]['crop'] )) return false; // Save image meta, or WP can't see that the thumb exists now $imagedata['sizes'][$size] = $resized; wp_update_attachment_metadata($id, $imagedata); // Return the array for displaying the resized image $att_url = wp_get_attachment_url($id); return array(dirname($att_url) . '/' . $resized['file'], $resized['width'], $resized['height'], true); } add_filter('intermediate_image_sizes_advanced', 'ml_media_prevent_resize_on_upload'); function ml_media_prevent_resize_on_upload($sizes) { // Removing these defaults might cause problems, so we don't return array( 'thumbnail' => $sizes['thumbnail'], 'medium' => $sizes['medium'], 'large' => $sizes['large'] ); } 

Leider @ Patrick Antwort bricht die srcset functionen in WP 4.4 eingeführt. Glücklicherweise müssen wir nur zwei zusätzliche functionen hinzufügen!

Zunächst müssen wir alle registrierten Thumbnail-Größen vorübergehend in die Bildmetadaten aufnehmen, damit sie berücksichtigt werden können:

 function bi_wp_calculate_image_srcset_meta($image_meta, $size_array, $image_src, $attachment_id){ //all registered sizes global $_wp_additional_image_sizes; //some source file specs we'll use a lot $src_path = get_attached_file($attachment_id); $src_info = pathinfo($src_path); $src_root = trailingslashit($src_info['dirname']); $src_ext = $src_info['extension']; $src_mime = wp_check_filetype($src_path); $src_mime = $src_mime['type']; $src_base = wp_basename($src_path, ".$src_ext"); //find what's missing foreach($_wp_additional_image_sizes AS $k=>$v) { if(!isset($image_meta['sizes'][$k])) { //first, let's find out how things would play out dimensionally $new_size = image_resize_dimensions($image_meta['width'], $image_meta['height'], $v['width'], $v['height'], $v['crop']); if(!$new_size) continue; $new_w = (int) $new_size[4]; $new_h = (int) $new_size[5]; //bad values if(!$new_h || !$new_w) continue; //generate a filename the same way WP_Image_Editor would $new_f = wp_basename("{$src_root}{$src_base}-{$new_w}x{$new_h}." . strtolower($src_ext)); //finally, add it! $image_meta['sizes'][$k] = array( 'file' => $new_f, 'width' => $new_w, 'height' => $new_h, 'mime-type' => $src_mime ); } } return $image_meta; } add_filter('wp_calculate_image_srcset_meta', 'bi_wp_calculate_image_srcset_meta', 10, 4); 

Dann müssen wir die Matches durchlaufen und fehlende Thumbnails erzeugen:

 function bi_wp_calculate_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id){ //get some source info $src_path = get_attached_file($attachment_id); $src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME)); //the actual image metadata (which might be altered here) $src_meta = wp_get_attachment_metadata($attachment_id); //an array of possible sizes to search through $sizes = $image_meta['sizes']; unset($sizes['thumbnail']); unset($sizes['medium']); unset($sizes['large']); $new = false; //loop through sources foreach($sources AS $k=>$v) { $name = wp_basename($v['url']); if(!file_exists("{$src_root}{$name}")) { //find the corresponding size foreach($sizes AS $k2=>$v2) { //we have a match! if($v2['file'] === $name) { //make it if(!$resized = image_make_intermediate_size( $src_path, $v2['width'], $v2['height'], $v2['crop'] )){ //remove from sources on failure unset($sources[$k]); } else { //add the new thumb to the true meta $new = true; $src_meta['sizes'][$k2] = $resized; } //remove from the sizes array so we have //less to search next time unset($sizes[$k2]); break; }//match }//each size }//each 404 }//each source //if we generated something, update the attachment meta if($new) wp_update_attachment_metadata($attachment_id, $src_meta); return $sources; } add_filter('wp_calculate_image_srcset', 'bi_wp_calculate_image_srcset', 10, 5); 

Tatsächlich erzeugt add_image_size() nicht das Thumbnail, es registriert nur eine Bildgröße, die für WordPress verfügbar ist.

In der Regel werden Miniaturbilder erstellt, wenn das Bild zum ersten Mal hochgeladen wird. Es ist ein automatischer process, sodass Sie sich keine Sorgen machen müssen, sie später zu generieren. Denken Sie einmal darüber nach – wenn es 1-2 Sekunden dauert, ein Thumbnail auf einem langsamen Server zu erstellen, und Sie warten, bis es angefordert wird, zwingen Sie den Requester, zusätzliche 1-2 Sekunden pro Bild zu warten, um den Inhalt zu sehen. Es ist viel einfacher, dies im Voraus zu tun – dh wenn das Bild hochgeladen wird.

Wenn Sie die Thumbnails zu einem anderen Zeitpunkt unbedingt bearbeiten müssen, sollten Sie sich auch das Plugin ” Thumbnails regenerieren” von Viper ansehen. Es verwendet eine On-Demand-Aktion, um alle Ihre Thumbnails neu zu generieren … aber Sie könnten ähnlichen Code verwenden, um Thumbnails nur bei Bedarf zu generieren.

Sie können mein (nicht Ottos) “Dynamic Image Resize” 1) Plugin verwenden.

“Dynamic Image Resize” ist ein WordPress (MU-) Plugin, das einen Shortcode und ein Template-Tag zur Größenänderung von Bildern “on the flight” ohne TimThumb, aber mit WP-corefunktionen bietet.

Das Plugin wird mit einem Template-Tag und einem Shortcode ausgeliefert .

1) Habe gerade über das Ottos Plugin erfahren. Namenskollision war nicht beabsichtigt.

Sie können dieses Plugin ausprobieren: https://wordpress.org/plugins/optimize-images-resizing

Es ändert die Größe der Bilder basierend auf Ihrer registrierten Bildgröße, aber nur bei Bedarf. Sie können auch vorhandene Bildgrößen bereinigen, damit sie regenerieren können.

Es gibt eine Möglichkeit, add_image_size nur bei Bedarf auszulösen.

Nicht genau. Aber Sie können die Liste der registrierten Größen direkt vor der Erstellung der Vorschaubilder filtern. Die wp_generate_attachment_metadata () -function (die die function aufruft, die die Thumbnails erzeugt) hat einen Filter namens “intermediate_image_sizes_advanced”, mit dem Sie das Array der Größen bearbeiten können, kurz bevor die Dateien generiert werden. Sie können diesen Filter immer dann verwenden, wenn Sie ein Bild eines bestimmten “Typs” hinzufügen und anschließend sofort entfernen.

Ich denke, Ihre größte Herausforderung wäre, herauszufinden, wie Bilder, die die zusätzlichen Größen benötigen, und solche, die dies nicht tun, unterschieden werden müssen.

WP-Performance-Pack- Plugin bietet “verbesserte Bildverarbeitung”, die auf Ottos Dynamic Image Resizer basiert, aber viele Verbesserungen enthält, zB: Erstens ist es kompatibel mit der neuesten WordPress-Version (3.9.1), verwendet WP_Image_Editor, Speichern von Thumbnails kann ausgeschaltet sein (aber sie können zwischengespeichert werden und CDN Support ist auf ihrem Weg), Regenerieren Thumbails Integration (um bestehende Thumbnails zu löschen) und einige mehr.

Sie können auch Aqua Resizer versuchen – https://github.com/syamilmj/Aqua-Resizer/

Es ist nur eine einzige Datei.

Du kannst es so benutzen:

 $img_src = aq_resize( $img_src, $width = null, $height = null, $crop = null, $single = true, $upscale = false ); $img_src = aq_resize( $img_src, 150, 150); // resized $img_src = aq_resize( $img_src, 150, 150, true); // cropped $img_src = aq_resize( $img_src, 150, 150, null, null, true); // image with 120x120 for example will be upscaled up to 150x150 

Hier noch ein weiterer Ansatz: Seine Haken in die 404 HTTP-Fehlerbehandlung. Wenn keine Miniaturansicht verfügbar ist, suchen Sie das Originalbild und erstellen Sie das Miniaturbild. Beachten Sie, dass dies Ihr Problem nicht wirklich triggers, da es die Erstellung von Thumbnails während des Uploads nicht verhindert.

Beachten Sie auch, dass dieses Plugin von böswilligen Benutzern verwendet werden kann, um eine beliebige Anzahl von Miniaturansichten zu erstellen und somit Ihren Speicherplatz zu erschöpfen.

Hinweis: Dieses Plugin kann mit PlugInception einfach installiert werden.

 < ?php /* Plugin Name: Create thumbnails on demand Plugin URI: Description: Create thumbnails instead of showing 404. Use in combination with "Broken Link Checker" to create all missing thumbnails. Version: 0.1 Author: Jack Miller Author URI: License: License URI: */ add_filter('status_header', 'createThumbIf404'); function createThumbIf404($httpCodeString) //eg HTTP/1.1 200 OK { global $wp_query; error_reporting(E_ALL); ini_set('display_errors', 1); $httpCode = explode(" ", $httpCodeString); $httpCode = $httpCode[1]; if ($httpCode == "404") { $requestUri = $_SERVER["REQUEST_URI"]; $regex = '/^\/(wp-content\/uploads\/(?:[a-zA-Z0-9]*\/){2})(.*)-(.*)x(.*)\.jpg$/'; preg_match($regex, $requestUri, $groups); if (sizeof($groups) === 5) { $baseDir = $groups[1]; $baseName = $groups[2]; $sizeX = $groups[3]; $sizeY = $groups[4]; $oriImg = ctod_checkFile($baseDir, $baseName); if ($oriImg != null) { $image = wp_get_image_editor($baseDir . $oriImg); if (!is_wp_error($image)) { $image->resize($sizeX, $sizeY, true); $thumb = $baseDir . $baseName . '-' . $sizeX . 'x' . $sizeY . '.jpg'; $image->save($thumb); ctod_sendImageAndExit($thumb); } } } } } //finds original image within $baseDir with $baseName. //Returns file name including extension of original image or null. function ctod_checkFile($baseDir, $baseName) { $arr = array( ".jpg", ".JPG", ".jpeg", ".JPEG" ); foreach ($arr as &$ext) { if (file_exists($baseDir . $baseName . $ext)) { return $baseName . $ext; } } return null; } //Read file at $path from disk and return it as HTTP JPG image request. function ctod_sendImageAndExit($path) { $fp = fopen($path, 'rb'); header("Content-Type: image/jpeg"); header("Content-Length: " . filesize($path)); fpassthru($fp); exit(); }