add_role ()은 한 번만 실행됩니까?


11

add_role ()이 데이터베이스를 수정하고 역할이 이미 존재하면 실패한다는 사실에 놀랐습니다. 여기에 두 가지 의미가 있습니다. 하나는 다른 것보다 더 심각합니다. 1) 개발 중이고 add_role 코드를 업데이트하는 경우 먼저 remove_role () 2) 코드를 올바르게 작성해야합니다. 해당 코드를 실행할 필요가 없습니다. 다시.

따라서 일반적으로 add_role ()을 wp_loaded 작업 후크 안에 넣었습니다. 그리고 개발 중이므로 add_role 앞에 remove_role ()을 추가하여 캡 목록을 수정하면 실제로 적용되는지 확인할 수 있습니다.

그러나 분명히 이것은 블로그 페이지에 액세스 할 때마다 현재 실행되고 있습니다. 좋아, 나는 그것을 관리자 전용 행동에 넣을 수도 있고,이 역할을 한 번 만들 수있는 사용자 또는 도구 아래에 플러그인 페이지를 만들 수도 있습니다. 더 간단하고 우아한 솔루션이 있기를 바랍니다.

나는 run_once 종류의 행동이 있다고 상상하지 못합니까?

아니면 역할을 추가하고 add_cap ()을 여러 번 사용하는 것이 가장 좋은 방법입니까? 그리고 심지어 add_cap이 db에 액세스하고 있다고 상상합니다.

불필요한 DB 액세스를 줄이는 가장 좋은 방법으로 생각하십시오. 모범 사례는 무엇입니까?


대박! 이 질문에 감사드립니다 . remove_role()전에 기능을 추가하면 add_role()도움이됩니다.
beytarovski

답변:


10

사용자 역할과 기능은 데이터베이스에 저장되므로 일단 add_role()저장 한 다음 다음에로드하면 WordPress는 기본 제공 역할과 같은 역할을 알게됩니다.

이제 141 행에서 함수를 add_role()보다 구체적으로 살펴보면 var 가 true (기본적으로 설정되어 있음)로 설정되어있는 경우 데이터베이스의 역할과 기능 만 저장 하므로 호출하기 전에 간단히 변경할 수 있습니다. 기능과 역할이 저장되지 않습니다.$use_dbadd_role()

시험:

//globalize $wp_roles
global $wp_roles;
//set use_db to flase
$wp_roles->use_db = false;
//then add your role
$wp_roles->add_role( $role, $display_name, $capabilities );

최신 정보:

테스트 / 개발 환경에 있다면 단점이 없지만 실제 환경에 있다면 매로드마다 역할을 수행하는 데 걸리는 시간을 절약 할 수 있습니다.

모범 사례는 한 번만 실행하면 플러그인에서 사용해야 register_activation_hook하고 다른 어떤 경우에는 간단한 사용자 정의 조건부 함수를 사용합니다.

function run_once($key){
    $test_case = get_option('run_once');
    if (isset($test_case[$key]) && $test_case[$key]){
        return false;
    }else{
        $test_case[$key] = true;
        update_option('run_once',$test_case);
        return true;
    }
}

**usage:**
if (run_once('add_user_role')){
    //do you stuff and it will only run once
}

쓰레기. 나는 심지어 WP_Roles 클래스에 대한 이전의 뿌리부터 그것에 대해 알고있었습니다. 역할에 데이터베이스를 사용하지 않는다는 단점이 있습니까? 그리고 한 번만 무언가를 수행하는 WP 모범 사례가 있습니까?
Tom Auger

업데이트 주셔서 감사합니다-update_option 솔루션의 단순함을 좋아합니다
Tom Auger

실제로 만족 스럽지는 않지만 최상의 솔루션 인 것 같습니다
Blackbam

이 기능 run_once은 각 페이지로드에서 너무 많은 읽기 / 쓰기 데이터베이스 작업을 증가시킵니다. 이것을 사용하지 마십시오.
Mayank Dudakiya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.