WP Manifestindependent plugin directory
manifest / media / upload-control-rules

Upload Control Rules

Rules applied to every media upload: transliterated lowercase file names, camera metadata removed from the original file, and control over the sizes, quality and duplicates WordPress produces.

by George Vasiliades · github.com/poseidonas/upload-control-rules · website

0stars
1release downloads
0forks

Install

The author publishes release zips, so WP-CLI can install straight from GitHub:

wp plugin install https://github.com/poseidonas/upload-control-rules/releases/download/v1.0.0/upload-control-rules.zip

Declares an update source (https://github.com/Poseidonas/upload-control-rules), so updates arrive through the plugin's own updater.

Readme

Upload Control Rules

Latest release WordPress 6.7+ PHP 8.0+ License GPL-2.0-or-later

Rules applied to every media upload: transliterated lowercase file names, camera metadata removed from the original file, and control over the sizes, quality and duplicates WordPress produces.

What was measured before writing this

A 3200 x 2400 JPEG named in Greek, carrying embedded camera metadata, was uploaded to a plain WordPress 7.0 installation. What happened:

  • The file kept its Greek name, so its public address became a string of percent codes.
  • WordPress produced 11 files on disk for that one upload: the untouched original, a scaled copy, and nine intermediate sizes.
  • The scaled copy and the sizes lost their metadata as a side effect of re-encoding, but the original file kept everything, byte for byte - including location data - and that original is publicly reachable at a predictable address.

Those are the three problems this plugin addresses, at the moment of upload. Files already in the library are not changed.

Settings

Settings > Uploads.

File names

Setting Effect Default
Rewrite non-Latin file names Greek and Cyrillic letters become Latin ones. Greek follows the common transliteration, including the digraphs ου to ou, αυ to av, ευ to ev, μπ to mp, ντ to nt, γκ to gk, γγ to ng, τσ to ts, τζ to tz, θ to th, χ to ch and ψ to ps. The map can be replaced through a filter. Applies to the name only, never to the content On
Lowercase file names photo.JPG and photo.jpg would otherwise be two different addresses On

Καλοκαίρι στην Αθήνα (Τελικό) V2.JPG becomes kalokairi-stin-athina-teliko-v2.jpg.

Camera metadata

Setting Effect Default
Remove camera metadata from JPEG originals Location, camera model and shooting time are removed from the uploaded file itself On

Order matters here, and this is where most tools get it wrong: the orientation flag is applied first, so a photo shot sideways stays upright after the flag is gone, and the ICC colour profile is carried over when the server runs a working Imagick, so colours do not shift. The image is re-encoded once. With GD the profile cannot be carried over, and the settings page says which case applies to your server - checked with a real decode probe, not by asking whether the extension exists, because an Imagick build without a JPEG delegate is common and would otherwise be reported as capable.

Only JPEG files are touched. PNG, GIF and WebP carry no location data in normal use.

Sizes and quality

Setting Effect Default
Sizes that are not produced A checklist of every registered size with its dimensions. Every tick removes one file per upload none
Largest kept dimension Images wider or taller are scaled down, as WordPress already does at 2560 without asking. Zero keeps the WordPress value. Between 512 and 10000 0
Compression quality For the sizes WordPress generates. Zero keeps the WordPress value of 82. Between 30 and 100 0
Delete the untouched original after scaling When WordPress scales a large image down, the full original stays on disk unused. Removing it saves the most space of any option here, and cannot be undone Off

On the measured installation, unticking six of the nine registered sizes brought one upload from 11 files down to 5.

What is accepted

Setting Effect Default
Reject identical files An upload whose content matches a file already in the library is refused, and the error names the existing file. Compared by checksum, so the file name does not matter. Works even when metadata removal changes the stored copy, because the checksum of the incoming file is recorded as well Off
File types that are not accepted Every type WordPress currently accepts is listed. Ticked types are refused for every user none

There is deliberately no option to allow additional types such as SVG. Allowing SVG uploads safely requires sanitising markup, which is a different job and one this plugin will not pretend to do.

Honest limits

  • Metadata removal re-encodes the JPEG once, which is a small quality loss. That is the cost of removing what is embedded in the file.
  • Deleting the untouched original is irreversible and means the full-resolution image is gone. It is off by default for that reason.
  • Removing a size that a theme or shop layout uses means WordPress serves the nearest other size instead.
  • Nothing is applied retroactively. The rules act on uploads from the moment they are switched on.

Filters

  • icxcnika_upload_settings - all settings before they are applied.
  • icxcnika_upload_transliteration - the character map used for file names, an array of search strings to replacements applied longest first.
  • icxcnika_upload_registry_payload - data sent to the installation registry.

Data stored

  • Option icxcnika_upload_settings (the settings).
  • Option icxcnika_upload_registry_key (random installation key of 48 characters, created only if installation reporting is active).
  • Post meta _icxcnika_upload_hash on every new attachment (the checksum of the stored file, plus the checksum of the incoming file when metadata removal changed it).
  • Post meta _icxcnika_upload_original_removed on attachments whose untouched original was deleted.
  • Transient icxcnika_upload_release (cached GitHub release lookup, 12 hours).
  • Cron event icxcnika_upload_registry_ping (weekly, only if installation reporting is active).

Installation reporting

On activation, on deactivation and once a week the plugin sends a small JSON message to the author's installation registry: plugin slug, plugin version, home URL, site URL, WordPress version, WooCommerce version if present, PHP version, locale and whether the site is a multisite. Each report carries a random installation key generated locally on first use. The reporting address is empty by default, which means nothing is sent at all. No files, no file names, no content and no personal data are ever sent to the author. Add define( 'ICXCNIKA_REGISTRY_DISABLE', true ); to wp-config.php to turn the reporting off, or define( 'ICXCNIKA_REGISTRY_URL', '...' ); to point it elsewhere.

Updates

Updates are delivered from GitHub Releases of this repository. WordPress shows them on the Plugins screen like any other update, together with the details view and the automatic updates link.

Uninstall

Deleting the plugin removes both options, both post meta keys from every attachment, the transient and the cron event. Files that were renamed, cleaned or scaled stay exactly as they are, because they are your files.


Upload Control Rules (Ελληνικά)

Κανόνες που εφαρμόζονται σε κάθε ανέβασμα πολυμέσων: μεταγραμμένα πεζά ονόματα αρχείων, αφαίρεση μεταδεδομένων κάμερας από το πρωτότυπο αρχείο, και έλεγχος στα μεγέθη, την ποιότητα και τα διπλότυπα που παράγει το WordPress.

  • Δημιουργός: George Vasiliades - https://github.com/Poseidonas
  • Άδεια: GPL-2.0-or-later
  • Απαιτεί WordPress 6.7+ και PHP 8.0+

Τι μετρήθηκε πριν γραφτεί

Ένα JPEG 3200 x 2400 με ελληνικό όνομα και ενσωματωμένα μεταδεδομένα κάμερας ανέβηκε σε καθαρή εγκατάσταση WordPress 7.0. Τι συνέβη:

  • Το αρχείο κράτησε το ελληνικό του όνομα, οπότε η δημόσια διεύθυνσή του έγινε μια σειρά από κωδικούς με ποσοστά.
  • Το WordPress παρήγαγε 11 αρχεία στον δίσκο για αυτό το ένα ανέβασμα: το ανέγγιχτο πρωτότυπο, ένα σμικρυμένο αντίγραφο και εννέα ενδιάμεσα μεγέθη.
  • Το σμικρυμένο αντίγραφο και τα μεγέθη έχασαν τα μεταδεδομένα τους ως παρενέργεια της επανακωδικοποίησης, αλλά το πρωτότυπο τα κράτησε όλα, byte προς byte - μαζί με τα δεδομένα τοποθεσίας - και αυτό το πρωτότυπο είναι δημόσια προσβάσιμο σε προβλέψιμη διεύθυνση.

Αυτά είναι τα τρία προβλήματα που αντιμετωπίζει το πρόσθετο, τη στιγμή του ανεβάσματος. Τα αρχεία που βρίσκονται ήδη στη βιβλιοθήκη δεν αλλάζουν.

Ρυθμίσεις

Ρυθμίσεις > Ανεβάσματα.

Ονόματα αρχείων

Ρύθμιση Ενέργεια Προεπιλογή
Μετατροπή μη λατινικών ονομάτων αρχείων Τα ελληνικά και κυριλλικά γράμματα γίνονται λατινικά. Τα Ελληνικά ακολουθούν την καθιερωμένη μεταγραφή, μαζί με τους δίγραφους ου σε ou, αυ σε av, ευ σε ev, μπ σε mp, ντ σε nt, γκ σε gk, γγ σε ng, τσ σε ts, τζ σε tz, θ σε th, χ σε ch και ψ σε ps. Ο χάρτης αντικαθίσταται μέσω φίλτρου. Ισχύει μόνο για το όνομα, ποτέ για το περιεχόμενο Ενεργό
Πεζά ονόματα αρχείων Αλλιώς το photo.JPG και το photo.jpg θα ήταν δύο διαφορετικές διευθύνσεις Ενεργό

Το Καλοκαίρι στην Αθήνα (Τελικό) V2.JPG γίνεται kalokairi-stin-athina-teliko-v2.jpg.

Μεταδεδομένα κάμερας

Ρύθμιση Ενέργεια Προεπιλογή
Αφαίρεση μεταδεδομένων κάμερας από τα πρωτότυπα JPEG Η τοποθεσία, το μοντέλο της κάμερας και η ώρα λήψης αφαιρούνται από το ίδιο το ανεβασμένο αρχείο Ενεργό

Η σειρά έχει σημασία, και εδώ είναι που τα περισσότερα εργαλεία κάνουν λάθος: η σημαία προσανατολισμού εφαρμόζεται πρώτη, ώστε μια φωτογραφία τραβηγμένη πλάγια να μείνει όρθια αφού φύγει η σημαία, και το προφίλ χρώματος ICC μεταφέρεται όταν ο server τρέχει λειτουργικό Imagick, ώστε να μην αλλοιωθούν τα χρώματα. Η εικόνα επανακωδικοποιείται μία φορά. Με την GD το προφίλ δεν μπορεί να μεταφερθεί, και η σελίδα ρυθμίσεων δηλώνει ποια περίπτωση ισχύει στον server σας - με πραγματική δοκιμή αποκωδικοποίησης, όχι με ερώτηση αν υπάρχει η επέκταση, επειδή είναι συχνό ένα Imagick χωρίς JPEG delegate που αλλιώς θα δηλωνόταν ικανό.

Αγγίζονται μόνο αρχεία JPEG. Τα PNG, GIF και WebP δεν φέρουν δεδομένα τοποθεσίας σε κανονική χρήση.

Μεγέθη και ποιότητα

Ρύθμιση Ενέργεια Προεπιλογή
Μεγέθη που δεν παράγονται Λίστα με κάθε εγγεγραμμένο μέγεθος και τις διαστάσεις του. Κάθε επιλογή αφαιρεί ένα αρχείο ανά ανέβασμα κανένα
Μέγιστη διατηρούμενη διάσταση Εικόνες πλατύτερες ή ψηλότερες σμικρύνονται, όπως ήδη κάνει το WordPress στο 2560 χωρίς να ρωτήσει. Το μηδέν κρατά την τιμή του WordPress. Από 512 έως 10000 0
Ποιότητα συμπίεσης Για τα μεγέθη που παράγει το WordPress. Το μηδέν κρατά την τιμή 82 του WordPress. Από 30 έως 100 0
Διαγραφή του ανέγγιχτου πρωτοτύπου μετά τη σμίκρυνση Όταν το WordPress σμικρύνει μια μεγάλη εικόνα, το πλήρες πρωτότυπο μένει στον δίσκο αχρησιμοποίητο. Η αφαίρεσή του εξοικονομεί τον περισσότερο χώρο από κάθε άλλη επιλογή εδώ, και δεν αναιρείται Ανενεργό

Στην εγκατάσταση που μετρήθηκε, το ξεμαρκάρισμα έξι από τα εννέα εγγεγραμμένα μεγέθη κατέβασε ένα ανέβασμα από 11 αρχεία σε 5.

Τι γίνεται δεκτό

Ρύθμιση Ενέργεια Προεπιλογή
Απόρριψη πανομοιότυπων αρχείων Ένα ανέβασμα με περιεχόμενο ίδιο με αρχείο που υπάρχει ήδη απορρίπτεται, και το σφάλμα κατονομάζει το υπάρχον αρχείο. Η σύγκριση γίνεται με άθροισμα ελέγχου, οπότε το όνομα δεν έχει σημασία. Λειτουργεί ακόμα και όταν η αφαίρεση μεταδεδομένων αλλάζει το αποθηκευμένο αντίγραφο, επειδή καταγράφεται και το άθροισμα του εισερχόμενου αρχείου Ανενεργό
Τύποι αρχείων που δεν γίνονται δεκτοί Εμφανίζεται κάθε τύπος που δέχεται αυτή τη στιγμή το WordPress. Οι επιλεγμένοι απορρίπτονται για κάθε χρήστη κανένας

Σκόπιμα δεν υπάρχει επιλογή για αποδοχή επιπλέον τύπων όπως το SVG. Η ασφαλής αποδοχή SVG απαιτεί καθαρισμό σήμανσης, που είναι διαφορετική δουλειά και αυτό το πρόσθετο δεν θα προσποιηθεί ότι την κάνει.

Τίμιοι περιορισμοί

  • Η αφαίρεση μεταδεδομένων επανακωδικοποιεί το JPEG μία φορά, με μικρή απώλεια ποιότητας. Αυτό είναι το κόστος της αφαίρεσης όσων είναι ενσωματωμένα στο αρχείο.
  • Η διαγραφή του ανέγγιχτου πρωτοτύπου είναι μη αναστρέψιμη και σημαίνει ότι η εικόνα πλήρους ανάλυσης χάνεται. Γι' αυτό είναι ανενεργή από προεπιλογή.
  • Η αφαίρεση μεγέθους που χρησιμοποιεί ένα θέμα ή μια διάταξη καταστήματος σημαίνει ότι το WordPress θα σερβίρει το πλησιέστερο άλλο μέγεθος.
  • Τίποτα δεν εφαρμόζεται αναδρομικά. Οι κανόνες ισχύουν για τα ανεβάσματα από τη στιγμή που ενεργοποιούνται.

Φίλτρα

  • icxcnika_upload_settings - όλες οι ρυθμίσεις πριν εφαρμοστούν.
  • icxcnika_upload_transliteration - ο χάρτης χαρακτήρων για τα ονόματα αρχείων, πίνακας αναζητήσεων προς αντικαταστάσεις που εφαρμόζονται από τη μεγαλύτερη προς τη μικρότερη.
  • icxcnika_upload_registry_payload - τα δεδομένα που στέλνονται στο μητρώο εγκαταστάσεων.

Δεδομένα που αποθηκεύονται

  • Option icxcnika_upload_settings (οι ρυθμίσεις).
  • Option icxcnika_upload_registry_key (τυχαίο κλειδί εγκατάστασης 48 χαρακτήρων, δημιουργείται μόνο αν είναι ενεργή η αναφορά εγκατάστασης).
  • Post meta _icxcnika_upload_hash σε κάθε νέο συνημμένο (το άθροισμα ελέγχου του αποθηκευμένου αρχείου, συν το άθροισμα του εισερχόμενου όταν η αφαίρεση μεταδεδομένων το άλλαξε).
  • Post meta _icxcnika_upload_original_removed στα συνημμένα των οποίων το ανέγγιχτο πρωτότυπο διαγράφηκε.
  • Transient icxcnika_upload_release (cache της αναζήτησης έκδοσης στο GitHub, 12 ώρες).
  • Cron event icxcnika_upload_registry_ping (εβδομαδιαίο, μόνο αν είναι ενεργή η αναφορά εγκατάστασης).

Read the full README on GitHub →

Releases

TagPublishedAssetDownloads
v1.0.0 Aug 19, 2026 upload-control-rules.zip 1