1.10.1
Fixed
- SQL injection vulnerability in media library tag search query.
1.10.0
Added
- Choose the optimization output format: AVIF (default) or WebP, from settings and onboarding. (#504)
- WPML / WPML Media Translation integration for duplicate detection, optimization propagation and usage indexation. (#313)
- SVG scoring: SVG files are treated as already optimized; embedded base64 raster images lower the file score. (#307)
Changed
- Use a single shared WP_Filesystem instance across the application. (#307)
Fixed
- Usage indexation no longer errors when a post record is missing during meta updates.
1.9.2
Fixed
- Thumbnail optimization no longer converts the same on-disk file multiple times when several registered sizes share it (e.g.
largeandmedium_large).
1.9.1
Fixed
- URL replacements during optimization and rollback no longer skip content when the old URL is a substring of the optimized
.avifURL. (#504)
1.9.0
Added
- WordPress 7.0 interface compatibility : Filters and search bar are well displayed know.
- WordPress 7.0 AI compatibility : You can now choose you local AI instead of Mediapapa for generating media metadata.
- Allow to choose the media distance for the duplicates with filter
mediapapa/duplicates/distance_thresholdfrom 0 (the same image) to 5 (pretty different). - Refactoring of the settings code system making it more reliable.
- Add data telemetry based on your setting.
1.8.1
Fixed
- Unused media from Bulk/cleaning was not having the right PHP import.
1.8.0
Added
- Media locking : when activated the media cannot be deleted from API, bulk, cleaning or manual actions. Duplication process is still available but we still prevent the media deletion.
Changed
- Polylang : When AI analyzing media, use the media language and not the site language as reference.
- Do display a proper error message when quota is reached.
- Add more preflight conditions before optimizing : Filesystem not writable, .avif file already existing
1.7.0
Added
- Add Woocommerce out of the box integration
- Allow to optimize the avif files if not perfectly optimized
Changed
- Refactor the whole URL/ID detection avoiding false positives, implement new integration part.
- Enhance the CI/CD files
1.6.0
Added
- Add the French translation.
Changed
- Revamped the admin UI with a top level entry.
- Performance improvements for the duplicates detection, allowing to not check it to database at each load.
Fixed
- Fix the url to JS making translations work properly.
- Do not create indexes with same name as the columns to avoid possible collision when creating the tables.
1.5.0
Added
- Add MEDIA_TRASH activation from settings.
- When put into trash, Media are renamed with -trash suffix for soft 404
- When optimizing a media original files are backuped with a -backup name
- Allow to restore the -backup files that have been optimized
Changed
- i18n strings have been updated and enhanced.
Fixed
- Make license on local site not possible when defined in network.
1.4.2
Fixed
- Handles properly the post_content slashed data that has been unslashed by WordPress when replacement process occurs.
1.4.1
Fixed
- Make indexation of media usages use specific post types ‘any’ is skipping non searchable post_types like ‘wp_block’
1.4.0
Added
- Onboarding wizard for first-time setup (welcome, license activation, features, AI configuration). (#161)
- Migration step to rename all `mpp_*` identifiers to `mediapapa_*` (options, tables, meta, taxonomies, Action Scheduler hooks).
- Duplicate detection for non-image attachments via MD5 hash. (#161)
- “Optimal” state when optimized file is larger than the original
- Allow to display the usages from the edition modal.
- Non-image media support: MIME icon fallback, conditional dimensions/filesize display.
- Analytics opt-in option
- PHP 8.4 compatibility for the external packages too.
Fixed
- Optimization no longer errors when the result is larger than the original; falls back to the original file gracefully.
- Duplicate indexing now handles missing files and optional perceptual hash failures.
- `DuplicateDB` disables MySQL-specific routines when running on SQLite.
Changed
- Rename all internal identifiers from `mpp_*` to `mediapapa_*` (options, REST fields, meta keys, taxonomies, query vars, Action Scheduler groups).
- REST schema for `mediapapa_optimized` now accepts `true`, `false`, or `’optimal’` enum values.
- Duplicate table adds nullable `phash` and new `md5` column for non-image support.
- Duplicate indexing applies to all attachment types, not just images.
- `OptimizeAttachmentProcess::run()` returns structured `replacement_groups` data.
- `BulkProcessOptimize` relies on process return value instead of separate Replace/Duplicate calls.
- Add `composer-patches` with PHP 8.4 explicit nullable patch for `jenssegers/imagehash`.
- WordPress tested up to 7.0.
1.3.0
Added
- Admin column for media file size with sortable ordering. (#75)
- Polylang integration for duplicate detection and optimization sync. (#312)
- PHP 8.4 compatibility aded.
Fixed
- Group by post ID in queries to prevent duplicate results when filtering. (#378)
- Toolbar not displayed correctly on the `media/text` core block. (#364)
- Update related attachment scores when media is deduplicated. (#357)
- Scope Tailwind CSS base styles to `body.mediapapa` to prevent WordPress admin style leakage.
Changed
- Deduplication on cleaning is now gated behind the duplicate feature being active. (#329)
1.2.2
Changed
- Use `%i` placeholder for SQL identifier columns (savings query table).
- Rename `lifeCycle` for Duplicate module; fix typo in `TitleCalculator`.
- Remove Algolia CDN reference.
- Add `.cursor` rules for all plugin features.
Tests
- Add tests for `Operations`.
- Add tests for `Replacer`.
- Add tests for URL replacement with optimized media.
1.2.1
Added
- Order media by score in admin columns. (#241)
- Reorder Library indicator statistics (better to lower). (#264)
- Filter bulk actions by status; JS-driven bulk notifications replace PHP admin notices. (#331)
- Shared timer for bulk action polling.
- `onComplete` property for `Countdown` component.
Changed
- Bulk store extracted to dedicated module; `useBulk` hook consumes it.
- Do not display PHP admin notice for bulk; use JS `Notice` components instead.
- Disable “Stop all” button when no bulk items present.
Tests
- Update PHP and E2E tests for new bulk interface and unschedule flow.
1.2.0
Added
- Media library toolbar layout improvements for grid filters. (#111, #112)
- Bulk processing system for list and grid views. (#215)
- Bulk optimize, AI metadata, and deduplicate actions.
- REST API endpoints for bulk creation, status polling, and deletion.
- Percentage indicator for indexation progress.
- Admin notice for pending bulk actions.
- Auto-reload bulk items every 20 seconds.
- Bulk AI metadata process. (#200, #201)
- Bulk deduplication process. (#198)
- Clickable tags to filter the current media list. (#165)
- Alt text help description based on core. (#138)
Fixed
- Properly unschedule Action Scheduler processes.
- Add total attachments count to AI action.
Changed
- Backward compatibility layer for old bulk process data structure.
- Cache added to `pre_option` method for bulk.
- Zip generation renamed to `mediapapa-pro`.
1.1.1
Fixed
- Bug on indexation triggered from the Editor.
1.1.0
Added
- Elementor / Elementor Pro compatibility for media replacement and detection. (#195)
- Feature API to enable/disable plugin capabilities (e.g., Duplicates). (#79446)
- Score and title display beneath grid view elements. (#177)
- Notification improvements for deduplication actions. (#191)
- Detect WP blocks inside Elementor content.
Fixed
- Duplicate suggestion ordering now uses real date and filesize. (#199)
- Attachment deletion now trashes instead of hard-deleting. (#208)
- Elementor replacement handling (unslash, field detection).
- Library indicator display limited to list and grid contexts.
- `object_field` not found error.
- Permission check changed from array to per-media `current_user_can`.
Changed
- Regroup usage counters by source and source type for a global counter. (#213)
- Duplicate entity recommendation algorithm updated. (#199)
- Score display on grid view deactivated until UX is finalized.
- Score data moved to `SCOREDATASET` constant.
Tests
- Add tests for Elementor Replacer / Detector.
- Add tests for Feature API.
1.0.1
Fixed
- License handling: allow key change, display errors only when relevant. (#189)
- `hasEdits` now checks only changed entity record properties. (#189)
- Remove useless transient delete parameter. (#186)
- Bad return on admin network page.
1.0.0
Added
- Software licensing with updater integration. (#150)
- `readme.txt` for WordPress repository compatibility.
- Upload duplicate blocking option. (#100)
- Cover block support. (#144)
- User quota display for AI analyze with incentive for more. (#140)
- License key field: hide value, allow edit by deletion. (#147)
- Message when image has been optimized but is still too big. (#124)
- Option to limit image size at upload optimization. (#122)
- `OptimizationContext` class for width, height, and accept handling.
- Admin notice when indexing process is running. (#180)
- Plugin i18n support for JS and PHP with POT generation.
- Zip plugin file generation from any branch.
- User search history via REST API (live data). (#125)
- Modal open trigger on title list link. (#108)
- Navigation image modal with chevron sizing. (#109)
- Usage column sortable with `QueryModifier` class.
- Usage button for medias in the media list.
- Filter by used/unused medias; order by usage count.
- Network settings link in plugin list (multisite).
- Score filtering by file, score, and tags. (#168)
- Autocompletion text for media upload. (#186)
Fixed
- Snackbar icon compatibility across Gutenberg versions. (#135)
- Plugin author orthography. (#136)
- Tags positioning. (#113)
- `UsageIndicator` component removed from health column. (#101)
- Do not navigate between images when user focuses on field. (#109)
- Force reindex on plugin deactivation/reactivation.
- Store included multiple times error.
- Remove extra user meta from indexing.
- Specific label for Grid mode select.
- `add_query_arg` argument order.
- Duplicate distance fixed at 5.
- Array passed by reference on endpoint handler.
- Upload error handling.
- Post type display without REST API.
- Close modal on deletion.
- Parse all `post_types` when indexing.
- Object ID for metadata.
- `auto_analyse` check when analyzing.
- Image size check before getting sizes.
- Image compression message typo.
- Editor style dependencies in site editor context.
- Featured image change on page image optimization.
- `WP_Filesystem_Base` require instead of `WP_Filesystem_Direct`.
- Do not delete already-deleted attachment.
- Do not update list if not present on document.
Changed
- Rename `MediaPapa` to `Mediapapa` consistently.
- Rename taxonomy to “Media Tags”.
- Move duplicates storage to local database.
- Replace entities with new Image ID system.
- Use MD5 for site identification.
- Use `.eu` domain for API.
- Production API endpoint.
- Quotas based on API call; optimize is not counted as AI.
- `wp_attachment_is` replaced by `wp_attachment_is_image`.
- Minimal support for non-image media types.
- `getStatus` compatibility for WP < 6.5.
- Distance threshold moved to class constant.
- Deploy moved from GitHub to Buddy.
- Resize media toolbar for select/reset buttons. (#146)
- Separate stores into files for sidebar and prepublish. (#145)
- Duplicate recommendation algorithm: file format priority for same score. (#124)
- Remove PanelFile from editor.
- Remove `UsageIndicator` from health column.
- Media toolbar resize for select and reset button display. (#146)
- Autocompletion text for media on upload. (#186)
Tests
- Add tests for `DuplicateDB`.
- Add tests for `MmApiErrors`.
- Add tests for `AiAttachment`.
- Add tests for `AiContext`.
- Add tests for `OptimizationContext`.
- Add tests for `AdminList` filters.
0.0.4
Added
- REST API endpoint for indexing process status.
- REST route for the replacement process.
- Score DTO and score table.
- Admin page redesign with `AdminSettingSection` component.
- `useSetting` hook replacing `useEntityProp` usage.
- Content tags set as soon as available.
- AI calls gated behind setting toggle.
- Duplicate modal base.
- Notification zone for snackbar on admin list.
- Tag selector with most-used terms in admin list.
- AVIF and WebP format support.
- Score changed from points to percentages.
- `react-intersection-observer` for lazy loading list items.
- Media filename getter method.
- Duplicate entity getter and export refactoring.
- REST API and options for indexing process status.
- Library indicator update on media change in modal.
- Global context for content editing with forced `core-data` registration.
Fixed
- Score calculation bug for tags.
- Modal saving: wait before refreshing dataTable.
- Panel not closing on value update.
- Save attachment before optimizing for correct duplicate info.
- Warning on Duplicates API deletion.
- `text/html` as default Content-Type.
- Non-blocking request response handling.
- Classic options not updated bug.
- Multisite vs. local options differentiation.
- Grid JS loaded only in grid context.
- Height/width empty metadata handling.
- Cleanup duplicates at first reindex page.
- Image-to-JPEG transform for AI analysis (AVIF/WebP not supported).
- Runtime exception handling on analyze.
- API error display and logging.
- `ContentTags` help props.
- `TagSelector` “most used terms” placement.
- Attachment row flex class.
- Card duplicate border-radius.
- Modal duplicate card selection.
- Removed `explicitDismiss` from success snackbar.
- `ImageListItem` missing style.
- Concurrency issues with multiple containers.
- Subtype and type handling for replacements.
Changed
- Score calculation limited to title, tag, file, and duplicates.
- AI button hidden on frontend if setting not enabled.
- `getLetter` renamed to `getScoreData` with id and label entries.
- `as_schedule_single_action` replaced by `as_enqueue_async_action`.
- Default quota values method added.
- Admin panels reorganized into isolated components.
- Multisite support via `wp-env`.
- Image score weight set to 30.
- Admin columns reordered; taxonomy column redefined.
- Duplicate hook uses `attachment_id` instead of post for trash support.
- Media upload handling improved with cache cleanup.
Tests
- Add tests for replacement utils.
- Add tests for options replacement.
- Adapt tests to new score format and subtype parameter.
0.0.3
Changed
- Remove permissions and token from GitHub Actions.
0.0.2
Changed
- GitHub Actions release workflow improvements.
- Use v2.1.0 of release action.
0.0.1
Added
- Initial plugin scaffold and base architecture.
- Media indexing tables infrastructure.
- CI/CD pipeline with GitHub Actions (PHP tests, E2E with Playwright).
- Multi-PHP version and multi-WP core version test matrix.
- Composer setup with Yoast polyfills and PHPUnit.
- `wp-env` based development environment.
- README with local setup and i18n instructions.
- Psalm static analysis integration.
- i18n command for translations.
- Code coverage configuration.