화면 옵션을 사용하여 메타 상자를 숨기거나 사용자 역할로 제한하는 대신 메타 상자를 숨기고 자합니다. 목표는 사용자의 메타 상자를 "선택 취소"하는 것입니다.
사용자를 위해 DB를 변경하는 코드가 페이지를 방문 할 때마다 재설정 될 수 있기 때문에 실행할 수 없으므로 코드가 까다로울 것입니다. 그러나 내가 핵심을 코딩하는 것보다 똑똑한 사람들은 방법이있을 수 있습니다. 그리고 있다면, 나는 죽어 가고 있습니다.
어떤 아이디어?
화면 옵션을 사용하여 메타 상자를 숨기거나 사용자 역할로 제한하는 대신 메타 상자를 숨기고 자합니다. 목표는 사용자의 메타 상자를 "선택 취소"하는 것입니다.
사용자를 위해 DB를 변경하는 코드가 페이지를 방문 할 때마다 재설정 될 수 있기 때문에 실행할 수 없으므로 코드가 까다로울 것입니다. 그러나 내가 핵심을 코딩하는 것보다 똑똑한 사람들은 방법이있을 수 있습니다. 그리고 있다면, 나는 죽어 가고 있습니다.
어떤 아이디어?
답변:
관리자 게시 화면에서 메타 박스를 참조하고 있습니까?
플러그인이 필요하지 않다면 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'에 연결하십시오. 물론 단점은 이제 사용자가 관리자 페이지로 갈 때마다이 기능이 실행된다는 것입니다.
functions.php
기본 옵션은 특정 프로젝트에 대한 것이므로이 코드를 테마 파일에 추가 할 것입니다.이 프로젝트는 개발중인 테마로 표시 / 보관됩니다.
이 default_hidden_meta_boxes
에 필터는 get_hidden_meta_boxes()
그 사용자가 화면 옵션에서 자신의 기본 설정을 수정하지 않은만큼 표시되지 않는 수정할 수 있습니다.
이미 게시 된 세 가지 솔루션에 대한 코드 의견이 있지만 일반적인 의견도 있습니다.
그것들은 차선의 선택을 제시한다 : 사용자의 스크린 옵션 체크 박스 선택을 무시하고; 또는 다른 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를 참조하십시오 .
add_filter( 'hidden_meta_boxes', 'custom_hidden_meta_boxes' );
function custom_hidden_meta_boxes( $hidden ) {
$hidden[] = 'your_metabox';
return $hidden;
}
또한 hidden_meta_boxes
모든 페이지로드에서 메타 박스를 "체크 해제"하는 필터 가 있습니다 (데이터베이스를 전혀 업데이트하지 않아도 됨). 당신은 그것을 해제하려면 새 가 상자 자체 사용 Rarst의 답변을 확인할 때까지 사용자.