Πώς να απενεργοποιήσεις τις εικόνες -scaled στο WordPress (big_image_size_threshold)
Διόρθωσε τις θολές εικόνες του WordPress ανεβάζοντας ή καταργώντας το όριο των 2560px με το φίλτρο big_image_size_threshold, και δες γιατί η εκ νέου μεταφόρτωση είναι το βήμα που όλοι προσπερνούν.
Δημοσιεύτηκε
Πρόσθεσε ένα φίλτρο στο big_image_size_threshold που επιστρέφει false και το WordPress σταματά να δημιουργεί αντίγραφα -scaled κατά τη μεταφόρτωση. Επίστρεψε αντ’ αυτού έναν αριθμό και ανεβάζεις το όριο αντί να το καταργείς. Και τα δύο πάνε στο functions.php ή σε ένα μικρό mu-plugin, και τα δύο επηρεάζουν μόνο τις μεταφορτώσεις που γίνονται αφού ενεργοποιηθεί το φίλτρο.
// Disable the cap entirely — no -scaled copies at all.
add_filter( 'big_image_size_threshold', '__return_false' );
// Or just raise it. Longest edge, in pixels.
add_filter( 'big_image_size_threshold', function () {
return 3840;
} );
Τι κάνει στην πραγματικότητα το WordPress
Από το WordPress 5.3 και μετά, κάθε μεταφόρτωση μετριέται στη μεγαλύτερη πλευρά της. Αν αυτή η πλευρά είναι μεγαλύτερη από το big_image_size_threshold — 2560px εξ ορισμού — το WordPress κωδικοποιεί ξανά την εικόνα μειώνοντάς τη σε αυτό το όριο, την αποθηκεύει ως your-photo-scaled.jpg, και ξαναγράφει τα μεταδεδομένα του συνημμένου ώστε το μέγεθος full να δείχνει πλέον στο αντίγραφο scaled.
Το πρωτότυπό σου δεν διαγράφεται. Μένει στον δίσκο με το αρχικό του όνομα, καταγεγραμμένο στα μεταδεδομένα του συνημμένου, και προσβάσιμο μέσα από την PHP με την wp_get_original_image_path(). Όμως τίποτα στο front end δεν το σερβίρει. Ούτε ο επεξεργαστής blocks, ούτε το srcset, ούτε η προεπισκόπηση της βιβλιοθήκης πολυμέσων. Κάθεται εκεί ως αντίγραφο αρχείου.
Όλα τα επόμενα παράγονται τότε από το αρχείο scaled, όχι από αυτό που ανέβασες:
| Μέγεθος | Πηγή από την οποία χτίζεται |
|---|---|
full | το αντίγραφο -scaled |
large, medium_large, medium, thumbnail | το αντίγραφο -scaled |
Προσαρμοσμένα μεγέθη από add_image_size | το αντίγραφο -scaled |
Μεγέθη θεμάτων και πρόσθετων, π.χ. woocommerce_thumbnail | το αντίγραφο -scaled |
Υποψήφια του srcset | το αντίγραφο -scaled |
Αυτό ακριβώς το γεγονός είναι που πιάνει τόσο κόσμο στον ύπνο.
Γιατί αυτή είναι η συνήθης αιτία του «η κοφτερή μου εικόνα φαίνεται θολή»
Δύο πράγματα συμβαίνουν ταυτόχρονα, και μόνο το ένα είναι προφανές.
Το προφανές είναι η ανάλυση. Ανεβάζεις μια φωτογραφία 4000px για ένα hero πλήρους πλάτους. Το WordPress δίνει στον browser 2560px. Σε μια κανονική οθόνη που γεμίζει ένα container 1600px, δεν το προσέχει κανείς. Σε μια οθόνη retina διπλής πυκνότητας, αυτό το container θέλει περίπου 3200 πραγματικά pixels, παίρνει 2560, και ο browser μεγεθύνει τη διαφορά. Θολές άκρες, πολτοποιημένη λεπτομέρεια, κείμενο μέσα στην εικόνα που γίνεται δυσανάγνωστο.
Το λιγότερο προφανές είναι η εκ νέου κωδικοποίηση. Το αντίγραφο -scaled δεν είναι μια περικοπή του αρχείου σου χωρίς απώλειες. Το WordPress αποκωδικοποιεί τη μεταφόρτωσή σου, την αλλάζει σε μέγεθος και τη συμπιέζει ξανά με τη δική του ρύθμιση ποιότητας JPEG. Αν το πρωτότυπό σου ήταν ήδη ένα συμπιεσμένο JPEG από το Lightroom ή από κινητό, αυτή είναι κωδικοποίηση δεύτερης γενιάς: τεχνουργήματα συμπίεσης πάνω σε τεχνουργήματα συμπίεσης. Η λεπτή λεπτομέρεια, ο κόκκος του φιλμ και οι επίπεδες διαβαθμίσεις την πληρώνουν χειρότερα. Αυτό φαίνεται ακόμη κι όταν οι διαστάσεις σε pixel μοιάζουν επαρκείς.
Επιβεβαίωσέ το πριν αλλάξεις οτιδήποτε. Άνοιξε την εικόνα σε νέα καρτέλα και διάβασε το όνομα αρχείου μέσα στο URL. Το -scaled.jpg σημαίνει ότι το όριο ενεργοποιήθηκε. Μια κατάληξη με διαστάσεις όπως -1536x1024.jpg σημαίνει κάτι διαφορετικό — το srcset διάλεξε ένα ενδιάμεσο που ήταν πολύ μικρό, και το φίλτρο του ορίου δεν θα σε βοηθήσει εκεί.
Στον διακομιστή:
find wp-content/uploads -name '*-scaled.*' | wc -l
Αν αυτός ο αριθμός είναι μεγάλος, το όριο διαμορφώνει ολόκληρη τη βιβλιοθήκη σου.
Μπορείς επίσης να ρίξεις ένα αρχείο στο εργαλείο απενεργοποίησης εικόνων scaled για να δεις αν μια δεδομένη πηγή θα ξεπερνούσε το όριο και σε ποιες διαστάσεις θα κατέληγε το αντίγραφο scaled, πριν δεσμευτείς σε μια ρύθμιση.
Ο ειλικρινής συμβιβασμός
Τα περισσότερα άρθρα σού λένε ότι η απενεργοποίηση του ορίου κοστίζει χώρο στον δίσκο. Αυτό είναι ανάποδα, και αξίζει να το πούμε με ακρίβεια.
Η χρήση δίσκου ανά εικόνα πέφτει ελαφρώς. Με το όριο ενεργό, το WordPress αποθηκεύει το πρωτότυπό σου και ένα μεγάλο αντίγραφο scaled. Με το όριο σβηστό, κρατάς μόνο το πρωτότυπο. Ένα αρχείο αντί για δύο.
Το εύρος ζώνης και το βάρος της σελίδας ανεβαίνουν, μερικές φορές πολύ. Με το όριο σβηστό, το full είναι η ανέπαφη μεταφόρτωσή σου. Οτιδήποτε συνδέει ή εμφανίζει το πλήρες μέγεθος — ένα lightbox, ένα πρόσθετο γκαλερί, ένας σύνδεσμος «προβολή πρωτοτύπου», ένα θέμα που ζητά full για τις hero εικόνες — στέλνει τώρα ένα αρχείο που μπορεί να είναι 6MB αντί για 900KB. Στα κινητά αυτό είναι πραγματικό πρόβλημα Largest Contentful Paint, και τα CDN εικόνων δεν θα σε σώσουν πάντα, επειδή κάποια από αυτά αφήνουν τα αρχεία να περνούν αυτούσια πάνω από ένα όριο μεγέθους.
Η μνήμη κατά τη μεταφόρτωση ανεβαίνει. Η αλλαγή μεγέθους μιας εικόνας 6000px στην PHP θέλει σημαντικά περισσότερη μνήμη από μία στα 2560px. Σε φθηνή κοινόχρηστη φιλοξενία με χαμηλό όριο μνήμης PHP, η απενεργοποίηση του ορίου είναι ένας εύλογος τρόπος να αρχίσεις να βλέπεις αποτυχημένες μεταφορτώσεις ή μισοφτιαγμένες μικρογραφίες. Το ανέβασμα του ορίου στα 3840 αντί για την κατάργησή του είναι η ασφαλέστερη εκδοχή της ίδιας αλλαγής.
Γι’ αυτό η λογική προεπιλογή για τα περισσότερα sites είναι να ανεβάσεις τον αριθμό, όχι να τον καταργήσεις. Η κατάργηση είναι σωστή όταν σερβίρεις εικόνες που πραγματικά χρειάζονται πλήρη ανάλυση: γκαλερί ποιότητας εκτύπωσης, ζουμ προϊόντων, αρχιτεκτονική φωτογραφία, οτιδήποτε όπου ο χρήστης αναμένεται να εξετάσει το πρωτότυπο.
Πώς να εφαρμόσεις σωστά την αλλαγή
1. Βάλε το φίλτρο κάπου που θα επιβιώσει. Το functions.php σε θυγατρικό θέμα δουλεύει. Ένα mu-plugin ενός αρχείου είναι καλύτερο, επειδή μια αλλαγή θέματος δεν μπορεί να το αναιρέσει σιωπηλά.
<?php
/**
* Plugin Name: Raise big image threshold
*/
add_filter( 'big_image_size_threshold', function () {
return 3840;
} );
2. Ανέβασε ξανά τις εικόνες που επηρεάζονται. Αυτό είναι το βήμα που ο κόσμος προσπερνά και μετά συμπεραίνει ότι το φίλτρο δεν δούλεψε. Το όριο αξιολογείται μία φορά, κατά τη μεταφόρτωση. Τα υπάρχοντα συνημμένα κρατούν τα παλιά τους μεταδεδομένα για πάντα. Διάγραψε το συνημμένο και ανέβασέ το ξανά, και μετά διόρθωσε τις αναφορές μέσα στα άρθρα σου.
3. Μην περιμένεις ότι η αναδημιουργία μικρογραφιών θα σώσει κάτι. Το wp media regenerate μέσω WP-CLI ξαναχτίζει τα ενδιάμεσα μεγέθη από ό,τι τα μεταδεδομένα ονομάζουν πλήρες αρχείο — που για μια ήδη περιορισμένη εικόνα είναι το αντίγραφο -scaled. Δεν μπορεί να επαναφέρει λεπτομέρεια που πετάχτηκε. Χρήσιμο ως καθάρισμα μετά την εκ νέου μεταφόρτωση. Άχρηστο ως λύση από μόνο του.
4. Έλεγξε το αποτέλεσμα, μην το θεωρήσεις δεδομένο. Αφού ανεβάσεις ξανά, άνοιξε την εικόνα στο front end και διάβασε πάλι το όνομα αρχείου. Αν δεν υπάρχει -scaled, το φίλτρο είναι ενεργό.
Πότε η απενεργοποίηση είναι λάθος κίνηση
Αν οι εικόνες πηγής σου είναι ήδη κάτω από 2560px και εξακολουθούν να φαίνονται θολές, το όριο δεν εμπλέκεται καθόλου. Το πρόβλημα είναι ότι το πλαίσιο προβολής είναι μεγαλύτερο από τα διαθέσιμα pixel, και η απάντηση είναι ένα μεγαλύτερο αρχείο πηγής ή ένα μικρότερο container — όχι αυτό το φίλτρο.
Αν το όνομα αρχείου που σερβίρεται κουβαλά κατάληξη με διαστάσεις αντί για -scaled, το srcset διάλεξε ένα μικρό υποψήφιο. Αυτό συνήθως είναι αναντιστοιχία ανάμεσα στο δηλωμένο πλάτος περιεχομένου του θέματός σου και στο πλαίσιο μέσα στο οποίο εμφανίζεται πραγματικά η εικόνα. Το σβήσιμο του ορίου δεν αλλάζει τίποτα σε αυτό.
Και αν κάποιο πρόσθετο ξαναγράφει το src σου προς έναν optimizer ή έναν proxy CDN, τίποτα από αυτά δεν ισχύει μέχρι να ελέγξεις τι σερβίρει αυτός ο proxy. Σύγκρινε τι θα έπρεπε να παράγει το WordPress με το τι φορτώνει πραγματικά ο browser· όταν αυτά τα δύο διαφωνούν, κοίτα τι κάθεται ανάμεσά τους.
FAQ
Ερωτήσεις
Πώς απενεργοποιώ τις εικόνες scaled στο WordPress;
Πρόσθεσε ένα φίλτρο στο big_image_size_threshold που επιστρέφει false. Βάλ' το στο functions.php ή σε ένα μικρό mu-plugin. Η επιστροφή false σβήνει εντελώς το όριο, οπότε οι μεταφορτώσεις κρατούν τις αρχικές τους διαστάσεις και δεν δημιουργείται κανένα αντίγραφο -scaled. Αν αντ' αυτού επιστρέψεις έναν αριθμό, όπως 3840, ανεβάζεις το όριο αντί να το καταργήσεις.
Τι σημαίνει η κατάληξη -scaled σε ένα όνομα αρχείου του WordPress;
Σημαδεύει ένα εκ νέου κωδικοποιημένο αντίγραφο που έφτιαξε το WordPress επειδή η μεταφόρτωσή σου ξεπέρασε τα 2560px στη μεγαλύτερη πλευρά της. Αυτό το αντίγραφο γίνεται το πλήρες μέγεθος παντού στο site σου. Το αρχικό σου αρχείο μένει στον δίσκο με το κανονικό του όνομα, αλλά τίποτα στο front end δεν συνδέει σε αυτό, και κάθε μικρογραφία και κάθε υποψήφιο του srcset χτίζεται από το αντίγραφο scaled.
Η απενεργοποίηση των εικόνων scaled τρώει περισσότερο χώρο στον δίσκο;
Ανά εικόνα συνήθως τρώει ελαφρώς λιγότερο, επειδή το WordPress σταματά να γράφει ένα δεύτερο μεγάλο αρχείο δίπλα στο αρχικό σου. Το πραγματικό κόστος είναι το εύρος ζώνης, όχι ο αποθηκευτικός χώρος. Με το όριο σβηστό, οτιδήποτε συνδέει στο πλήρες μέγεθος σερβίρει την ανέπαφη μεταφόρτωσή σου, που μπορεί να είναι αρκετά megabytes σε σύνδεση κινητού.
Θα διορθώσει η απενεργοποίηση του ορίου τις εικόνες που είναι ήδη θολές;
Όχι. Το φίλτρο επηρεάζει μόνο τις νέες μεταφορτώσεις. Οι εικόνες που βρίσκονται ήδη στη βιβλιοθήκη κρατούν μεταδεδομένα που δείχνουν στο αντίγραφο scaled, και η αναδημιουργία των μικρογραφιών ξαναχτίζει τα μεγέθη από το ίδιο περιορισμένο αρχείο. Για να ανακτήσεις την ανάλυση πρέπει να διαγράψεις το συνημμένο και να το ανεβάσεις ξανά αφού ενεργοποιηθεί το φίλτρο.
Είναι τα 2560px το σωστό όριο για να κρατήσω;
Για τα περισσότερα sites περιεχομένου, ναι. Μια πηγή 2560px καλύπτει ένα πλαίσιο προβολής 1280px σε διπλή πυκνότητα pixel, που είναι η συνηθισμένη περίπτωση. Ανέβασέ το στα 3840 αν τρέχεις hero εικόνες σε πλήρες πλάτος, ζουμ προϊόντων ή γκαλερί φωτογραφίας. Απενεργοποίησέ το εντελώς μόνο όταν πραγματικά χρειάζεσαι να σερβίρεις ανέπαφα πρωτότυπα.