Vô hiệu hóa kéo các hộp meta?


17

Bất cứ ai cũng biết cách vô hiệu hóa chức năng này để các hộp meta không thể được định vị lại?

Câu trả lời:


13

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ễ!

  1. Đầu tiên, hãy ghi lại một tệp JavaScript (Tôi sẽ không thử lại quy trình này; có nhiều hướng dẫn có thể mô tả quá trình này tốt hơn tôi). Tôi móc vào admin_enqueue_scripts, và nó hoạt động tốt.
  2. 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!


Tất nhiên, giải pháp miễn phí ít rắc rối hơn cho Q, IMHO. Và rất nhiều trọng lượng nặng có trọng lượng;) :::: Tôi chỉ sử dụng JS cho tất cả, thêm $('.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
brasofilo

Thao tác CSS từ JS thật thông minh! Tôi sẽ thêm nó vào câu trả lời của tôi.
Chris Van Patten

Mã này đang hoạt động với WordPress 3.9.1 hiện tại - rất hay! :)
Philipp

4

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

Còn nếu bạn chỉ muốn vô hiệu hóa việc kéo cho một metabox cụ thể trên một loại bài đăng tùy chỉnh cụ thể thì sao?
NetConstructor.com

4
Điều này hoạt động nhưng nó cũng vô hiệu hóa các chức năng khác như trạng thái bài đăng
fxfuture

Tôi nghĩ là có, nhưng tôi không kiểm tra điều này. Bạn có thể ẩn với plugin Adminizing như một cách dễ dàng.
bueltge

1
Đẹp quá Làm thế nào chúng ta sẽ gửi mà admin_initchỉ trong một số loại bài cụ thể?
brasofilo

1
ban đầu có vẻ là một giải pháp hoàn hảo - nhưng than ôi - điều này cũng vô hiệu hóa tất cả chức năng để thêm danh mục / phân loại ...
ptriek

4

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

Cảm ơn Jan - Tôi đã thêm cái này vào hàm.php của mình nhưng nó không làm gì cả?
fxfuture

@fxfuture: Ngớ ngẩn với tôi, check_ajax_refererlà 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.
Jan Fabry

Phải, sự điều chỉnh của bạn không hoạt động..Hoặc, FireFox và Chrome đang lưu trữ trang vì một số lý do. : /
Zack

3

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

2

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.


Bổ sung tốt cho câu trả lời @bueltge (tôi đã sử dụng kết hợp cả hai) - mặc dù bạn cũng có thể bỏ qua bit jQuery và thêm .postbox:hover .handlediv { display:none; }CSS để ẩn .handlediv
ptriek

0

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 ..

Mã PHP cho tệp chức năng chủ đề hoặc tệp plugin

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 / JS cho tệp Javascript được tham chiếu ở trên

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_draggingchứ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_sciptcuộ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.


Lưu ý: Mã này không hoạt động nữa với phiên bản hiện tại của WordPress (3.9.1)
Philipp

0

Để 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ế postbằng bất kỳ loại bài đăng nào):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );

0

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.

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.