How to: Overwrite WordPress core functions

I have read many "tutorials" which told users to modify WordPress core files. This is a really, really, bad idea. Why? Simply because you'll have to modify that file again when you'll upgrade your blog. Here's how to overwrite WordPress core function without modifying any core file.


Why overwriting instead of replacing?

At first, modifying a core file seems a lot easier than overwriting it. But what will you do when you’ll have to upgrade your blog? New WordPress versions are released something like every two months, so it might be a long and boring work to reimplement each core file you previously modified.

Happilly, there’s a solution to that problem. It is WordPress specific functions calls filters. For exemple, when you install a WordPress plugin which modify some WordPress core functionnality, you can be sure that the plugin uses a filter.

Using filters

As I said, a filter can be used within a plugin. But that’s not necessary: You can also use it on the functions.php file from your theme. If your theme doesn’t have a functions.php file, you should create it.

The most common WordPress filter function is called add_filter():

add_filter('hook_name', 'your_filter', [priority], [accepted_args]);

Let’s study the required and optionnal parameters in detail:

  • hook_name: (required) the name of the hook provided by WordPress. It defines when your filter will apply.
  • your_filter: (required) The custom function to call instead of hook_name.
  • priority: (optionnal) used to specify the order in which the functions associated with a particular filter are executed.
  • accepted_args: (optionnal) The number of accepted arguments.

Exemple use of the add_filter() function

Let’s see how to use the add_filter() function with a practical exemple. The following code overwrites the bloginfo() function.

add_filter('bloginfo', 'mybloginfo', 1, 2);
add_filter('bloginfo_url', 'mybloginfo', 1, 2);

function mybloginfo($result='', $show='') {
        switch ($show) {
        case 'wpurl':
                $result = SITE_URL;
                break;
        case 'template_directory':
                $result = TEMPL_DIR;
                break;
        default: 
        }
        return $result;
}

Removing filters

While it is possible to add new filters to overwrite WordPress core functions, it is also possible to remove existing filters. For exemple, many people who publish code on their blog are tired about the curly code, because it breaks the code. A WordPress function called wptexturize() replaces normal quotes with curly quotes. As this is a filter, it is possible to simply remove it and get rid of theses curly quotes:

<?php remove_filter('the_content', 'wptexturize'); ?>

Nothing hard, isn’t it? You now know how to overwrite WordPress core functionnality without editing core files, as well as removing unwanted filters.