Changelog

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. large and medium_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 .avif URL. (#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_threshold from 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.