如何在主题的functions.php Wordpress中覆盖插件功能

时间:2016-04-05 13:46:37

标签: wordpress wordpress-plugin wordpress-theming

如何覆盖主题文件夹的functions.php?

中的插件功能

修改
以下是我的代码:

if(!function_exists('userphoto_filter_get_avatar')){
    function userphoto_filter_get_avatar($avatar, $id_or_email, $size, $default){
        global $userphoto_using_avatar_fallback, $wpdb, $userphoto_prevent_override_avatar;
        if($userphoto_using_avatar_fallback)
            return $avatar;

        if(is_object($id_or_email)){
            if($id_or_email->ID)
                $id_or_email = $id_or_email->ID;
            //Comment
            else if($id_or_email->user_id)
                $id_or_email = $id_or_email->user_id;
            else if($id_or_email->comment_author_email)
                $id_or_email = $id_or_email->comment_author_email;
        }

        if(is_numeric($id_or_email))
            $userid = (int)$id_or_email;
        else if(is_string($id_or_email))
            $userid = (int)$wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_email = '" . mysql_escape_string($id_or_email) . "'");

        if(!$userid)
            return $avatar;

        //Figure out which one is closest to the size that we have for the full or the thumbnail
        $full_dimension = get_option('userphoto_maximum_dimension');
        $small_dimension = get_option('userphoto_thumb_dimension');
        $userphoto_prevent_override_avatar = true;
        $img = userphoto__get_userphoto($userid, (abs($full_dimension - $size) < abs($small_dimension - $size)) ? USERPHOTO_FULL_SIZE : USERPHOTO_THUMBNAIL_SIZE, '', '', array(), '');
        $userphoto_prevent_override_avatar = false;
        if($img)
            return $img;

        return $avatar;
    }
}

当我激活插件时,它给了我致命的错误:

  

无法重新声明userphoto_filter_get_avatar()

请解释我的错误。

1 个答案:

答案 0 :(得分:7)

将自定义覆盖代码添加到Must Use Plugin

插件中定义的

Pluggable functions可以使用其他插件或必须使用的插件覆盖 。将代码添加到另一个插件是不可靠的。所以,最好使用mu-plugin。

请注意,可以通过在插件或主题中使用相同名称的函数来覆盖WordPress核心中定义的可插入函数。

添加到主题的functions.php文件中的代码将在稍后执行,即在执行插件代码之后执行。因此,在主题文件中添加over write函数将触发cannot redeclare错误。

原因:

各种WordPress操作的执行顺序在Plugin_API/Action_Reference中指定。正如我们从这里看到的,简化的执行顺序是

  1. muplugins_loaded
  2. plugins_loaded
  3. after_setup_theme
  4. 因此,要覆盖第二个钩子(即插件)中定义的功能,我们需要在它之前执行的钩子中重新定义它(即在Must Use插件中)。