How to: Overwrite WordPress core functions

by Jean-Baptiste Jung. 46 Comments -

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.

Comments (46) - Leave yours

  1. Catrin W said:

    Well, it is not hard when you, master of Wp, are explaining it :) . Thanks for sharing. Indeed very useful as i didn’t know it was possible to overwrite core wp functions.

  2. Kel said:

    Excellent post. I’m surprised not to see more info like this – everyone seems to focus on the theming and theme related functions rather than the back-end/core issues. Thank you!

  3. developer said:

    Well, I generally tend to get into the code details,but WordPress is new to me. These little tutorials help immensely. I am currently redesigning and rebuilding my entire website in WordPress so these posts are extremely useful to me.

    I use your website as my browser home page so I don’t miss anything.

  4. Frank Spiele said:

    I´ve actually just started blogging and I need to read up on word press and templates etc. I´ve come across a few blogs which give a lot of information, which is always good for beginners like me. I´d ike to think I´ll get the hang of it all soon – fingers crossed!

    Frank

  5. Web Talk said:

    Well, that’s a nice article if i understood it! LOL!! I am more than sure that the piece of code you provided is going to be quite useful to…people who know their way through WordPress. As far as I am concerned i had to read your article twice just to find out that i didnt know what it was talking about. I just know how to upgrade my blog and my plugins plus some other nice tricks to protect it and how to work with ftp…and that’s it! ta-da! When something goes wrong i have, as a last resource, pay to get the job done..sad but true!

  6. Robert said:

    The term overwrite in this context is not strictly correct since using hooks only “hooks” your code into the wordpress function that is already being executed. It allows you to additionally manipulate the data after wordpress is done with it. If you really want to overwrite a wordpress function, then I’d suggest copying the code for the desired function into your functions.php file, giving it a different name, changing the code to suit and then calling that function everywhere in your template.

  7. Ajith Edassery said:

    I still overwrite core files because adding filters can be more difficult depending on the scenario ;) Well, right now I am trying to write a couple of plusings to learn how to use filters properly. May be after that…

  8. Charly said:

    Hello jrj..
    How about function / filter to hide or replace some word at admin area. For sample, at header i want to replace “Howdy” with “Logged User :” or at footer, I want to replace “Thank you for creating with WordPress” with “Powered by WordPress”
    Thx before and after..

  9. Antwerp Hotels said:

    That’s a really cool idea. I’ve always wanted to mes around and check out some core function changes. But didn’t want to mess things up at the same time. This will help me just to twist things around and see. Thanks a bunch

  10. long.vu said:

    Why I can’t overwrite it, when I called bloginfo(‘siteurl’) it not point to mybloginfo() function or what, so I still get old site url value.

    Help me! Thanks!

  11. Villas in Seminyak said:

    Owh, good. my friends still in re-coding the site with WP engine, maybe this articles will help him to know deeply about WordPress. Thanks for sharing with us

    Regard’s from Bali Island

  12. electrical goods said:

    Awesome. just the solution I was looking for. I’ve been having this problem for few days now. Replacing the functions certainly did not work. I’ll try overwriting them. Cheers

  13. airlines said:

    Really cool article. I’m kind of new to blogging and this certainly is a treat. would love to learn more and more. Appreciate it. Cheers

  14. Phil said:

    Hey thanks for this article!

    I am trying to edit “the_editor” function – but it is not fully replacing the function when I use:

    add_filter(‘the_editor’, ‘custom_the_editor’);

    It replaces SOME of the code – but other parts are not removed. OR say if I make the function completely empty, the original function continues working fully. Am I missing something?

    I have a feeling it has something to do with Roberts comment (#11) – so is there a way to make certain parts of a function NOT work? Or can you only add to functions that already exist.

  15. Sean Callahan said:

    did anyone find out if it is possible to hack the core and get rid of “thank you for creating with wordpress.”…it just takes up screen real estate….everyone who needs it will just do a direct search for wordpress….makes no sense really to me….anyway, if anyone found out how to do it…please let me know. I looked in all the files and can’t find it.

  16. Shoffy said:

    Great post! Not so easy to find this info.

    And this is dumb… but… you spelled “Example” wrong “Exemple” (if ya cared to know)

    Thanks again!

  17. Shoffy said:

    Sorry to spam up your comments…. but I answered my own question.

    Interesting to note that the functions in pluggable.php look to see if the function already exists. With that little tidbit, I just created a plugin with the same name as the function I wanted to replace.

    Poof! It’s magic! :-)

  18. Aeox said:

    Hi, that’s a very helpful article, but i have one serious question. What about functions that are inside a specific class ? How can i reference them by string ?

    For example: I want to overwrite the output of the “Recent posts” Widget.
    The function is named :

    function widget($args, $instance) { …. }

    Ok.. but, this function is inside of this class:

    class WP_Widget_Recent_Posts extends WP_Widget { … }

    There are also other classes with this function name, so the function name itself won’t help me. I need something to tell the add_filter – Function that he has to look in a specific class. I did not found something in the api or google, thats why my last hope is this article :)

    Thx for any help,
    Aeox

  19. Matteo said:

    Hi, is it possible to overwrite all of the functions of the core? I’m trying with gallery_shortcode (media.php) doing so:
    -copied from media.php the original function
    -pasted in functions.php
    -renamed
    - modified deleting some html I don’t need
    - added this code after my new function: add_filter(‘gallery_shortcode’, ‘my_gallery_shortcode’, 0, 1);
    but it doesn’t work

    Where am I wrong?
    Thanks

    Matteo

  20. Brent said:

    you rock :D thanks for this tutorial, we’re sending it to some dev guys helping us out with our site, they weren’t sure how to make a fix without overwriting core files, your description is really straight forward and helpful.

  21. Roland said:

    Hi,

    Is it possible to overwrite ANY core function? like the “media_upload_tabs()” function. I want to add more tabs in the media uploader section.

    Thanks in advance

Leave a Reply

Your email address will not be published. Required fields are marked *

Please respect the following rules: No advertising, no spam, no keyword in name field. Thank you!