修改函数而不直接编辑它

时间:2012-12-18 15:14:55

标签: php

我希望修改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;
}

3 个答案:

答案 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()块内,以检查它是否已存在。如果不是,那么这种方法将不起作用。