是否在我的主题中重新声明插件函数/类?

时间:2019-05-29 作者:Paparappa

我正在使用一个插件,其中我操作了插件类中的一个函数。然而,我想把这个函数放在我的主题中,因为如果有人更新插件,我对该函数的编辑将被替换。但是,如果我取出已编辑的函数并放入主题,我会得到一个错误:“致命错误:无法声明class Groups\\u Post\\u Access,因为该名称已在中使用…”

class Groups\\u Post\\u Access中的函数最初如下所示:

public static function wp_get_nav_menu_items( $items = null, $menu = null, $args = null ) {
    $result = array();
    if ( apply_filters( \'groups_post_access_wp_get_nav_menu_items_apply\', true, $items, $menu, $args ) ) {
        $user_id = get_current_user_id();
        foreach ( $items as $item ) {
            // @todo might want to check $item->object and $item->type first,
            // for example these are \'page\' and \'post_type\' for a page
            if ( self::user_can_read_post( $item->object_id, $user_id ) ) {
                $result[] = $item;
            }
        }
    } else {
        $result = $items;
    }
    return $result;
}
我的版本是这样的:

public static function wp_get_nav_menu_items( $items = null, $menu = null, $args = null ) {
    $result = array();
    if ( apply_filters( \'groups_post_access_wp_get_nav_menu_items_apply\', true, $items, $menu, $args ) ) {
        $user_id = get_current_user_id();
        foreach ( $items as $item ) {
            // @todo might want to check $item->object and $item->type first,
            // for example these are \'page\' and \'post_type\' for a page
            if ( self::user_can_read_post( $item->object_id, $user_id ) ) {
                $group_ids = self::get_read_group_ids( $item->object_id );
                if ( count( $group_ids ) > 0 ) {
                    $item->title .= \'<i class="unlocked"></i>\';
                }
                $result[] = $item;
            } else {
                $item->title .= \'<i class="locked"></i>\';
                $result[] = $item;
            }
        }
    } else {
        $result = $items;
    }
    return $result;
}
那么,有没有办法重写该函数,或者从我的主题中以某种方式禁用该类?因此,它与所有插件文件保持分离,例如,它不会被更新所取代。

2 个回复
最合适的回答,由SO网友:Paparappa 整理而成

所以我的解决方案是使用remove\\u filter和add\\u filter

在我的主题功能中。php文件我成功重写了自定义get\\u nav函数,如下所示:

remove_filter( \'wp_get_nav_menu_items\', array( Groups_Post_Access::class, \'wp_get_nav_menu_items\' ), 1, 3 );

add_filter( \'wp_get_nav_menu_items\', \'my_custom_get_nav_menu_items\', 10, 3 );

function my_custom_get_nav_menu_items( $items = null, $menu = null, $args = null ) {
    $result = array();
        $user_id = get_current_user_id();
        foreach ( $items as $item ) {
                if ( Groups_Post_Access::user_can_read_post( $item->object_id, $user_id ) ) {
                        $group_ids = Groups_Post_Access::get_read_group_ids( $item->object_id );
                        if ( count( $group_ids ) > 0 ) {
                                $item->title .= \'<i class="unlocked"></i>\';
                        }
                        $result[] = $item;
                } else {
                        $item->title .= \'<i class="locked"></i>\';
                        $result[] = $item;
                }
        }

    return $result;
}

SO网友:majick

可以扩展现有类以重写特定的类方法(函数):

class Mod_Groups_Post_Access extends Groups_Post_Access {
    public static function wp_get_nav_menu_items( $items = null, $menu = null, $args = null ) {
    // ... your code ...
   }
}
那么你需要打电话$instance = new Mod_Groups_Post_Access(); 而不是$instance = new Groups_Post_Access(); 因此,您可以通过以下方式使用修改后的函数/方法:

$instance->wp_get_nav_menu_items();

您可以在此处进一步了解对象继承:https://www.php.net/manual/en/language.oop5.inheritance.php