我希望修改Wordpress插件中的一个功能,我在多站点安装中切换到主站点来加载图像。该插件定期维护,因此我不想修改代码,以便我能够轻松更新它。
无论如何都要“挂钩”到函数中以便我可以这样修改它?我已经在下面展示了我想要实现的目标,我必须手动添加switch_to_blog(1)
和restore_current_blog()
。
function get_value($post_id, $field)
{
$value = parent::get_value($post_id, $field);
switch_to_blog(1);
$attachments = get_posts(array(
'post_type' => 'attachment',
'post_status' => null,
'post__in' => $value,
));
$ordered_attachments = array();
foreach( $attachments as $attachment)
{
$ordered_attachments[ $attachment->ID ] = array(
'id' => $attachment->ID,
'alt' => get_post_meta($attachment->ID,
'_wp_attachment_image_alt', true),
'title' => $attachment->post_title,
);
}
restore_current_blog();
return $ordered_attachments;
}
答案 0 :(得分:2)
不,如果开发人员的代码为“do_action”行,则只能“挂钩”到函数中。如果不是这种情况,您可以创建该函数的副本并调用您的副本而不是原始副本,但如果在插件内调用该函数,则无法执行任何操作,只修改插件(如您所说,这不是一个好主意)
答案 1 :(得分:2)
要求原作者分割功能:
function get_ordered_attachments_by_field($post_id, $field)
{
$value = parent::get_value($post_id, $field);
return get_ordered_attachments($value);
}
function get_ordered_attachments($value)
{
$attachments = get_posts(array(
'post_type' => 'attachment',
'post_status' => null,
'post__in' => $value,
));
$ordered_attachments = array();
foreach ($attachments as $attachment)
{
$ordered_attachments[ $attachment->ID ] = array(
'id' => $attachment->ID,
'alt' => get_post_meta($attachment->ID,
'_wp_attachment_image_alt', true),
'title' => $attachment->post_title,
);
}
return $ordered_attachments;
}
然后,您可以更轻松地与所需的功能进行交互,例如
$value = $object->get_value($post_id, $field)
switch_to_blog(1);
$attachments = $object->get_ordered_attachments($value);
restore_current_blog();
工作完成了。该项目的好处是它们减少了(至少一点点)附件函数中的代码行,并使函数的名称更加具体。不知道那个对象是什么,如果它是一个插件,无论如何看起来像一个存储函数的地方,所以创建越来越多的函数,但是更小的函数。
答案 2 :(得分:1)
您可以通过将替换函数放在wp-contents/mu-plugins
您应该检查以确保原始函数位于if()
块内,以检查它是否已存在。如果不是,那么这种方法将不起作用。