기본적으로 Wordpress functions.php에서 플러그인 class 함수를 재정의하고 싶습니다. 플러그인 설정을 위해 편집기에 대한 액세스 권한을 부여하고 싶습니다. 방법이 있습니까? 생성자 함수가 있기 때문입니다. 답변에 매우 감사할 것입니다.
플러그인 코드
class BulkImport
{
function __construct()
{
add_action("admin_menu", array($this, 'menu'));
}
function menu()
{
add_submenu_page('edit.php?post_type=wpdmpro', __( "Bulk Import ‹ Download Manager" , "download-manager" ), __( "Bulk Import" , "download-manager" ), WPDM_MENU_ACCESS_CAP, 'importable-files', array($this, 'UI'));
}
}
WPDM_MENU_ACCESS_CAP
를 edit_pages
로 바꾸고 싶습니다.
감사합니다.
간단한 답변입니다. 관리자 메뉴 편집기 와 같은 관리자 메뉴 편집기 플러그인을 사용해 보셨습니까? ? 나는 그것에 대한 경험이 없어서 그것을 보증 할 수 없지만 잘 검토되고 관리되는 것 같습니다.
편집 : UI
메서드와 admin_menu
hook에 대한 기능 검사를 수행하는 경우 추가 할 WP_Role :: add_cap ()
WPDM_MENU_ACCESS_CAP
를 editor
역할에 추가합니다. 당신은 그 능력이 그들이하지 말아야 할 다른 것들에 대한 액세스를 제공하지 않도록해야합니다. 상수의 이름에 따르면 괜찮을 것 같은 소리이지만 확인하려면 플러그인을 훑어보아야합니다.
긴 대답 : WordPress를 사용하면 일반적으로 작업이 올바르게 수행되면 플러그인 class, class 메서드 또는 함수를 "재정의"할 필요가 거의 없습니다 (때로는 그렇게 할 수 있습니다). WordPress의 대단한 기능 중 하나는 hook 시스템입니다. 특히 액션 hook 입니다.
플러그인이 add_action ()
을 사용하고 세 번째 인수 ($ priority
)는 기본적으로 10
으로 설정됩니다. 우선 순위가 작동하는 방식은 낮은 숫자가 먼저 해당 hook에서 실행되므로 다음을 수행하십시오.
add_action( 'some_hook', 'some_other_function' );
add_action( 'some_hook', 'some_function', 3 );
add_action( 'some_hook', 'func', 999 );
순서가 작성 되었음에도 불구하고 some_hook
이 해당 요청에서 실행되면 some_function
이 먼저 실행되고 (우선 순위 3) some_other_function이 실행됩니다.
(기본 우선 순위 10), 마지막으로 func
가 우선 순위 999로 실행됩니다.
이것이 좋은 점은 func
가 some_function
및 some_other_function
에 설정된 모든 항목을 수정하거나 실행 취소 할 수 있다는 것입니다.
이제 플러그인에 add_action ( "admin_menu", array ($ this, 'menu'));
줄이 있습니다.이 줄은 menu메서드를추가합니다."https://developer.wordpress.org/reference/hooks/admin_menu/"rel="nofollownoreferrer">admin_menu 우선 순위가 10
인 hook .
즉, 자신의 함수를 작성하고 11
또는 <와 같이 더 낮은 (더 높은 번호) 우선 순위로 admin_menu
hook에 연결할 수 있습니다.
code> 99 .
이 함수에서 remove_submenu_page ()
함수를 사용하여 플러그인에서 추가 한 페이지를 제거한 다음 add_menu_page ()를 사용합니다.
함수를 다시 추가하고 매개 변수를 변경하십시오!
예를 들면 :
add_action( 'admin_menu', 'change_BulkImport_submenu', 11 );
function change_BulkImport_submenu(){
remove_submenu_page( 'edit.php?post_type=wpdmpro', 'importable-files' );
add_submenu_page('edit.php?post_type=wpdmpro', __( "Bulk Import ‹ Download Manager" , "download-manager" ), __( "Bulk Import" , "download-manager" ), 'edit_pages', 'importable-files', array('BulkImport', 'UI') );
}
작업중인 플러그인 방법에 따라 약간 복잡해질 수 있습니다. add_submenu_page
의 마지막 인수에서 전역 적으로 인스턴스화 된 class 메서드를 가져 와서이를 정적 메서드로 호출하거나 class의 새 인스턴스를 인스턴스화하고 여기에서 메서드를 사용해야합니다. 나는 거기에 있을지도 모르는 것을 찔 렀지 만 플러그인이 보이지 않으면 말할 수 없습니다. 예를 들어, Elegant Theme의 "Bloom"플러그인을 엉망으로 만들어야하는 플러그인이 있습니다.이를 위해 global $ et_bloom
을 호출 한 다음 remove_action ( 'wp_footer', [$ et_bloom, 'display_flyin']);
갈등이 있습니다.
global $ menu, $ submenu
(또는 $ GLOBALS [ 'submenu']
) 수정에 관한 게시물이 표시되지만 인 경우에만 작동합니다. 권한을 완화하는 것이 아니라 권한을 제한합니다. 이는 add_submenu_page ()
current_user_can ($ capability)
의 반환 값을 확인합니다. 현재 사용자가 가지고 있지 않은 경우 전역 $ _ wp_submenu_nopriv
에 추가되고 함수는 바로 거기에 false
를 반환합니다 (따라서 항목이 추가됨).
일반적으로 저는 가능한 경우 unhook / rehook 방법을 선호합니다.
왜냐하면 무엇을 하고 있는지, 그리고 그 이유에 대한 명확한 흔적을 남기고 양방향 (제한 / 완화)으로 작동하기 때문입니다.
그러나 admin_menu
hook에서 global $ menu
및 global $ submenu
변수에 액세스 할 수 있습니다.
이 변수는 렌더링되기 전에 수정할 수 있습니다.
권한이 이미 결정된 후 제한이 훌륭하고 간단하지만이 hook에 대해보기 흉하게 완화 된 권한을 얻을 수 있습니다. 다음은 간단한 예입니다.
add_action( 'admin_menu', function(){
global $menu, $submenu;
// Is the submenu I want in the page I want?
if( isset($submenu['my-top-level-slug']) ){
// Yes, we have an array of arrays (each submenu item = array)
foreach( $submenu['my-top-level-slug'] as $index => $submenu_array ){
//var_dump( $index );
// Search these arrays for my secondary slug
$search = array_search('my-secondary-slug', $submenu_array );
// This will return the submenu index if we found it, false if not
if( $search != false ){
// We found it! It's in this $index. Modify the [1]st element (permissions)
$submenu['my-top-level-slug'][$index][1] = 'manage_options';
// Stop processing this loop, we found what we came for.
break;
}
}
}
}, 11 );