{"id":375997,"date":"2026-09-30T12:57:49","date_gmt":"2026-09-30T12:57:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/naroum-update-merge\/"},"modified":"2026-09-30T12:57:36","modified_gmt":"2026-09-30T12:57:36","slug":"naroum-update-merge","status":"publish","type":"plugin","link":"https:\/\/lv.wordpress.org\/plugins\/naroum-update-merge\/","author":23574222,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.2","requires":"5.5","requires_php":"7.4","requires_plugins":null,"header_name":"Naroum Update Merge","header_author":"Naroum Inc.","header_description":"Merge your customized plugin with its new release: keep your code changes, apply the update, choose block by block where they conflict, and install with an automatic backup.","assets_banners_color":"","last_updated":"2026-09-30 12:57:36","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/naroum.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":35,"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":"maximebakernsn","date":"2026-09-30 12:57:36","revision":3721275}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2759,2275,9151,3866,2552],"plugin_category":[43],"plugin_contributors":[283696],"plugin_business_model":[],"class_list":["post-375997","plugin","type-plugin","status-publish","hentry","plugin_tags-customization","plugin_tags-developer","plugin_tags-diff","plugin_tags-merge","plugin_tags-update","plugin_category-customization","plugin_contributors-maximebakernsn","plugin_committers-maximebakernsn"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/naroum-update-merge.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Editing a third-party plugin is sometimes the only way to get what a client needs. The problem comes with the next update: installing it overwrites your changes, and skipping it leaves security fixes behind.<\/p>\n\n<p>Naroum Update Merge solves this with a three-way merge, the same approach version control tools use. It compares:<\/p>\n\n<ul>\n<li>the <strong>original version<\/strong> your changes were made on,<\/li>\n<li><strong>your customized version<\/strong>, currently installed,<\/li>\n<li>the <strong>new version<\/strong> of the plugin.<\/li>\n<\/ul>\n\n<p>Because it knows the original, it can tell what you changed from what the update changed:<\/p>\n\n<ul>\n<li>Files and lines changed only by you are kept automatically.<\/li>\n<li>Files and lines changed only by the update are applied automatically.<\/li>\n<li>Changes on both sides in different places are merged line by line.<\/li>\n<li>Only real conflicts, where both sides changed the same lines, are shown to you.<\/li>\n<\/ul>\n\n<p>For each conflict you choose which code to keep: my version, the new version, both (in either order), or the original version. The tool only combines code that already exists in these versions; it does not let you type code. To adjust the result by hand, download the merged ZIP, edit it, and install it with Plugins &gt; Add New &gt; Upload Plugin.<\/p>\n\n<h4>Safe installation<\/h4>\n\n<ul>\n<li>ZIP backup of the installed plugin before anything is replaced, downloadable from the tool.<\/li>\n<li>PHP syntax check of every file that comes from your version or from a merge. Installation is blocked on error.<\/li>\n<li>Installation is blocked if the plugin changed on the server since the analysis.<\/li>\n<li>The plugin folder is swapped with two renames on the same disk, with automatic rollback if the second one fails.<\/li>\n<li>The new release is saved as the reference for your next update, so you only need to provide the original version once.<\/li>\n<li>Prefer to install manually? Download the merged plugin as a ZIP instead.<\/li>\n<\/ul>\n\n<h4>Sources<\/h4>\n\n<ul>\n<li>Original version: downloaded from WordPress.org (matching the installed version number), uploaded as a ZIP, or the reference saved by the previous merge.<\/li>\n<li>New version: latest release from WordPress.org, or uploaded as a ZIP (premium plugins, specific versions).<\/li>\n<li>No original version available? A two-way comparison lets you choose every difference, with a bulk action for the files you did not touch.<\/li>\n<\/ul>\n\n<h4>Who is it for?<\/h4>\n\n<p>Agencies and developers who maintain client sites with customized plugins and want a reviewable, reversible update process instead of redoing their changes by hand.<\/p>\n\n<p>The tool is available under Plugins &gt; Update Merge, to users who can install and update plugins. It is unavailable when <code>DISALLOW_FILE_MODS<\/code> is set. On multisite, it is in the network admin.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to WordPress.org only when you choose a WordPress.org source in the analysis form. Nothing is sent automatically or in the background.<\/p>\n\n<ul>\n<li><code>api.wordpress.org<\/code> (Plugins API) is queried with the plugin slug to find the download link of the latest release.<\/li>\n<li><code>downloads.wordpress.org<\/code> is used to download the latest release, or the original release matching the installed version number.<\/li>\n<\/ul>\n\n<p>No personal data is sent. Only the plugin slug and version number are part of the requests. WordPress.org <a href=\"https:\/\/wordpress.org\/about\/tos\/\">Terms of Service<\/a> and <a href=\"https:\/\/wordpress.org\/about\/privacy\/\">Privacy Policy<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin through the Plugins screen, or upload the <code>naroum-update-merge<\/code> folder to <code>\/wp-content\/plugins\/<\/code>. On multisite, network activate it.<\/li>\n<li>Go to Plugins &gt; Update Merge.<\/li>\n<li>Select the customized plugin, the source of the original version and the source of the new version, then click Analyze.<\/li>\n<li>Review the files to resolve, choose your blocks, then download the merged ZIP or install it on the site.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20are%20the%20working%20files%20stored%3F\"><h3>Where are the working files stored?<\/h3><\/dt>\n<dd><p>In <code>wp-content\/uploads\/naroum-update-merge\/<\/code>: ongoing analyses (deleted after 3 days), backups and saved references. The folder is protected with an <code>.htaccess<\/code> file and random folder names. On Nginx, add a rule denying access to this path. Everything is removed when you delete the plugin.<\/p><\/dd>\n<dt id=\"what%20if%20my%20host%20requires%20ftp%20credentials%20to%20install%20plugins%3F\"><h3>What if my host requires FTP credentials to install plugins?<\/h3><\/dt>\n<dd><p>Direct installation is disabled in that case. Download the merged ZIP and install it from Plugins &gt; Add New &gt; Upload Plugin.<\/p><\/dd>\n<dt id=\"how%20do%20i%20restore%20a%20backup%3F\"><h3>How do I restore a backup?<\/h3><\/dt>\n<dd><p>Download it from the Backups section of the tool, then upload it from Plugins &gt; Add New &gt; Upload Plugin and choose to replace the current version.<\/p><\/dd>\n<dt id=\"does%20it%20handle%20single-file%20plugins%3F\"><h3>Does it handle single-file plugins?<\/h3><\/dt>\n<dd><p>No. Only plugins installed in their own folder are supported.<\/p><\/dd>\n<dt id=\"my%20changes%20were%20overwritten%20by%20an%20automatic%20update.\"><h3>My changes were overwritten by an automatic update.<\/h3><\/dt>\n<dd><p>Disable automatic updates for customized plugins on the Plugins screen. After each installation, the tool reminds you to check this setting.<\/p><\/dd>\n<dt id=\"can%20i%20limit%20the%20archive%20size%3F\"><h3>Can I limit the archive size?<\/h3><\/dt>\n<dd><p>Yes, with the <code>naroum_um_max_unzipped_bytes<\/code> filter (500 MB by default).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Update a plugin you customized without losing your changes. Keep your code, apply the update, and choose block by block where they conflict.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/375997","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=375997"}],"author":[{"embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/maximebakernsn"}],"wp:attachment":[{"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=375997"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=375997"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=375997"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=375997"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=375997"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=375997"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}