{"id":376004,"date":"2026-09-28T10:36:16","date_gmt":"2026-09-28T10:36:16","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sobol-safe-save\/"},"modified":"2026-09-28T10:20:14","modified_gmt":"2026-09-28T10:20:14","slug":"sobol-safe-save","status":"publish","type":"plugin","link":"https:\/\/mai.wordpress.org\/plugins\/sobol-safe-save\/","author":23566626,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.0","stable_tag":"0.1.0","tested":"7.1.2","requires":"6.8","requires_php":"7.4","requires_plugins":null,"header_name":"Sobol Safe Save","header_author":"Lukasz Sobolewski","header_description":"Warns you before saving when WordPress will strip or change part of your content, and shows exactly which blocks are affected.","assets_banners_color":"f9fbfa","last_updated":"2026-09-28 10:20:14","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/lsobolew\/sobol-safe-save","header_author_uri":"https:\/\/github.com\/lsobolew","rating":0,"author_block_rating":0,"active_installs":0,"downloads":43,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"lsobolew","date":"2026-09-28 10:20:14","revision":3716889}},"upgrade_notice":{"0.1.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3716889,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3716889,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3716889,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3716889,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3716889,"resolution":"1","location":"assets","locale":"","width":1892,"height":1540},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3716889,"resolution":"2","location":"assets","locale":"","width":570,"height":692}},"screenshots":{"1":"A warning names the content that WordPress will remove before the post is saved.","2":"Sobol Safe Save shows the affected block and the exact markup difference in the document sidebar."}},"plugin_section":[],"plugin_tags":[529,1332,246,6565,895],"plugin_category":[46,54],"plugin_contributors":[281681],"plugin_business_model":[],"class_list":["post-376004","plugin","type-plugin","status-publish","hentry","plugin_tags-content","plugin_tags-editor","plugin_tags-html","plugin_tags-kses","plugin_tags-permissions","plugin_category-editor-and-writing","plugin_category-security-and-spam-protection","plugin_contributors-lsobolew","plugin_committers-lsobolew"],"banners":{"banner":"https:\/\/ps.w.org\/sobol-safe-save\/assets\/banner-772x250.png?rev=3716889","banner_2x":"https:\/\/ps.w.org\/sobol-safe-save\/assets\/banner-1544x500.png?rev=3716889","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sobol-safe-save\/assets\/icon-128x128.png?rev=3716889","icon_2x":"https:\/\/ps.w.org\/sobol-safe-save\/assets\/icon-256x256.png?rev=3716889","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sobol-safe-save\/assets\/screenshot-1.png?rev=3716889","caption":"A warning names the content that WordPress will remove before the post is saved."},{"src":"https:\/\/ps.w.org\/sobol-safe-save\/assets\/screenshot-2.png?rev=3716889","caption":"Sobol Safe Save shows the affected block and the exact markup difference in the document sidebar."}],"raw_content":"<!--section=description-->\n<p>WordPress quietly removes HTML that the person saving is not allowed to publish. No warning, no\nnotice, no record: the editor closes, the content looks wrong, and nobody knows why.<\/p>\n\n<p>It happens more often than most people realise, because it has nothing to do with the content and\neverything to do with who saved it. Anyone without the <code>unfiltered_html<\/code> capability is affected \u2014\nthat is every Author and Contributor on a normal site, and <strong>every user except the super admin on\nmultisite, site administrators included<\/strong>.<\/p>\n\n<p>Sobol Safe Save tells you before it happens.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Checks your content while you write, a moment after you stop typing.<\/li>\n<li>Warns you before you save that this save will change your content.<\/li>\n<li>Lists which blocks are affected, and takes you to them.<\/li>\n<li>Says what will go: a removed <code>&lt;iframe&gt;<\/code>, an <code>onclick<\/code> attribute, a <code>mask-image<\/code> style, a block\nmarker that will be rewritten.<\/li>\n<li>Works in the block editor.<\/li>\n<li><strong>Never blocks a save.<\/strong> It is a warning, not a gate. You stay in control of your own content.<\/li>\n<\/ul>\n\n<h4>How it knows<\/h4>\n\n<p>Sobol Safe Save does not guess, and it does not keep its own list of what WordPress allows. It runs your\ncontent through the same code WordPress itself runs on save \u2014 including the filters that are not\nKSES at all, such as the one that rewrites certain characters and the one that trims post titles \u2014\nand reports the difference. Its test suite checks the prediction against what actually lands in the\ndatabase, on every WordPress version it supports.<\/p>\n\n<h4>What it does not do<\/h4>\n\n<p>Nothing is sent anywhere. There is no tracking, no external service and no account. The analysis\nhappens on your own server, and nothing is stored.<\/p>\n\n<h4>For developers<\/h4>\n\n<p>Sobol Safe Save exposes documented PHP hooks and a JavaScript data store so that an add-on can build on\nit \u2014 an audit log, alerts, per-role policies. See the <a href=\"https:\/\/github.com\/lsobolew\/sobol-safe-save\/blob\/main\/plugins\/sobol-safe-save\/EXTENDING.md\">extension documentation<\/a>.<\/p>\n\n<h4>Development source<\/h4>\n\n<p>The human-readable JavaScript\/TypeScript source and build tools for the editor assets are available in\nthe <a href=\"https:\/\/github.com\/lsobolew\/sobol-safe-save\/tree\/main\/plugins\/sobol-safe-save\">public plugin source<\/a>.<\/p>\n\n<p>To rebuild the editor assets, install the dependencies in that directory and run <code>npm run build<\/code>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>That is all \u2014 it starts checking straight away for the users who need it.<\/li>\n<\/ol>\n\n<p>Under Settings \u2192 Sobol Safe Save you can choose which post types are checked, whether the title and\nexcerpt are checked too, and how long to wait after typing stops.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20am%20i%20not%20seeing%20any%20warnings%3F\"><h3>Why am I not seeing any warnings?<\/h3><\/dt>\n<dd><p>Most likely nothing of yours is being filtered. On a single site, administrators and editors hold\nthe <code>unfiltered_html<\/code> capability, so WordPress leaves their content alone and Sobol Safe Save has nothing\nto report. Try the same content as an Author.<\/p><\/dd>\n<dt id=\"does%20it%20stop%20me%20from%20saving%3F\"><h3>Does it stop me from saving?<\/h3><\/dt>\n<dd><p>No. It warns you before you save, and the save button works exactly as it did. What you do about\nthe warning is up to you.<\/p><\/dd>\n<dt id=\"does%20it%20change%20my%20content%3F\"><h3>Does it change my content?<\/h3><\/dt>\n<dd><p>No. Sobol Safe Save only ever reads. The changes it reports are made by WordPress itself, and would\nhappen whether or not this plugin is installed \u2014 the difference is that you now know about them.<\/p><\/dd>\n<dt id=\"does%20it%20slow%20down%20the%20editor%3F\"><h3>Does it slow down the editor?<\/h3><\/dt>\n<dd><p>The check runs on your own server a short pause after you stop typing, never on every keystroke,\nand it stops asking altogether for users whose content is not filtered. The delay is configurable.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20multisite%3F\"><h3>Does it work on multisite?<\/h3><\/dt>\n<dd><p>Yes, and that is where it matters most: on multisite only the super admin may post unfiltered HTML,\nso a site's own administrator loses content exactly as an author does.<\/p><\/dd>\n<dt id=\"what%20about%20the%20classic%20editor%3F\"><h3>What about the classic editor?<\/h3><\/dt>\n<dd><p>Not yet. This version covers the block editor only. Classic editor support is written and works, but\nit is not shipped until it has the same end-to-end test coverage as everything else here.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Warns you before saving when WordPress is about to strip part of your content, and shows which blocks.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/376004","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=376004"}],"author":[{"embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lsobolew"}],"wp:attachment":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=376004"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=376004"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=376004"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=376004"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=376004"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=376004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}