How do I prevent Plugin updates from clobbering user edits?

How can I prevent my plugin updates from clobbering the user edits and file additions in a particular subdirectory of my plugin?

I wrote a syntax highlighting plugin that makes use of GeSHi. A sub folder of the plugin is GeSHi itself. Many users will want to customize / edit the language files within GeSHi.

Specifically here is the directory structure:

  • wp-contente/plugins/my-plugin/
    • several subdirectories etc
  • wp-content/plugins/my-plugin/geshi/geshi/
    • users are going to add files to this directory
    • they will also edit files in this directory
    • when they pick up their new updates I don’t want to erase their edits

What’s the best way of solving this?

Thanks!


Here’s what I was thinking, but I don’t know how to implement:

  1. On the update plugin action hook (?) make a temporary copy of the files I want to preserve.
  2. Get the new version unzip and install like usual
  3. Copy the preserved files from the temp copy to the new version
  4. Remove the temp copy

Ideally this would all be done with files, but worst case scenario I could save data to the DB.

Problem is I don’t see hooks for plugin updates. I looked here and here.

3 Answers
3

Don’t allow your users to add files or edit your files.

Instead, use things like do_action and apply_filters like the WordPress core does.

I’m not familiar with GeSHi, but I would suggest you figure out where in the class it loads the file required for the language. Modify the file path so it looks something like this:

$file_path = apply_filters( 'yourplugin_name_geshi_path', $file_path, $lanuage );

Then users could hook into it and modify the file path accordingly…

<?php
add_filter( 'yourplugin_name_geshi_path', 'wpse27248_path_modify', 10, 2 );
function wpse27248_path_modify( $path, $language )
{
   if( 'some_language' = $language )
   {
      $path="/some/new/path";
   }
   return $path;
}

Your best bet is probably to create a Subclass of GeSHi, modify the methods you need to modify (as suggested), and use that class for your plugin. If GeSHi updates, you can drop in the new version without loosing your changes.

No having to worry about overriding user files or anything else. Users, if they need a new language in the library, can just create a very simple plugin of their own.

Leave a Comment