PHP – override existing function

Can I redeclare a existing function, with the same name, but different code? Or somehow “disable” the old function?

I want to redefince a core WordPress function, but since plugins and theme call this function a lot, I need to keep the same function name.

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

You could use the WordPress hooks (called filters and actions) and then use the add_filter() function to override the function you are using.

i.e.

function function_name() {
 //code goes here
}

$hook = 'get_options'; // the function name you're filtering
add_filter( $hook, 'function_name' );

The Codex will help a lot with this.

http://codex.wordpress.org/Plugin_API/Filter_Reference

Solution 2

Only if you use something like APD that extends the zend engine to allow for that:

Intro

Override Method Docs

Note: Runkit seems like a better option than APD since it’s more specific to this purpose and would allow you to keep the original method intact at a different address.

Solution 3

Just comment the old function out and write your new one 😉

In PHP it is not possible to redefine or overload (i.e. define a function with the same name but different parameters) a function natively. There though are extensions like runkit which allow to redefine functions (runkit_function_redefine), but you probably don’t want to use these (such extensions are rarely installed and mostly unreliable.)

Solution 4

You can wrap the block defining the original function in a conditional checking if another of the same name is not already defined (I’m assuming you mean WordPress functions and not core PHP ones)

    <?php 
if(!function_exists('function_name')){ 
    //old definition here
    } ?>

You could then redefine it above while still preserving the original should you need to roll back to it.

Depending on how complex the changes are and how many times you may do this, you may also want to look into Namespaces if you are on PHP 5.

Solution 5

My attempted solution was to do this:

function suffusion_get_image($options = array()) {
    include_once ABSPATH.'wp-content/themes/suffusion-child/functions/media.php';
    return childtheme_overide_suffusion_get_image($options = array());
    ....
}

Obviously there is an overhead at upgrade as you would need to add lines back into the scripts again and I have used this method successfully to date but now trying to do it with get_terms in the wp-includes and hitting a redeclaration issue which I am trying to resolve or workaround at the moment.

My reason to edit core is that the existing core does not provide in a convenient way for a multisite requirement.

Someone has just suggested on another forum however using override_function but the manual is worded such that it appears to be of use only to built-in functions – I took it that means PHP built in functions

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply