我正在使用一个插件,其中我操作了插件类中的一个函数。然而,我想把这个函数放在我的主题中,因为如果有人更新插件,我对该函数的编辑将被替换。但是,如果我取出已编辑的函数并放入主题,我会得到一个错误:“致命错误:无法声明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;
}
那么,有没有办法重写该函数,或者从我的主题中以某种方式禁用该类?因此,它与所有插件文件保持分离,例如,它不会被更新所取代。
最合适的回答,由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;
}