{"id":190567,"date":"2024-05-12T04:37:37","date_gmt":"2024-05-12T04:37:37","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/simple-editor-control\/"},"modified":"2026-05-11T15:00:22","modified_gmt":"2026-05-11T15:00:22","slug":"simple-editor-control","status":"publish","type":"plugin","link":"https:\/\/br.wordpress.org\/plugins\/simple-editor-control\/","author":22011295,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"4.1.0","stable_tag":"4.1.0","tested":"6.9.4","requires":"5.5","requires_php":"7.4","requires_plugins":null,"header_name":"Simple Editor Control","header_author":"tlloancy","header_description":"Surveillance des modifications des fichiers via l'\u00e9diteur de fichiers WordPress.","assets_banners_color":"5e2f21","last_updated":"2026-05-11 15:00:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":10,"downloads":1655,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"tlloancy","date":"2024-09-25 06:40:09"},"2.0.0":{"tag":"2.0.0","author":"tlloancy","date":"2024-09-25 12:56:36"},"2.0.1":{"tag":"2.0.1","author":"tlloancy","date":"2024-09-25 22:12:53"},"2.0.2":{"tag":"2.0.2","author":"tlloancy","date":"2024-09-27 04:49:48"},"2.1.2":{"tag":"2.1.2","author":"tlloancy","date":"2024-09-28 03:42:41"},"2.3.0":{"tag":"2.3.0","author":"tlloancy","date":"2024-09-29 05:04:29"},"2.4.0":{"tag":"2.4.0","author":"tlloancy","date":"2024-10-12 00:40:04"},"2.4.1":{"tag":"2.4.1","author":"tlloancy","date":"2024-10-13 02:23:37"},"2.5.0":{"tag":"2.5.0","author":"tlloancy","date":"2024-10-14 08:43:38"},"2.6.0":{"tag":"2.6.0","author":"tlloancy","date":"2024-10-19 08:24:18"},"2.7.0":{"tag":"2.7.0","author":"tlloancy","date":"2024-10-19 13:26:42"},"2.7.1":{"tag":"2.7.1","author":"tlloancy","date":"2024-10-19 19:45:00"},"2.7.2":{"tag":"2.7.2","author":"tlloancy","date":"2024-10-21 12:18:48"},"2.7.3":{"tag":"2.7.3","author":"tlloancy","date":"2024-10-25 14:58:14"},"3.0.0":{"tag":"3.0.0","author":"tlloancy","date":"2024-10-26 04:39:51"},"3.0.1":{"tag":"3.0.1","author":"tlloancy","date":"2024-11-06 15:20:43"},"4.0.0":{"tag":"4.0.0","author":"tlloancy","date":"2026-05-11 13:18:19"},"4.0.1":{"tag":"4.0.1","author":"tlloancy","date":"2026-05-11 13:29:30"},"4.1.0":{"tag":"4.1.0","author":"tlloancy","date":"2026-05-11 15:00:22"}},"upgrade_notice":{"4.0.0":"<p>Major security and correctness release. Update immediately. Previous versions had unauthenticated AJAX endpoints and a broken diff engine.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3159420,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3159421,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","2.0.0","2.0.1","2.0.2","2.1.2","2.3.0","2.4.0","2.4.1","2.5.0","2.6.0","2.7.0","2.7.1","2.7.2","2.7.3","3.0.0","3.0.1","4.0.0","4.0.1","4.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3159422,"resolution":"1","location":"assets","locale":"","width":1729,"height":662},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3159422,"resolution":"2","location":"assets","locale":"","width":1693,"height":667}},"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[8533,9151,18643,4540,4539],"plugin_category":[],"plugin_contributors":[232640],"plugin_business_model":[],"class_list":["post-190567","plugin","type-plugin","status-publish","hentry","plugin_tags-audit","plugin_tags-diff","plugin_tags-file-editor","plugin_tags-plugin-editor","plugin_tags-theme-editor","plugin_contributors-tlloancy","plugin_committers-tlloancy"],"banners":{"banner":"https:\/\/ps.w.org\/simple-editor-control\/assets\/banner-772x250.png?rev=3159421","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/simple-editor-control\/assets\/icon-256x256.png?rev=3159420","icon_2x":"https:\/\/ps.w.org\/simple-editor-control\/assets\/icon-256x256.png?rev=3159420","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/simple-editor-control\/assets\/screenshot-1.png?rev=3159422","caption":""},{"src":"https:\/\/ps.w.org\/simple-editor-control\/assets\/screenshot-2.png?rev=3159422","caption":""}],"raw_content":"<!--section=description-->\n<p>Simple Editor Control silently records every file change made through the WordPress built-in plugin editor and theme editor. For each save it stores the diff, the editor who made it, and the timestamp \u2014 giving you a full, browsable history.<\/p>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li>Automatic tracking \u2014 no setup required. Every save through the WP file editor is captured.<\/li>\n<li>Git-style diff viewer with side-by-side and line-by-line modes.<\/li>\n<li>Adjustable context lines (0, 3, 5, 10, 20).<\/li>\n<li>Point-in-time file recovery \u2014 download any file as it existed at any past revision.<\/li>\n<li>Works with all plugins and all active themes.<\/li>\n<li>Accurate LCS-based diff engine (same algorithm as GNU diff \/ git) \u2014 handles insertions, deletions and replacements correctly.<\/li>\n<li>Fully translatable.<\/li>\n<\/ul>\n\n<p><strong>Use cases<\/strong><\/p>\n\n<ul>\n<li>See exactly what changed when something broke.<\/li>\n<li>Verify that no unauthorised changes were made to your plugin or theme files.<\/li>\n<li>Recover a previous version of a file without restoring a full backup.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/simple-editor-control\/<\/code>.<\/li>\n<li>Activate through <strong>Plugins \u2192 Installed Plugins<\/strong>.<\/li>\n<li>Go to <strong>Tools \u2192 Simple Editor Control<\/strong> to see the audit trail.<\/li>\n<li>Start editing plugin or theme files through the WP file editor \u2014 changes are captured automatically.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20with%20the%20gutenberg%20block%20editor%3F\"><h3>Does it work with the Gutenberg block editor?<\/h3><\/dt>\n<dd><p>Simple Editor Control hooks into the WP file editor (plugin-editor.php \/ theme-editor.php), not the post editor. It is unrelated to Gutenberg.<\/p><\/dd>\n<dt id=\"are%20changes%20tracked%20if%20i%20edit%20files%20via%20ftp%20or%20ssh%3F\"><h3>Are changes tracked if I edit files via FTP or SSH?<\/h3><\/dt>\n<dd><p>No. Only changes made through the WordPress admin file editor are tracked.<\/p><\/dd>\n<dt id=\"is%20the%20full%20file%20stored%20for%20every%20revision%3F\"><h3>Is the full file stored for every revision?<\/h3><\/dt>\n<dd><p>No. Only the first save stores the full file content (snapshot). Subsequent saves store only the diff, keeping the database footprint small.<\/p><\/dd>\n<dt id=\"can%20i%20delete%20the%20history%3F\"><h3>Can I delete the history?<\/h3><\/dt>\n<dd><p>Yes. Deactivating the plugin preserves your history. To remove it entirely, delete the plugin \u2014 an uninstall hook will drop the database table.<\/p><\/dd>\n<dt id=\"what%20happens%20on%20very%20large%20files%3F\"><h3>What happens on very large files?<\/h3><\/dt>\n<dd><p>The LCS diff engine works well on files up to a few thousand lines. For very large files (&gt; ~3,000 lines with low similarity), a fast-path algorithm is used that treats the change as a full replacement.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h3>4.1.0 (11-May-2026)<\/h3>\n\n<p>Fixed: Initial Revision Logic: Added a specific case to handle the first-ever revision using the stored snapshot. This allows the diff to display correctly even when no prior history exists in the database.<\/p>\n\n<h3>4.0.1 (11-May-2026)<\/h3>\n\n<ul>\n<li>Blunderman Syndrome: Fixed incorrect table name reference (sec_revisions).<\/li>\n<\/ul>\n\n<h3>4.0.0 \"Reborn\" (11-May-2026)<\/h3>\n\n<ul>\n<li>Architectural Shift: Complete migration from file_modifications to the new sec_revisions table. Old data is deprecated in favor of a robust LCS-based diff system.<\/li>\n<li>Security (Hardened): All AJAX endpoints now strictly require nonce validation + manage_options capability.<\/li>\n<li>Security (Hardened): File download no longer exposes raw content without authentication.<\/li>\n<li>Security (Hardened): Bulletproof path traversal prevention on snapshot reads.<\/li>\n<li>Security (Hardened): Strict $wpdb-&gt;prepare() usage and esc_sql() on all table interpolations.<\/li>\n<li>Fixed: Replaced old diff engine with a high-precision LCS (Longest Common Subsequence) algorithm \u2014 accurate insertions and deletions tracking.<\/li>\n<li>Fixed: File content stored as raw PHP text, not HTML-encoded \u2014 no more decode\/encode round-trip corruption.<\/li>\n<li>Fixed: load_plugin_textdomain() deprecated second parameter removed.<\/li>\n<li>Improved: New two-panel admin UI \u2014 sidebar plugin list, timeline, and professional diff viewer.<\/li>\n<li>Improved: Diff viewer powered by diff2html with real-time syntax highlighting.<\/li>\n<li>Improved: Context line count and view mode (side-by-side\/inline) switchable live without page reload.<\/li>\n<li>Improved: Revision list grouped by file with download-at-revision button per entry.<\/li>\n<li>Improved: Performance optimization with wp_cache_get\/set on revision list queries.<\/li>\n<li>Improved: All enqueued scripts\/styles pass plugin version for cache busting.<\/li>\n<li>Removed: Standalone ajax\/get_plugin_details.php (replaced by proper wp_ajax_ actions).<\/li>\n<li>Removed: REST API route (replaced by wp_ajax_ actions with nonce + capability check).<\/li>\n<li>i18n: All strings translatable; JS strings passed through wp_localize_script().<\/li>\n<\/ul>\n\n<h4>3.0.1<\/h4>\n\n<ul>\n<li>Minor fixes.<\/li>\n<\/ul>","raw_excerpt":"Audit trail and git-style diff viewer for every file change made through the WordPress plugin and theme file editor.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/190567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=190567"}],"author":[{"embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tlloancy"}],"wp:attachment":[{"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=190567"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=190567"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=190567"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=190567"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=190567"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/br.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=190567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}