{"id":287157,"date":"2026-03-13T11:34:16","date_gmt":"2026-03-13T11:34:16","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/clean-ai-markup\/"},"modified":"2026-03-25T19:20:37","modified_gmt":"2026-03-25T19:20:37","slug":"markuclean-markup-cleaner","status":"publish","type":"plugin","link":"https:\/\/twd.wordpress.org\/plugins\/markuclean-markup-cleaner\/","author":15088096,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.2","stable_tag":"1.0.2","tested":"6.9.4","requires":"5.8","requires_php":"8.0","requires_plugins":null,"header_name":"MarkuClean \u2013 AI Markup Cleaner","header_author":"Ivijan-Stefan Stipi\u0107","header_description":"Cleans and normalizes markup artifacts commonly produced by AI generated text content.","assets_banners_color":"fcfcfc","last_updated":"2026-03-25 19:20:37","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/www.linkedin.com\/in\/ivijanstefanstipic\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":288,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"ivijanstefan","date":"2026-03-13 12:54:55"},"1.0.1":{"tag":"1.0.1","author":"ivijanstefan","date":"2026-03-20 22:24:00"},"1.0.2":{"tag":"1.0.2","author":"ivijanstefan","date":"2026-03-25 19:20:37"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.jpg":{"filename":"icon-128x128.jpg","revision":3481927,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3481927,"resolution":"256x256","location":"assets","locale":""},"icon-512x512.jpg":{"filename":"icon-512x512.jpg","revision":3481927,"resolution":"512x512","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3481927,"resolution":"1544x500","location":"assets","locale":""},"banner-1880x609.jpg":{"filename":"banner-1880x609.jpg","revision":3481927,"resolution":"1880x609","location":"assets","locale":""},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3481927,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3491176,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/options-general.php?page=markuclean-markup-cleaner&tab=settings\",\"preferredVersions\":{\"php\":\"8.0\",\"wp\":\"6.9\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"features\":{\"networking\":false},\"steps\":[{\"step\":\"installPlugin\",\"options\":{\"activate\":true},\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"markuclean-markup-cleaner\"}},{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3487524,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3487524,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3487524,"resolution":"3","location":"assets","locale":""}},"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2353,155767,234534,148076,1119],"plugin_category":[],"plugin_contributors":[88088,125492],"plugin_business_model":[],"class_list":["post-287157","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-classic-editor","plugin_tags-content-cleanup","plugin_tags-gutenberg","plugin_tags-markup","plugin_contributors-creativform","plugin_contributors-ivijanstefan","plugin_committers-creativform","plugin_committers-ivijanstefan","plugin_support_reps-creativform","plugin_support_reps-ivijanstefan"],"banners":{"banner":"https:\/\/ps.w.org\/markuclean-markup-cleaner\/assets\/banner-772x250.jpg?rev=3481927","banner_2x":"https:\/\/ps.w.org\/markuclean-markup-cleaner\/assets\/banner-1544x500.jpg?rev=3481927","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/markuclean-markup-cleaner\/assets\/icon-128x128.jpg?rev=3481927","icon_2x":"https:\/\/ps.w.org\/markuclean-markup-cleaner\/assets\/icon-256x256.jpg?rev=3481927","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/markuclean-markup-cleaner\/assets\/screenshot-1.png?rev=3487524","caption":""},{"src":"https:\/\/ps.w.org\/markuclean-markup-cleaner\/assets\/screenshot-2.png?rev=3487524","caption":""},{"src":"https:\/\/ps.w.org\/markuclean-markup-cleaner\/assets\/screenshot-3.png?rev=3487524","caption":""}],"raw_content":"<!--section=description-->\n<p>MarkuClean Markup Cleaner cleans and normalizes post content in supported WordPress editing contexts.<\/p>\n\n<p>It removes unwanted characters, markup artifacts, and copy-and-paste leftovers from post title, content, and excerpt values. This includes known special characters and malformed sequences commonly introduced by AI-generated content and external copy tools, such as mis-encoded quotes, dashes, ellipses, non-breaking spaces, zero-width characters, and numeric data-start\/data-end markers.<\/p>\n\n<p>The plugin helps keep content consistent and clean where cleanup is supported. It works with standard WordPress content edited in Gutenberg and TinyMCE-based workflows.<\/p>\n\n<p>For safety, builder-managed content is skipped. Elementor, WPBakery \/ Visual Composer, Beaver Builder, Divi Builder, Oxygen, Bricks, SiteOrigin, and similar editors often store structured markup, shortcode trees, JSON-like payloads, or hidden metadata. The plugin returns that content unchanged.<\/p>\n\n<!--section=installation-->\n<p>Install from WordPress admin:<\/p>\n\n<ol>\n<li>Go to Plugins &gt; Add New.<\/li>\n<li>Search for \"MarkuClean Markup Cleaner\".<\/li>\n<li>Install and activate the plugin.<\/li>\n<\/ol>\n\n<p>Manual installation:<\/p>\n\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin in WordPress admin.<\/li>\n<li>Open Settings &gt; AI Content Cleaner and configure the enabled post types and cleanup modes.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"why%20does%20the%20plugin%20not%20work%20with%20elementor%20or%20other%20builders%3F\"><h3>Why does the plugin not work with Elementor or other builders?<\/h3><\/dt>\n<dd><p>This is intentional. Builders store structured markup, shortcodes, JSON-like payloads, and metadata that the plugin does not modify.<\/p><\/dd>\n<dt id=\"what%20characters%20does%20the%20plugin%20remove%20or%20normalize%3F\"><h3>What characters does the plugin remove or normalize?<\/h3><\/dt>\n<dd><p>It can normalize configured character replacements such as mis-encoded quotes, dashes, ellipses, non-breaking spaces, zero-width characters, and similar copy artifacts. It also removes numeric data-start\/data-end markers and selected AI paste remnants where supported.<\/p><\/dd>\n<dt id=\"does%20it%20change%20existing%20content%20permanently%3F\"><h3>Does it change existing content permanently?<\/h3><\/dt>\n<dd><p>Only when save cleanup is enabled and the current content passes the safety checks. Frontend cleanup and tester previews do not change stored content.<\/p><\/dd>\n<dt id=\"can%20i%20limit%20it%20to%20specific%20post%20types%3F\"><h3>Can I limit it to specific post types?<\/h3><\/dt>\n<dd><p>Yes. Enabled post types are configured in the plugin settings and are enforced across supported frontend, editor, and save-time flows.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20display%20cleanup%20and%20save%20cleanup%3F\"><h3>What is the difference between display cleanup and save cleanup?<\/h3><\/dt>\n<dd><p>Display cleanup changes frontend output only and does not write to the database. Save cleanup modifies stored content when it is enabled and the current content passes the safety checks.<\/p><\/dd>\n<dt id=\"is%20it%20safe%20to%20use%20on%20live%20websites%3F\"><h3>Is it safe to use on live websites?<\/h3><\/dt>\n<dd><p>It is designed to skip unsupported contexts and builder-managed content. Use the tester first and review save cleanup settings before applying cleanup to existing content.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix: prevent fatal errors with legacy WPBakery \/ Visual Composer on PHP 8.3<\/li>\n<li>Fix: harden all WordPress hook callbacks against unexpected input types<\/li>\n<li>Fix: ensure wp_insert_post_data callbacks are safe under legacy conditions<\/li>\n<li>Improvement: extend legacy WPBakery \/ Visual Composer detection<\/li>\n<li>Improvement: increase overall runtime compatibility with older plugins and themes<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: Save cleanup is now truly opt-in, no stored content is modified when disabled<\/li>\n<li>Fix: Removed hardcoded \"ChatGPT\" text removal from sanitizer<\/li>\n<li>Improvement: DOM cleanup now triggers only on structural AI\/UI markers, not keywords<\/li>\n<li>Fix: Prevent unintended content mutation in supported editors (Gutenberg, Classic)<\/li>\n<li>Fix: Sidebar preview default value is now consistent across settings, UI, and runtime<\/li>\n<li>Fix: Regex\/replacement fields now preserve valid patterns (&lt;, &gt;, etc.)<\/li>\n<li>Fix: PHP version requirement comment aligned with actual minimum version<\/li>\n<li>Improvement: Updated admin UI examples to avoid misleading cleanup rules<\/li>\n<li>Improvement: Increased overall sanitizer safety and reduced false-positive cleaning<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"MarkuClean Markup Cleaner cleans and normalizes post content in supported WordPress editing contexts.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/287157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=287157"}],"author":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ivijanstefan"}],"wp:attachment":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=287157"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=287157"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=287157"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=287157"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=287157"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=287157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}