How to make sure changes to a WordPress plugin won’t be lost on plugin update?

I’m pretty sure I’ve read somewhere that you can actually move the main plugin *.php file to somewhere else (I assume under your theme directory) to have it safe in case you made changes to it and your plugin updates. I tried Google but I can’t find anything. Google page with good results will suffice.

I’ve just experienced a situation where my 2 plugins which had its layout changed and accommodated my needs and I want to make sure it doesn’t happen again. Apart from having the main file in another location, is there a way to move along any CSS and JS files as well?

Read More

In Concrete5 CMS there is a nice way of doing this, by creating a new folder inside a block of an addon (may be regarded as a WP plugin), inside of which you can create copies of main file, any CSS and JS files and then you can simply edit them and choose that template for a page location you are using that block in.

I assume there is no such thing in WordPress but how close can I get?

UPDATE: I found where I applied that advice on creating a new instance of the file then moving it to the theme directory.
The plugin in question was HL-Twitter. These are the plugin files:

admin.php
archive.php
functions.php
hl_twitter.php
hl_twitter_archive.php
hl_twitter_widget.php
import.php
widget.php

Now, this is the top contents (commented out) of the hl_twitter_widget.php:

Widget Theme for HL Twitter
To change this theme, copy hl_twitter_widget.php
to your current theme folder, do not edit this
file directly.

Available Properties:
$before_widget
$after_widget
$before_title
$after_title
$widget_title
$show_avatars
$show_powered_by
$num_tweets: how many tweets to show
$tweets: array of $tweet
$tweet: object representing a tweet
$tweet->twitter_tweet_id
$tweet->tweet
$tweet->lat
$tweet->lon
$tweet->created
$tweet->reply_tweet_id
$tweet->reply_screen_name
$tweet->source
$tweet->screen_name
$tweet->name
$tweet->avatar
$user: represents the Twitter user (ONLY SET IF SHOWING A SINGLE USERS TWEETS!)
$user->twitter_user_id
$user->screen_name
$user->name
$user->num_friends
$user->num_followers
$user->num_tweets
$user->registered
$user->url
$user->description
$user->location
$user->avatar       

So I was wrong about copying the main file (in this case hl_twitter.php), but still – this enabled me to edit the file outside the plugin directory and the system somehow checks for its existence and picks it up if exists.
If this behavior something that is natively supported by WordPress or it has been integrated in the plugin itself?

Related posts

Leave a Reply

3 comments

  1. With themes, WordPress has a concept of “child themes” which allows exactly that: to keep changes separate from main theme, in case it changes.

    I haven’t yet found a way to do this with plugins.

    I’m using a few tactics myself:

    • I bump plugin version to a very high number like 99.9. This way WordPress won’t ever update the plugin.
    • Store my plugins in version control (i use git, but it doesnt matter), this allows you to update the plugin, run the ‘diff’ tool and see what changes happend. If you don’t like you just revert like it would be a bad code you’ve written. But this approach requires a bit of skill.
  2. Are you talking about running parts of a modified 3rd party plugin, and an updated version, at the same time?

    That’s not going to be possible. There is no magical method of “preserve my changes and transfer them into the new version automatically”. The way to go here is doing a diff between the edited version and the update, and integrating the changes in the actual source files.

    The bottom line is, if you manually edit a third party plugin, you’re in for manual review (and possibly rework) once an update takes place. That’s why it’s usually not a good idea to extensively modify third party plugins.

  3. Well in fact, yes! There is some kind of way.
    You have to remove the to be modificated plugin’s original actions/filters and then add your altereted actions/filters.

    If the desired plugin is even coded in OOP you can just inherit the whole class and rewrite the wanted functions (oh sorry: “methods”. we’re talking about OOP 😉 ). Instantiate your inherited class and rest as above.

    Maybe there are better ways! I already search for a method so that the original class won’t even get loaded but our altered one instead but I’m no John Carmack.