如何覆盖主题文件夹的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()
。
请解释我的错误。
答案 0 :(得分:7)
将自定义覆盖代码添加到Must Use Plugin。
插件中定义的Pluggable functions可以使用其他插件或必须使用的插件覆盖 。将代码添加到另一个插件是不可靠的。所以,最好使用mu-plugin。
请注意,可以通过在插件或主题中使用相同名称的函数来覆盖WordPress核心中定义的可插入函数。
添加到主题的functions.php文件中的代码将在稍后执行,即在执行插件代码之后执行。因此,在主题文件中添加over write函数将触发cannot redeclare
错误。
原因:
各种WordPress操作的执行顺序在Plugin_API/Action_Reference中指定。正如我们从这里看到的,简化的执行顺序是
因此,要覆盖第二个钩子(即插件)中定义的功能,我们需要在它之前执行的钩子中重新定义它(即在Must Use插件中)。