기본 화면 옵션을 설정하는 방법은 무엇입니까?


20

화면 옵션을 사용하여 메타 상자를 숨기거나 사용자 역할로 제한하는 대신 메타 상자를 숨기고 자합니다. 목표는 사용자의 메타 상자를 "선택 취소"하는 것입니다.

사용자를 위해 DB를 변경하는 코드가 페이지를 방문 할 때마다 재설정 될 수 있기 때문에 실행할 수 없으므로 코드가 까다로울 것입니다. 그러나 내가 핵심을 코딩하는 것보다 똑똑한 사람들은 방법이있을 수 있습니다. 그리고 있다면, 나는 죽어 가고 있습니다.

어떤 아이디어?


사용자 이름별로 모든 사용자를 자신의 이름 옆에 체크 박스로 채우고 메타 박스 또는 여러 메타 박스를 표시하기 위해 필터에 연결하는 고유 한 종류의 플러그인을 만들어야합니다.
Wyck April

하여 기본 당신은 그들이 새 사용자가 생성 될 때, 올바른 한 번 적용한다는 의미는?
Rarst

답변:


25

관리자 게시 화면에서 메타 박스를 참조하고 있습니까?

플러그인이 필요하지 않다면 functions.php 파일에 다음을 넣으십시오.

// add_action('user_register', 'set_user_metaboxes');
add_action('admin_init', 'set_user_metaboxes');
function set_user_metaboxes($user_id=NULL) {

    // These are the metakeys we will need to update
    $meta_key['order'] = 'meta-box-order_post';
    $meta_key['hidden'] = 'metaboxhidden_post';

    // So this can be used without hooking into user_register
    if ( ! $user_id)
        $user_id = get_current_user_id(); 

    // Set the default order if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['order'], true) ) {
        $meta_value = array(
            'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
            'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
            'advanced' => '',
        );
        update_user_meta( $user_id, $meta_key['order'], $meta_value );
    }

    // Set the default hiddens if it has not been set yet
    if ( ! get_user_meta( $user_id, $meta_key['hidden'], true) ) {
        $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
        update_user_meta( $user_id, $meta_key['hidden'], $meta_value );
    }
}

기본적으로 현재 로그인 한 사용자의 경우 wp_usermeta 테이블에 저장된 일부 meta_value를 변경하고 있습니다.

이 기능을 사용하는 두 가지 방법이 있습니다. 'user_register'에 연결하거나 'admin_init'에 연결할 수 있습니다.

'user_register'를 사용하면 새 사용자가 등록 될 때만이 기능이 실행됩니다 (따라서 오버 헤드가 낮음). 그러나 이미 존재하는 사용자에게는 작동하지 않습니다.

이미 존재하는 사용자에게 적용하려면 'admin_init'에 연결하십시오. 물론 단점은 이제 사용자가 관리자 페이지로 갈 때마다이 기능이 실행된다는 것입니다.


15
입니다 하지 테마 작업과 functions.php에 속하지 않습니다.
fuxia

6
@toscho 나는 그것에 동의하지 않습니다. 당연히 이것을 플러그인에 넣을 수는 있지만 예를 들어 자신이나 특정 상자를 볼 필요가없는 클라이언트를 위해 테마를 작성하는 경우이를 포함하여 추가 관리 오버 헤드를 플러그인에 추가하는 이유는 무엇입니까? functions.php 파일에 놓으면 플러그인이 설치되고 활성화되지 않아도 테마 경험이 일관됩니다.
drebabels 2016 년

10
플러그인을 사용하여 오버 헤드 가 없습니다 . 그것은 즉시 죽어야하는 신화입니다. 또한 사용 제한이 질문의 일부가 아닙니다. 귀하의 답변은 수천 명의 초보자가 읽습니다. 특정 상황에서 작동하는 것이 아니라 작성할 수있는 최상의 코드로 도움을 줄 수 있습니다. :)
fuxia

+1 좋은 답변-때로는 명시 적으로 설정하려고합니다. 이 코드는 좋은 기반이되며 물론이 코드는 필요할 때 쉽게 호출하여 (예 : 새 사용자 추가) 쉽게 "기본"옵션을 설정하고 변경하는 사용자에게 옵션을 강요하지 않도록 수정할 수 있습니다. functions.php기본 옵션은 특정 프로젝트에 대한 것이므로이 코드를 테마 파일에 추가 할 것입니다.이 프로젝트는 개발중인 테마로 표시 / 보관됩니다.
cwd

1
이 답변이 작성된 후 몇 개월이 지나면 코어에 추가되어이 답변이 더 이상 사용되지 않습니다.
WraithKenny

16

default_hidden_meta_boxes에 필터는 get_hidden_meta_boxes()그 사용자가 화면 옵션에서 자신의 기본 설정을 수정하지 않은만큼 표시되지 않는 수정할 수 있습니다.


7

이미 게시 된 세 가지 솔루션에 대한 코드 의견이 있지만 일반적인 의견도 있습니다.

그것들은 차선의 선택을 제시한다 : 사용자의 스크린 옵션 체크 박스 선택을 무시하고; 또는 다른 meta_box의 경우에도 또는 코드가 WP에 있기 전에 사용자가 확인란을 변경 한 경우 코드를 무시하십시오. 정중 한 선택은 모든 사용자가 새로운 경우에만 유용합니다. 가장 좋은 해결책은 사용자 지정 user 옵션을 설정하여 특정 meta_box 기본값이 사용자에 의해 변경되었는지 확인하고이를 존중하는 것입니다. 아니요, 해당 코드를 작성하지 않았습니다! 쉬워야한다 ... :)

세 가지 솔루션이 게시되었습니다.

1. WraithKenny의 hidden_meta_boxes솔루션은 user_option 을 대체하는 솔루션입니다. 모든 게시물 유형 ( '게시물', '페이지', '링크', '첨부 파일'및 모든 사용자 정의 게시물 유형)에 적용됩니다. 구체적이지 않으려면 괜찮습니다. add_meta_box()호출 에서 post_type을 지정했습니다 . 당신은 그것들을 일치 시키려고 시도하거나, 일치하지 않는 것은 무시되기 때문에 날개를 찌를 수 있습니다. 필터에서 post_type을 알고 싶다면 추가 screen매개 변수를 사용할 수 있습니다 .

add_filter('hidden_meta_boxes', 'foo_hidden_meta_boxes', 10, 2);
function foo_hidden_meta_boxes($hidden, $screen) {
    $post_type= $screen->id;
    switch ($post_type) {
        // case 'post', 'page', 'link', 'attachment', and any custom post types
        // $hidden[]= 'foo_box_id';
        // /or/
        // $hidden= array_diff($hidden, array('foo_box_id'));
    }
    return $hidden;
}

2. Rarst가 말했듯 default_hidden_meta_boxes이 user_option을 존중합니다. 와 마찬가지로 hidden_meta_boxes$ screen 매개 변수를 사용하여 post_types를 구별 할 수 있습니다.

3. Drebabels의 set_user_metaboxes () 함수는 user_option도 존중합니다. '포스트'편집 화면에 하드 코딩되어 있습니다. 'page'편집 화면 및 기타 post_type을 처리하려면 다음 루프에서 코드를 래핑하십시오.

function set_user_metaboxes($user_id=NULL) {
    $post_types= array( 'post', 'page', 'link', 'attachment' );
    // add any custom post types here:
    // $post_types[]= 'my_custom_post_type';
    foreach ($post_types as $post_type) {

       // These are the metakeys we will need to update
       $meta_key= array(
           'order' => "meta-box-order_$post_type",
           'hidden' => "metaboxhidden_$post_type",
       );

       // The rest is the same as drebabels's code,
       // with '*_user_meta()' changed to '*_user_option()'

       // So this can be used without hooking into user_register
       if ( ! $user_id)
           $user_id = get_current_user_id(); 

       // Set the default order if it has not been set yet
       if ( ! get_user_option( $meta_key['order'], $user_id ) ) {
           $meta_value = array(
               'side' => 'submitdiv,formatdiv,categorydiv,postimagediv',
               'normal' => 'postexcerpt,tagsdiv-post_tag,postcustom,commentstatusdiv,commentsdiv,trackbacksdiv,slugdiv,authordiv,revisionsdiv',
               'advanced' => '',
           );
           update_user_option( $user_id, $meta_key['order'], $meta_value, true );
       }

       // Set the default hiddens if it has not been set yet
       if ( ! get_user_option( $meta_key['hidden'], $user_id ) ) {
           $meta_value = array('postcustom','trackbacksdiv','commentstatusdiv','commentsdiv','slugdiv','authordiv','revisionsdiv');
           update_user_option( $user_id, $meta_key['hidden'], $meta_value, true );
       }
    }
 }

네, get_user_meta해야한다 get_user_option. 단일 사이트의 경우 중요하지 않으며 다중 사이트의 경우에도 중요하지 않습니다. 왜 : update_user_option'true'전역 매개 변수가 있는지는 wp-admin / includes / ajax-actions.php를 참조하십시오 .


1
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
    $hidden[] = 'your_metabox';
    return $hidden;
}

또한 hidden_meta_boxes모든 페이지로드에서 메타 박스를 "체크 해제"하는 필터 가 있습니다 (데이터베이스를 전혀 업데이트하지 않아도 됨). 당신은 그것을 해제하려면 가 상자 자체 사용 Rarst의 답변을 확인할 때까지 사용자.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.