当试图通过主题覆盖插件的函数时,我的过滤器执行两次,我希望它只运行一次

时间:2018-09-02 作者:Debuggin Code

Here\'s plugin function:

function dokan_get_admin_commission_by($order, $seller_id)
{
    $saved_admin_fee = get_post_meta(dokan_get_prop($order, \'id\') , \'_dokan_admin_fee\', true);
    if ($saved_admin_fee != \'\')
    {
        return apply_filters(\'dokan_order_admin_commission\', $saved_admin_fee, $order);
    }
    $admin_commission = 10;
    return apply_filters(\'dokan_order_admin_commission\', $admin_commission, $order);
}

I have overwritten this function from theme\'s functions.php file:

function dokan_get_admin_commission_by_overwrite( $admin_commission, $order) {
    return $admin_commission+1;
}
add_filter( \'dokan_order_admin_commission\', \'dokan_get_admin_commission_by_overwrite\', 10, 2 );
主题过滤器工作正常,但运行了两次。所以它将值增加两倍。它运行两次的原因是因为在插件中,函数dokan_get_admin_commission_by 被调用两次。我不知道如何通过theme的functions.php 文件

1 个回复
SO网友:Fayaz

双倍增量的可能原因:

插件函数dokan_get_admin_commission_by() 执行apply_filters(\'dokan_order_admin_commission\' ... ) 两次,但两次都使用return, 所以过滤器是not 执行两次。

获得双倍增量的可能原因是,在以下代码中:

if ($saved_admin_fee != \'\')
{
    return apply_filters(\'dokan_order_admin_commission\', $saved_admin_fee, $order);
}
插件正在为您提供主题过滤器$saved_admin_fee$admin_commission, 另一方面,在以下代码中:

$admin_commission = 10;
return apply_filters(\'dokan_order_admin_commission\', $admin_commission, $order);
插件是always giving 10 as $admin_commission value 主题过滤器。

因此,您可能需要在主题函数中处理相同的条件。

此外,如果过滤器执行了两次,那么它必须来自其他地方。在这种情况下,一旦执行了主题函数,就必须删除过滤器。

示例代码修复functions.php:

因此,您的最终主题代码如下:

function dokan_get_admin_commission_by_overwrite( $admin_commission, $order) {
    remove_filter( \'dokan_order_admin_commission\', \'dokan_get_admin_commission_by_overwrite\', 10, 2 );
    if ( $admin_commission === 10 ) {
        return $admin_commission + 1;
    }

    return $admin_commission;
}
add_filter( \'dokan_order_admin_commission\', \'dokan_get_admin_commission_by_overwrite\', 10, 2 );
现在,此函数应该只运行一次,并在检查了正确的条件后递增。

Note: 如果您仍然感到困惑,或者需要进一步的帮助,那么我建议您联系该插件的支持团队。

结束