{"id":279230,"date":"2026-02-11T16:25:58","date_gmt":"2026-02-11T16:25:58","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/webp-only-keep-originals-safe\/"},"modified":"2026-02-11T16:27:42","modified_gmt":"2026-02-11T16:27:42","slug":"origisafe-advanced-image-optimizer","status":"publish","type":"plugin","link":"https:\/\/so.wordpress.org\/plugins\/origisafe-advanced-image-optimizer\/","author":15364867,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"0.0.122","stable_tag":"0.0.122","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"OrigiSafe \u2014 Advanced Image Optimizer (WebP) \u2014 Keep Originals Safe","header_author":"ipodguy79","header_description":"Converts JPG\/PNG uploads (and existing library) to WebP, moves originals to \/uploads\/_originals\/, and updates attachment metadata so WordPress serves .webp.","assets_banners_color":"1f2545","last_updated":"2026-02-11 16:27:42","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/origisafe-advanced-image-optimizer\/","header_author_uri":"https:\/\/profiles.wordpress.org\/ipodguy79\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":160,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.0.122":{"tag":"0.0.122","author":"ipodguy79","date":"2026-02-11 16:27:42"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3459133,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3459133,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3459133,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3459133,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.0.122"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[163,233,187,15376],"plugin_category":[50,52],"plugin_contributors":[227757],"plugin_business_model":[],"class_list":["post-279230","plugin","type-plugin","status-publish","hentry","plugin_tags-images","plugin_tags-media-library","plugin_tags-optimization","plugin_tags-webp","plugin_category-media","plugin_category-performance","plugin_contributors-ipodguy79","plugin_committers-ipodguy79"],"banners":{"banner":"https:\/\/ps.w.org\/origisafe-advanced-image-optimizer\/assets\/banner-772x250.png?rev=3459133","banner_2x":"https:\/\/ps.w.org\/origisafe-advanced-image-optimizer\/assets\/banner-1544x500.png?rev=3459133","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/origisafe-advanced-image-optimizer\/assets\/icon-128x128.png?rev=3459133","icon_2x":"https:\/\/ps.w.org\/origisafe-advanced-image-optimizer\/assets\/icon-256x256.png?rev=3459133","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Keep Originals Safe, convert JPEG\/PNG images to WebP and makes WebP the canonical file. WP returns <code>.webp<\/code> URLs, Keeping originals safely archived.<\/p>\n\n<h3>How it works (high level)<\/h3>\n\n<ol>\n<li><p><strong>Convert<\/strong><\/p>\n\n<ul>\n<li>For a JPG\/PNG attachment, the plugin generates a WebP for the full image and all WordPress-generated sizes.<\/li>\n<li>Conversion is done through WordPress\u2019 image editor system (<strong>WP_Image_Editor<\/strong>), meaning it uses <strong>GD<\/strong> or <strong>Imagick<\/strong> (whichever your server supports) with WebP support enabled.<\/li>\n<\/ul><\/li>\n<li><p><strong>Move originals<\/strong><\/p>\n\n<ul>\n<li>The original JPG\/PNG files are moved to:\n\n<ul>\n<li><code>wp-content\/uploads\/_originals\/...<\/code><\/li>\n<\/ul><\/li>\n<li>The folder structure mirrors your uploads structure.<\/li>\n<\/ul><\/li>\n<li><p><strong>Update WordPress to serve WebP<\/strong><\/p>\n\n<ul>\n<li>Attachment \u201cfile\u201d + metadata are updated so WordPress serves <code>.webp<\/code> as the attachment file.<\/li>\n<li>Attachment mime type is updated to <code>image\/webp<\/code>.<\/li>\n<\/ul><\/li>\n<li><p><strong>Optional: Replace old URLs everywhere<\/strong><\/p>\n\n<ul>\n<li>If enabled, the plugin can replace old <code>.jpg\/.png<\/code> URLs across:\n\n<ul>\n<li>post content<\/li>\n<li>postmeta<\/li>\n<\/ul><\/li>\n<li>Replacement is <strong>serialized-safe<\/strong> (does not break serialized arrays).<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<h3>Background jobs (keeps running after page reload)<\/h3>\n\n<p>Conversion\/repair\/sweep jobs are designed to run in the background. They keep ticking even if you refresh the page or close the tab.<\/p>\n\n<p>The plugin uses multiple loopback methods (admin-post \/ REST \/ public tick fallback) so it can keep working even on restrictive hosting setups.<\/p>\n\n<h3>Log + \u201cit looks frozen\u201d note<\/h3>\n\n<p>A rolling \u201cterminal style\u201d log is written to:\n- <code>wp-content\/uploads\/hsbc-webp-only\/logs\/webp-only.log<\/code><\/p>\n\n<p>If the log appears to freeze in the admin page:\n- click <strong>Refresh Log<\/strong>, or\n- refresh the page<\/p>\n\n<p>The job may still be running server-side; refreshing the log\/page usually catches up.<\/p>\n\n<h3>Usage<\/h3>\n\n<p>Go to <strong>Media \u2192 WebP Only<\/strong>.<\/p>\n\n<h3>Settings<\/h3>\n\n<ul>\n<li><strong>Quality<\/strong>\n\n<ul>\n<li>WebP quality for conversion (0\u2013100).<\/li>\n<\/ul><\/li>\n<li><strong>Batch size<\/strong>\n\n<ul>\n<li>How many items to process per tick. Smaller batches reduce server load.<\/li>\n<\/ul><\/li>\n<li><strong>Replace old .jpg\/.png URLs across content + postmeta (serialized-safe)<\/strong>\n\n<ul>\n<li>Recommended if your site content contains hard-coded image URLs.<\/li>\n<\/ul><\/li>\n<li><strong>Sweep Include \/ Exclude<\/strong>\n\n<ul>\n<li>Used by the Sweep tools to control which folders are scanned.<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h3>Conversion Jobs (buttons)<\/h3>\n\n<p><strong>Start Bulk Convert<\/strong>\n- Converts Media Library attachments (JPG\/PNG) in batches.\n- Moves originals to <code>uploads\/_originals\/<\/code>.\n- Updates attachment metadata so WordPress serves <code>.webp<\/code>.\n- Optional URL replacement (content + postmeta).<\/p>\n\n<p><strong>Start Repair\/Cleanup<\/strong>\n- Repairs inconsistencies if something was partially converted or moved.\n- Useful after restores\/migrations or if some attachments have mismatched metadata.\n- Optional URL replacement.<\/p>\n\n<p><strong>Start Folder Sweep<\/strong>\n- Scans the filesystem for eligible images (based on your Sweep Include\/Exclude rules).\n- Designed for sites with additional image folders beyond standard uploads.\n- Optional URL replacement.<\/p>\n\n<p><strong>Stop Job<\/strong>\n- Stops the currently running job.<\/p>\n\n<h3>Maintenance \/ Cleanup (buttons)<\/h3>\n\n<p><strong>Delete duplicate _originals<\/strong>\n- Deletes backup files in <code>uploads\/_originals\/<\/code> *only when* an identical file already exists in <code>uploads\/<\/code>.\n- This is a cleanup tool for situations where originals were restored back into uploads and you no longer need the archived duplicate.<\/p>\n\n<p><strong>Delete duplicate _webp<\/strong>\n- Removes orphaned WebP cache files in:\n  - <code>uploads\/_webp\/<\/code>\n- Only deletes WebP files that no longer match anything in <code>uploads\/<\/code> or <code>uploads\/_originals\/<\/code>.<\/p>\n\n<p><strong>Delete duplicate sweep _originals<\/strong>\n- Maintenance cleanup for <strong>non-uploads<\/strong> roots (folders under <code>wp-content\/<\/code>) that contain their own <code>_originals\/<\/code> folders.\n- It uses your <strong>Sweep Include<\/strong> list to find those roots.\n- Only deletes a file from <code>&lt;root&gt;\/_originals\/<\/code> when the same file exists at <code>&lt;root&gt;\/<\/code> AND the file size matches (safe duplicate).<\/p>\n\n<p><strong>Revert Everything<\/strong>\n- Restores original JPG\/PNG files from <code>uploads\/_originals\/<\/code> back into <code>uploads\/<\/code>.\n- Reverts attachment metadata so WordPress serves the originals again.<\/p>\n\n<h3>Log controls<\/h3>\n\n<p><strong>Refresh Log<\/strong>\n- Pulls the latest log tail into the admin screen.<\/p>\n\n<p><strong>Reset Log<\/strong>\n- Clears the log file.<\/p>\n\n<h3>Requirements<\/h3>\n\n<ul>\n<li>WordPress\u2019 image editor must support WebP.\n\n<ul>\n<li><strong>GD<\/strong> with WebP support, or<\/li>\n<li><strong>Imagick<\/strong> with WebP support<\/li>\n<\/ul><\/li>\n<li>If WebP conversion is not supported on your server, conversion\/repair\/sweep will refuse to run (revert tools can still work).<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin<\/li>\n<li>Go to <strong>Media \u2192 WebP Only<\/strong><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20delete%20my%20originals%3F\"><h3>Does this delete my originals?<\/h3><\/dt>\n<dd><p>No. Originals are moved into <code>wp-content\/uploads\/_originals\/<\/code> and can be restored with <strong>Revert Everything<\/strong>.<\/p><\/dd>\n<dt id=\"does%20this%20create%20%E2%80%9Csidecar%E2%80%9D%20webp%20while%20keeping%20the%20jpg%2Fpng%20as%20the%20main%20file%3F\"><h3>Does this create \u201csidecar\u201d WebP while keeping the JPG\/PNG as the main file?<\/h3><\/dt>\n<dd><p>No. This plugin is designed to make WebP the canonical attachment file in WordPress (while keeping originals archived).<\/p><\/dd>\n<dt id=\"what%20does%20%E2%80%9Creplace%20everywhere%E2%80%9D%20do%3F\"><h3>What does \u201cReplace everywhere\u201d do?<\/h3><\/dt>\n<dd><p>It replaces old <code>.jpg\/.png<\/code> URLs in post content and postmeta. It is serialized-safe to avoid breaking serialized values.<\/p><\/dd>\n<dt id=\"why%20do%20i%20see%20an%20%60_webp%60%20folder%3F\"><h3>Why do I see an `_webp` folder?<\/h3><\/dt>\n<dd><p>The plugin can reuse archived WebP files and also provides a cleanup tool that removes orphaned WebP files that no longer match anything.<\/p><\/dd>\n<dt id=\"what%20this%20plugin%20does%20not%20do\"><h3>What this plugin does NOT do<\/h3><\/dt>\n<dd><ul>\n<li>It does not generate AVIF (WebP only).<\/li>\n<li>It does not add <code>&lt;picture&gt;<\/code> tags or do theme-level markup changes.<\/li>\n<li>It does not optimize already-WebP images.<\/li>\n<li>It does not rewrite external\/CDN image URLs outside your WordPress database content\/postmeta.<\/li>\n<\/ul><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.0.122<\/h4>\n\n<ul>\n<li>Initial build: WebP conversion, move originals, bulk\/repair\/sweep\/revert tools, cleanup tools, background runner, and logging.<\/li>\n<\/ul>","raw_excerpt":"Convert JPG\/PNG uploads (and existing library) to WebP, move originals to \/uploads\/_originals\/, and update Media Library metadata - WP serves .webp","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/279230","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=279230"}],"author":[{"embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ipodguy79"}],"wp:attachment":[{"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=279230"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=279230"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=279230"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=279230"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=279230"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/so.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=279230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}