Làm cách nào để đặt tùy chọn màn hình mặc định?


20

Tôi muốn có thể ẩn các hộp meta bằng các tùy chọn màn hình, thay vì loại bỏ chúng hoặc hạn chế chúng ở vai trò người dùng, mục tiêu là chỉ "bỏ chọn" hộp meta cho người dùng.

Tôi thấy điều này sẽ khó khăn như thế nào vì bất kỳ mã nào sẽ thay đổi DB cho người dùng sẽ không được phép chạy mỗi khi họ truy cập trang vì nó sẽ được đặt lại. Nhưng những người thông minh hơn tôi mã hóa cốt lõi, vì vậy có lẽ có một cách. Và nếu có, tôi sắp chết để biết.

Có ý kiến ​​gì không?


Mỗi tên người dùng, bạn sẽ phải tạo một loại plugin riêng cho tất cả người dùng với một hộp kiểm bên cạnh tên của họ và móc vào một bộ lọc để hiển thị các hộp meta hoặc nhiều hộp meta.
Wyck

Theo mặc định, bạn có nghĩa là chúng nên được áp dụng một lần khi người dùng mới được tạo, đúng không?
Rarst

Câu trả lời:


25

Bạn đang đề cập đến metaboxes trên màn hình bài đăng của quản trị viên phải không?

Cho rằng bạn không cần một plugin, chỉ cần thả phần sau vào tệp tin.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 );
    }
}

Về cơ bản những gì đang xảy ra là đối với người dùng hiện đang đăng nhập, bạn đang thay đổi một số meta_values ​​đã lưu trong bảng wp_usermeta.

Có hai cách để sử dụng chức năng này, bạn có thể móc vào 'user_register' hoặc bạn có thể móc vào 'admin_init'.

Ưu điểm của việc sử dụng 'user_register' là chức năng này sẽ chỉ kích hoạt khi người dùng mới được đăng ký (do đó chi phí thấp hơn). Tuy nhiên, nó sẽ không hoạt động cho người dùng đã tồn tại.

Nếu bạn muốn nó hoạt động cho người dùng đã tồn tại, hãy nối vào 'admin_init'. Nhược điểm của khóa học là bây giờ chức năng này kích hoạt mỗi khi người dùng truy cập trang quản trị.


15
Đây không phải là một công việc chủ đề và không thuộc về hàm.php.
fuxia

6
@toscho Tôi không thực sự đồng ý với điều đó. Đương nhiên, bạn có thể đặt nó vào một plugin nhưng nếu bạn đang xây dựng một chủ đề cho chính mình hoặc có thể cho một khách hàng không cần phải xem một số hộp nhất định thì tại sao lại thêm chi phí quản lý bổ sung đi kèm với điều này vào một plugin. Bằng cách thả nó vào tệp tin.php, bạn đảm bảo rằng trải nghiệm cho chủ đề là nhất quán mà không phải đảm bảo plugin được cài đặt và kích hoạt.
drebabels

10
Không chi phí sử dụng plugin. Đó là một huyền thoại phải chết ngay lập tức. Thêm vào đó, hạn chế sử dụng của bạn không phải là một phần của câu hỏi. Câu trả lời của bạn được đọc bởi hàng ngàn người mới. Bạn sẽ giúp họ với mã tốt nhất bạn có thể viết, chứ không phải với thứ gì đó hoạt động tốt trong một số tình huống cụ thể. :)
fuxia

+1 Câu trả lời hay - đôi khi bạn muốn đặt những câu này một cách rõ ràng. Đó là một cơ sở tốt và tất nhiên mã này có thể được sửa đổi dễ dàng để được gọi khi cần thiết (ví dụ: thêm người dùng mới), để bạn thực sự đang đặt các tùy chọn "mặc định" và không buộc các tùy chọn đối với người dùng thay đổi chúng. Tôi sẽ thêm mã này vào functions.phptệp của chủ đề của mình vì các tùy chọn mặc định dành cho một dự án cụ thể, được thể hiện / nằm trong chủ đề mà tôi đang phát triển.
cwd

1
Một vài tháng sau khi Câu trả lời này được viết, các bộ lọc được thêm vào lõi làm cho câu trả lời này trở nên lỗi thời.
WraithKenny

16

default_hidden_meta_boxesbộ lọc get_hidden_meta_boxes()cho phép sửa đổi không được hiển thị miễn là người dùng chưa sửa đổi tùy chọn của mình trong tùy chọn màn hình.


7

Tôi có nhận xét mã về ba giải pháp đã được đăng, nhưng cũng có một nhận xét chung

Chúng đưa ra lựa chọn tối ưu: ghi đè lựa chọn hộp kiểm Tùy chọn màn hình của người dùng; hoặc tôn trọng nó nhưng bỏ qua mã của bạn nếu người dùng đã từng thay đổi các hộp kiểm, ngay cả đối với các meta_box khác hoặc trước khi mã của bạn nằm trong WP. Có vẻ như sự lựa chọn tôn trọng chỉ hữu ích nếu tất cả người dùng của bạn là người mới. Giải pháp tốt nhất sẽ là đặt tùy chọn người dùng tùy chỉnh để xác định xem các mặc định meta_box cụ thể của bạn có bị người dùng thay đổi hay không và tôn trọng điều đó. Không, tôi chưa viết mã đó! Nên dễ dàng ... :)

Ba giải pháp được đăng:

1.hidden_meta_boxes Giải pháp của WraithKenny là giải pháp ghi đè user_option. Lưu ý rằng nó bao gồm tất cả các loại bài đăng ('bài đăng', 'trang', 'liên kết', 'tệp đính kèm' và bất kỳ loại bài đăng tùy chỉnh nào). Điều đó tốt trừ khi bạn muốn nó được cụ thể. Bạn đã chỉ định post_type trong các add_meta_box()cuộc gọi của bạn . Bạn có thể cố gắng khớp với những cái đó hoặc chỉ chắp cánh vì những cái không khớp sẽ bị bỏ qua. Nếu bạn muốn biết post_type trong bộ lọc, bạn có thể sử dụng screentham số phụ :

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. Như Rarst nói, default_hidden_meta_boxestôn trọng user_option. Như với hidden_meta_boxes, bạn có thể sử dụng tham số màn hình $ để phân biệt post_types.

3. Hàm set_user_metaboxes () của Drebabels cũng tôn trọng user_option. Lưu ý rằng nó được mã hóa cứng cho màn hình chỉnh sửa 'bài'. Để xử lý màn hình chỉnh sửa 'trang' và các post_types khác, hãy bọc mã trong vòng lặp này:

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 );
       }
    }
 }

Vâng, get_user_metanên được get_user_option. Đối với một trang web, điều đó không thành vấn đề và ngay cả đối với nhiều trang web, điều đó có thể không xảy ra. Xem wp-admin / gồm / ajax-Action.php để biết tại sao: update_user_optioncó tham số toàn cầu 'true'.


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

Ngoài ra còn có hidden_meta_boxesbộ lọc sẽ "bỏ chọn" metabox (làm cho nó bị ẩn) trên mỗi lần tải trang (nhưng hoàn toàn không phải cập nhật cơ sở dữ liệu). Nếu bạn chỉ muốn tắt nó cho người dùng mới cho đến khi họ tự kiểm tra hộp, hãy sử dụng câu trả lời của Rarst.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.