Làm cho Metaboxes tùy chỉnh thu gọn theo mặc định


7

Tôi đã tạo một số metabox tùy chỉnh cho màn hình viết bài của mình. Có cách nào để làm cho một số trong số chúng hiển thị sụp đổ theo mặc định?

Chỉ trong trường hợp tôi không sử dụng các thuật ngữ chính xác hoặc không rõ ràng trong câu hỏi của mình, tôi sẽ giải thích:

Các metaboxes trên màn hình viết bài có một công tắc bật tắt ở góc trên bên phải của hộp. Nếu bạn di chuột qua khu vực này, nó sẽ hiển thị một mũi tên hướng xuống và dòng chữ "Nhấp để chuyển đổi". Khi bạn nhấp vào nó, metabox sẽ sụp đổ, ẩn nội dung và chỉ hiển thị thanh tiêu đề của metabox. Tôi không nói về Tùy chọn màn hình làm cho toàn bộ metaboxes biến mất (chỉ trên tài khoản đã cho). Tôi chỉ muốn các metabox nhất định hiển thị ở chế độ thu gọn theo mặc định cho tất cả người dùng WP.

CẬP NHẬT:

Sau khi đọc câu trả lời của Hakre rằng trạng thái chuyển đổi được lưu trữ cho người dùng, tôi muốn thêm một số giải thích về cách tôi muốn nó hoạt động. Tôi không chắc liệu điều này có khả thi hay không, nhưng tôi muốn các metabox mặc định bị sập khi bài đăng mới, sau đó khi người dùng mở rộng chúng, họ nên mở rộng. Tuy nhiên, tôi muốn các cài đặt đó giữ nguyên cục bộ cho bài đăng cụ thể, vì vậy khi chúng tạo một bài đăng mới, tất cả các metabox đều bị thu gọn.

Câu trả lời:


7

Để hiển thị một metabox được thu gọn hoặc đóng theo mặc định, điều tốt là phải biết rằng việc thêm closedvào thuộc tính lớp sẽ hiển thị nó đóng. Tất cả các div chính của hộp meta có closedtrong tên lớp của chúng, được hiển thị ở dạng đóng.

Khi mũi tên được nhấp, nó sẽ bị xóa hoặc thêm (bật). Điều này được thực hiện tương tác trên trang biên tập bài. Thêm thủ công closedtên lớp chỉ hoạt động nếu bạn làm điều đó trong trình duyệt của mình với một công cụ dành cho nhà phát triển như fireorms hoặc tương tự.

Vì Wordpress thường theo dõi trạng thái chuyển đổi của từng metabox, bạn nên lưu ý chỉ ban đầu đặt trạng thái chuyển đổi để đóng lần đầu tiên khi một người dùng cụ thể truy cập trình chỉnh sửa hoặc được thêm vào người dùng.

Dữ liệu của các metabox được đóng được lưu trữ bên trong các tùy chọn người dùng, mỗi khi bạn chuyển một hộp, sẽ có một yêu cầu ajax đang lưu trữ nó:

update_user_option($user->ID, "closedpostboxes_$page", $closed, true);

$closedlà một danh sách được phân tách bằng dấu phẩy của tất cả các ID metaboxes đã bị đóng. $pageđược đặt thành "bài đăng" cho trình chỉnh sửa bài đăng (bài bạn đã yêu cầu). Vì vậy, khi người dùng mới được tạo (hoặc plugin được cài đặt cho tất cả người dùng hiện tại), bạn có thể mở rộng cài đặt đó bằng ID của metabox của mình. Điều này nên làm công việc.

Điều duy nhất bạn cần biết là ID của metabox của bạn, nhưng tôi khá chắc chắn rằng bạn đã biết cái đó rồi. Nếu không, hãy kiểm tra mã của bạn nơi bạn đăng ký metabox.

Ngoài ra, bên cạnh những cái được đóng, bạn cũng có thể đặt những cái bị ẩn btw, tương ứng với các hộp kiểm. Đó là hiddenpostboxes_$pagelựa chọn sau đó.

Cập nhật

Một số mã được trích dẫn về cách thêm tùy chọn:

function collapseBoxForUser($userId, $page, $boxId) {
    $optionName = "closedpostboxes_$page";
    $close = get_user_option($optionName, $userId);
    $closeIds = explode(',', $close);
    $closeIds[] = $boxId;
    $closeIds = array_unique($clodeIds); // remove duplicate Ids
    $close = implode(',', $closeIds);
    update_user_option($userId, $optionName, $close);
}

chỉ cần gọi hàm đó với các giá trị phù hợp và nó sẽ chèn boxId của bạn vào giá trị. Lần tới, trình soạn thảo đang tải giá trị đó cho màn hình (ví dụ: thông qua yêu cầu ajax), nó sẽ hiển thị hộp đó đóng lại.


Tôi đã thử thêm 'class' => "shut", vào mảng thiết lập metaboxes nhưng chúng vẫn được mặc định mở rộng và lớp được đặt thành "hộp thư" mặc dù tôi không biết nó được đặt ở đâu. Ngoài ra, tôi đã thêm một bản cập nhật cho câu hỏi của tôi.
matt

@matt - đó là để giải thích cách thức hoạt động trên trang khi tất cả các tập lệnh đang hoạt động, v.v. - vì vậy thông tin không phải là giải pháp. Đặt tùy chọn thay cho người dùng, phần còn lại sẽ chỉ phù hợp với bạn.
hakre

Vì vậy, để làm rõ, tôi sẽ đặt "update_user_option ($ user-> ID," clospostboxes_ $ page ", $ shut, true);" với mã để tạo metabox của tôi. Tôi có cần thay thế một cái gì đó bằng ID metabox không?
matt

@matt: Tôi đã thêm một số đoạn mã sẽ làm cho nó rõ ràng hơn. Bạn có biết nơi bạn tìm thấy metaboxID của bạn? Nếu bạn nhìn vào nguồn HTML, bạn sẽ có thể xác định nó cho hộp của mình. Nếu không, thêm dòng mã nơi bạn đăng ký metabox của bạn.
hakre

@matt: và hãy nhớ chỉ gọi một lần cho mỗi người dùng (không phải một lần mỗi khi bạn tạo metabox) nếu không hộp sẽ được hiển thị đóng mọi lúc.
hakre

6

Một cách khác để làm điều này là sử dụng hook trong get_user_option:

function closed_meta_boxes( $closed ) {
    if ( false === $closed )
        $closed = array( 'submitdiv', 'postcustom', 'anothermetaboxid' );

    return $closed;
}
add_filter( 'get_user_option_closedpostboxes_{post_type_slug}', 'closed_meta_boxes' );

Điều này có vẻ đầy hứa hẹn, nhưng ai đó có thể cung cấp cho tôi liên kết đến nơi tôi có thể tìm thêm thông tin về bộ lọc 'get_user_option_closespostboxes_ {post_type_slug}' không? Và / hoặc, cho chúng tôi biết chuỗi 'Anothermetaboxid' dùng để làm gì? Cảm ơn. :)
ban-geengineering

Ngoài ra, bạn có thể xem xét thay đổi dòng "if (false === $ đã đóng)" thành "if (trống ($ đã đóng))" bởi vì, trong các thử nghiệm của tôi, $ clos là một mảng trống.
ban-geengineering

1

Bạn có thể móc vào móc đăng ký người dùng và áp dụng các thay đổi trạng thái hộp thư sau đó, nó sẽ đơn giản chạy bất cứ khi nào người dùng mới được tạo.

add_action( 'user_register', 'set_user_closedboxes' );
function set_user_closedboxes( $uid ) {
    update_user_meta( $uid, 'closedpostboxes_{type}',array('submitdiv','postcustom'));
}

Trường hợp {type}nên là loại bài đăng có thể áp dụng của bạn và mảng phải chứa ID của các hộp để ẩn (submitdiv và postcustom là hai ví dụ).

Bạn sẽ cần phải viết một truy vấn nếu bạn muốn cập nhật người dùng hiện tại, nhưng những điều trên sẽ bao gồm những người dùng mới được tạo / đăng ký ..

Mã chưa được kiểm tra, nhưng tôi thấy không có lý do gì nó không hoạt động, báo cáo lại nếu có vấn đề.

Mong rằng sẽ giúp ..


Hãy tham gia trò chuyện.
hakre

Có vẻ như tôi đã bỏ lỡ cuộc trò chuyện không may ... bất kỳ nhận xét nào về đề xuất trên của tôi để kết nối với đăng ký / tạo người dùng mới?
t31os

1
làm việc tuyệt vời cho tôi Đừng quên thay thế {type} bằng sên của loại bài đăng bạn đang xử lý (bài đăng, trang, loại bài đăng tùy chỉnh, v.v.)
somatic
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.