Câu trả lời:
Tôi đã có cùng một vấn đề và Google dẫn tôi đến đây. Thật không may, không có câu trả lời nào trong số này giúp được, nhưng cuối cùng tôi đã tìm ra câu trả lời, và nó khá dễ!
admin_enqueue_scripts
, và nó hoạt động tốt.Vô hiệu hóa chức năng sắp xếp bằng cách đặt cái này vào tệp JavaScript đó:
jQuery(document).ready( function($) {
$('.meta-box-sortables').sortable({
disabled: true
});
$('.postbox .hndle').css('cursor', 'pointer');
});
Về cơ bản, điều này chỉ vô hiệu hóa jQuery UI Sortable, hỗ trợ chức năng kéo metabox ( postbox.dev.js: 64 ). Điều này cũng chuyển con trỏ trên tay cầm metabox sang con trỏ chuột tiêu chuẩn thay vì con trỏ di chuyển (ý tưởng lịch sự của brasofilo bên dưới).
Hi vọng điêu nay co ich!
Chỉnh sửa: Tôi nên thêm rằng có lẽ đáng để làm theo một số lời khuyên khác ở đây và vô hiệu hóa việc lưu thứ tự metabox. Nó sẽ ngăn ngừa sự nhầm lẫn trong trường hợp không có khả năng một cái gì đó bị kích hoạt lại nhầm.
Chỉnh sửa thứ hai: Vì lợi ích của các thế hệ tương lai (và những người tìm kiếm Google trong tương lai), bản sửa lỗi này đã được thử nghiệm trên WordPress 3.3.1. Tôi không thể nói với các phiên bản khác!
Cách nhanh nhất là hủy kích hoạt JS cho chức năng này. Nhưng tôi nghĩ, sẽ tốt hơn khi bạn hủy đăng ký kiểu cho hộp và khởi tạo một kiểu tùy chỉnh mà không có hiệu ứng cho chuột và biểu tượng mở / đóng trên các hộp meta.
function fb_remove_postbox() {
wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
admin_init
chỉ trong một số loại bài cụ thể?
Tôi đã trả lời một câu hỏi tương tự với đề xuất cho phép kéo, nhưng vô hiệu hóa việc lưu đơn hàng mới ở phía máy chủ. Điều này có thể cung cấp cho bạn nhiều quyền kiểm soát hơn và có nhiều bằng chứng trong tương lai vì JavaScript có thể thay đổi nhanh chóng, nhưng giao thức để giao tiếp với máy chủ có thể mạnh mẽ hơn. Ví dụ này vô hiệu hóa tất cả việc kéo, nhưng bạn có thể mở rộng nó để kiểm tra hộp meta hoặc trang meta cụ thể của bạn.
add_action('check_ajax_referer', 'prevent_meta_box_order');
function prevent_meta_box_order($action)
{
if ('meta-box-order' == $action /* && $wp_user == 'santa claus' */) {
die('-1');
}
}
check_ajax_referer
là một hành động, không phải là một bộ lọc. Bạn chỉ nên die()
ở đó để kết thúc thực thi tập lệnh, không trả lại bất cứ điều gì. Tôi sẽ sửa mã của tôi.
Các javascript wordpress xác định các metabox có thể kéo theo tiêu đề h3 của chúng với một lớp "hndle". Nó đủ đơn giản để vô hiệu hóa những thứ này một cách cụ thể bằng cách tham khảo metabox trong câu hỏi (nếu bạn đang tạo metabox tùy chỉnh, bạn sẽ gán cho nó một mã định danh) và vô hiệu hóa bất kỳ lớp hndle nào bằng cách xóa tên lớp hoặc bằng cách đổi tên nó. Trong trường hợp của tôi, tôi có một số loại dấu phân tách mà tôi đã gắn nhãn .hndle h3's, nhưng không chắc ai khác sẽ làm mọi thứ theo cách này. Vì vậy, bạn có thể làm những gì tôi đã làm dưới đây hoặc bạn có thể sử dụng .find ('. Hndle'). Attr ('class', '') .... hoặc một cái gì đó tương tự. Điều này sẽ đi vào một tệp .js mà bạn đã mê hoặc trong tệp tin.php. (Cho dù đó là trong thư mục chủ đề hoặc thư mục bổ trợ của bạn). Việc đăng ký sẽ được gọi bởi admin_print_scripts,
jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
Tôi cũng sẽ thêm Hack Javascript này:
<script type='text/javascript'>
jQuery(document).ready(function ($) {
$('.handlediv').remove();
});
</script>
... và CSS này:
.postbox .hndle:hover {
cursor:default;
}
Tôi đã sử dụng mã đó để tận dụng các hộp meta nhưng không có chức năng kéo và thả và các chức năng mở / đóng.
.postbox:hover .handlediv { display:none; }
CSS để ẩn .handlediv
Tôi nhận thấy câu hỏi này vẫn chưa được trả lời, trong khi người hỏi không chọn câu trả lời đúng.
Jan đã đưa ra một ví dụ hoạt động về việc ngăn chặn việc đặt hàng lại metabox được lưu trên Ajax, trong khi những người khác đưa ra các đề xuất liên quan đến JS.
Theo tôi hiểu tất cả những gì bạn muốn làm là vô hiệu hóa kéo, không có gì hơn. Để làm điều đó, bạn sẽ cần hai thứ, trước tiên là một chức năng để chặn hành động tiết kiệm ajax, nhưng thứ hai, bạn cũng cần dừng việc kéo và thả JS mà không làm mất chức năng ở bất kỳ nơi nào khác trên trang, đồng thời phải thực hiện một cách có chọn lọc một loại bài hoặc metabox cụ thể.
Sử dụng hàm Jans và một số jQuery chúng ta có thể làm điều đó mà không hoàn toàn giết chết các chức năng khác mà tập lệnh hộp thư tạo ra, như vậy ..
Uncomment 1 của các dòng thích hợp để làm cho enqueue hoạt động.
add_action( 'admin_enqueue_scripts' , 'disable_metabox_dragging' );
add_action( 'check_ajax_referer', 'disable_metabox_ordering' );
function disable_metabox_dragging( $hook ) {
if( !in_array( $hook, array( 'post.php', 'post-new.php' ) ) )
return;
global $post_type;
if( !in_array( $post_type, array( 'book' ) ) )
return;
// Uncomment the following line if using inside a child theme
//wp_enqueue_script( 'unsortable-meta', trailingslashit( get_stylesheet_directory_uri() ) . 'unsortable-metaboxes.js', array(), false );
// Or uncomment the following line if using inside a parent theme
//wp_enqueue_script( 'unsortable-meta', trailingslashit( get_template_directory_uri() ) . 'unsortable-metaboxes.js', array(), false );
// Or ncomment the following line if using inside a plugin file
//wp_enqueue_script( 'unsortable-meta', plugins_url( '/unsortable-metaboxes.js', __FILE__ ), array(), false );
}
function disable_metabox_ordering($action) {
global $post_type;
if( !in_array( $post_type, array( 'book' ) ) )
return;
if( 'meta-box-order' == $action )
die;
}
Jquery rất cơ bản loại bỏ lớp sắp xếp metabox khỏi các yếu tố đáng khen ngợi, điều này ngăn cản việc kéo.
jQuery(document).ready(function($){
$('.meta-box-sortables').removeClass('meta-box-sortables');
});
Như bạn có thể thấy tôi đã thêm vào 1 loại bài đăng mẫu để thêm mã, đặt trong trường hợp này. Tuy nhiên, bạn đề cập đến việc muốn có khả năng vô hiệu hóa nó cho các metabox cụ thể.
Có thể thực hiện được, chỉ có một vài tác dụng phụ nhỏ mà một trong số đó là bằng cách loại bỏ các lớp khỏi metabox đã cho để ngăn kéo, bạn cũng ngăn chức năng chuyển đổi hoạt động (ví dụ: chức năng chuyển đổi tiêu đề metabox).
Điều đó nói rằng, nó có thể được thực hiện ...
Trước tiên, bạn sẽ cập nhật disable_metabox_dragging
chức năng lên ..
function disable_metabox_dragging( $hook ) {
if( !in_array( $hook, array( 'post.php', 'post-new.php' ) ) )
return;
global $post_type;
if( !in_array( $post_type, array( 'book' ) ) )
return;
// Uncomment the following line if using inside a child theme
// wp_enqueue_script( 'some-unsortables', trailingslashit( get_stylesheet_directory_uri() ) . 'unsortable-somemetaboxes.js', array('postbox') );
// Or uncomment the following line if using inside a parent theme
//wp_enqueue_script( 'some-unsortables', trailingslashit( get_template_directory_uri() ) . 'unsortable-somemetaboxes.js', array('postbox') );
// Or uncomment the following line if using inside a plugin file
//wp_enqueue_script( 'some-unsortables', plugins_url( '/unsortable-somemetaboxes.js', __FILE__ ), array('postbox') );
wp_localize_script( 'some-unsortables', 'NonDragMetaboxes', array( 0 => '', 'postcustom', 'postexcerpt' ) );
}
Một lần nữa, lưu ý bạn cần bỏ ghi chú dòng áp dụng wp_enqueue_script
.
Mảng bên trong lệnh gọi bản địa hóa là yếu tố quyết định loại bỏ metaboxes nào, mục 0 khóa trống có chủ ý vì hàm script nội địa hóa loại bỏ bất kỳ chỉ mục 0 khóa nào trong mảng.
Thứ hai, tệp JS mới được tham chiếu trong hàm enqueue được điều chỉnh ở trên.
jQuery(document).ready(function($){
// For each item in the JS array created by the localize call
$.each( NonDragMetaboxes, function(index,value) {
// Remove postbox class(disables drag) and add stuffbox class(styling is close to the original)
$( '#' + value ).removeClass('postbox').addClass('stuffbox');
// Remove redundant handle div
if( $( '#' + value ).has('.handlediv') )
$( '#' + value ).children('.handlediv').remove();
// Remove redundant cursor effect on hover
if( $( '#' + value ).has('h3') )
$( '#' + value ).children('h3').css('cursor','default');
} );
});
Điều duy nhất bạn cần làm là xác định ID cho các metabox mà bạn muốn ẩn và chuyển chúng vào mảng đặt các metabox bị vô hiệu hóa (trong wp_localize_scipt
cuộc gọi).
Nhìn chung, tôi không nghĩ rằng việc vô hiệu hóa chọn lọc metaboxes là thiếu sót, không có hỗ trợ nào để định cấu hình lại hành động init có thể sắp xếp trong WordPress, do đó, việc vô hiệu hóa sắp xếp metabox trên cơ sở từng yếu tố sẽ rất khó khăn (mã của tôi ở trên là bằng chứng về điều đó). Lý tưởng nhất, những gì cần thiết ở đây là một hành động trong WordPress để kết nối init có thể sắp xếp, nhưng hiện tại nó đã được mã hóa vào javascript của hộp thư (không chỉ là thiết lập có thể sắp xếp được).
Trong mọi trường hợp, tôi hy vọng điều đó đã giúp giải quyết câu hỏi ban đầu.
Để thêm vào tất cả các câu trả lời trước đó, nếu bạn cũng muốn ngăn WordPress tải các vị trí tùy chỉnh, sau đây nên thực hiện thủ thuật (thay thế post
bằng bất kỳ loại bài đăng nào):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Chỉ cần tìm thấy cách đơn giản, hy vọng người tìm kiếm mới sẽ giúp với điều này. Giả sử bạn có thể thêm tệp css theo phong cách enqueue của quản trị viên, tôi chỉ sử dụng css để làm điều đó và xin lỗi vì tiếng Anh không tốt của tôi.
.postbox#your-metabox-id .ui-sortable-handle {
pointer-events: none;
}
Hy vọng nó giúp.
$('.postbox .hndle').css('cursor','default');
:::: Re: Chỉnh sửa lần 2 , bạn sẽ phải tiếp tục cập nhật Câu trả lời trong tương lai gần: P