Nonaktifkan menyeret kotak meta?

17

Adakah yang tahu cara menonaktifkan fungsi ini sehingga kotak meta tidak dapat diposisikan ulang?

masa depan
sumber

Jawaban:

13

Saya memiliki masalah yang sama, dan Google membawa saya ke sini. Sayangnya tidak ada jawaban yang membantu, tetapi saya akhirnya menemukan jawabannya, dan itu cukup mudah!

  1. Pertama, membuat file JavaScript (saya tidak akan mengulangi proses ini; ada banyak tutorial yang dapat menggambarkan proses ini lebih baik daripada saya). Saya terhubung admin_enqueue_scripts, dan itu bekerja dengan baik.
  2. Nonaktifkan fungsi penyortiran dengan meletakkan ini di file JavaScript itu:

    jQuery(document).ready( function($) {
        $('.meta-box-sortables').sortable({
            disabled: true
        });
    
        $('.postbox .hndle').css('cursor', 'pointer');
    });

Pada dasarnya ini hanya menonaktifkan jQuery UI Sortable , yang mendukung fungsi menyeret metabox ( postbox.dev.js: 64 ). Ini juga mengalihkan kursor pada pegangan metabox ke penunjuk tetikus standar alih-alih kursor bergerak (ide milik brasofilo di bawah).

Semoga ini membantu!

Sunting: Saya harus menambahkan bahwa mungkin perlu mengikuti beberapa saran lainnya di sini dan menonaktifkan penghematan pesanan metabox. Ini akan mencegah kebingungan jika sesuatu yang salah diaktifkan kembali.

Suntingan kedua: Untuk kepentingan generasi masa depan (dan pencari Google di masa depan), perbaikan ini diuji di WordPress 3.3.1. Saya tidak dapat berbicara dengan versi lain!

Chris Van Patten
sumber
+1 solusi kurang repot gratis untuk Q, IMHO tentu saja. Dan banyak beban berat;) :::: Saya hanya menggunakan JS untuk semua, menambahkan $('.postbox .hndle').css('cursor','default');:::: Re: edit 2 , Anda harus terus memperbarui Jawaban di masa mendatang: P
brasofilo
Memanipulasi CSS dari JS itu pintar! Saya akan menambahkan itu ke jawaban saya.
Chris Van Patten
Kode ini bekerja dengan WordPress 3.9.1 saat ini - sangat bagus! :)
Philipp
4

Cara tercepat menonaktifkan JS untuk fungsi ini. Tapi saya pikir, lebih baik bila Anda juga membatalkan registrasi gaya untuk kotak dan init gaya kustom tanpa efek untuk mouse dan ikon buka / tutup pada kotak meta.

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
bueltge
sumber
bagaimana jika Anda hanya ingin menonaktifkan seret untuk kotak metabox tertentu pada jenis pos khusus?
NetConstructor.com
4
Ini berfungsi tetapi ia juga menonaktifkan fungsi lain seperti status pos
fxfuture
Saya pikir ya, tetapi saya tidak menguji ini. Anda dapat bersembunyi dengan plugin Adminimize sebagai cara mudah.
bueltge
1
Yang bagus! Bagaimana kami mengirim itu admin_inithanya dalam beberapa jenis posting tertentu?
brasofilo
1
tampaknya solusi yang sempurna pada awalnya - tetapi sayangnya - ini juga menonaktifkan semua fungsionalitas untuk menambahkan kategori / taksonomi ...
ptriek
4

Saya menjawab pertanyaan serupa dengan saran untuk memungkinkan menyeret, tetapi nonaktifkan menyimpan pesanan baru di sisi server. Ini mungkin memberi Anda lebih banyak kontrol, dan lebih tahan di masa depan karena JavaScript dapat berubah dengan cepat, tetapi protokol untuk berkomunikasi dengan server mungkin tetap lebih kuat. Contoh ini menonaktifkan semua seret, tetapi Anda dapat memperluasnya untuk memeriksa kotak atau halaman meta spesifik Anda.

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');
   }
}
Jan Fabry
sumber
Terima kasih Jan - saya menambahkan ini ke functions.php saya tetapi tidak melakukan apa-apa?
fxfuture
@ fxfuture: Konyol saya, check_ajax_refereradalah tindakan, bukan filter. Anda seharusnya hanya di die()sana untuk mengakhiri eksekusi skrip, bukan mengembalikan apa pun. Saya akan memperbaiki kode saya.
Jan Fabry
Ya, koreksi Anda tidak berfungsi .. Atau, FireFox dan Chrome sedang melakukan caching halaman karena suatu alasan. : /
Zack
3

Wordpress javascript mengidentifikasi metabox yang dapat diseret oleh judul h3 mereka dengan kelas "hndle". Ini cukup sederhana untuk menonaktifkannya secara khusus dengan mereferensikan metabox yang dimaksud (jika Anda membuat metabox khusus, Anda akan menetapkannya sebagai pengidentifikasi) dan menonaktifkan semua kelas hndle dengan menghapus nama kelas atau dengan menamai ulangnya. Dalam kasus saya, saya memiliki beberapa jenis pemisah yang saya beri label .hndle h3, tetapi tidak mungkin orang lain akan melakukan hal-hal seperti ini. Jadi, Anda dapat melakukan apa yang saya lakukan di bawah ini, atau Anda dapat menggunakan .find ('. Hndle'). Attr ('class', '') .... atau yang serupa. Ini akan masuk dalam file .js yang Anda enqueued di file functions.php Anda (apakah itu ada di folder tema atau folder plugin Anda). Enqueueing akan dipanggil oleh admin_print_scripts,

jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
Aryan Duntley
sumber
2

Saya juga akan menambahkan Javascript Hack ini:

<script type='text/javascript'>
    jQuery(document).ready(function ($) {
        $('.handlediv').remove();
    });
</script>

... dan CSS ini:

.postbox .hndle:hover {
    cursor:default;
}

Saya menggunakan kode itu untuk mengambil keuntungan dari kotak meta tetapi tanpa fungsi drag-and-drop dan buka / tutup.

Maxime
sumber
Tambahan yang bagus untuk jawaban @bueltge (saya menggunakan kombinasi keduanya) - walaupun Anda juga bisa melewatkan bit jQuery, dan menambahkan .postbox:hover .handlediv { display:none; }CSS untuk menyembunyikan .handlediv
ptriek
0

Saya perhatikan pertanyaan ini masih belum terjawab, sejauh si penanya tidak memilih jawaban yang benar.

Jan memberikan contoh yang bermanfaat untuk menghentikan pemesanan ulang metabox yang diselamatkan atas Ajax, sementara yang lain memberikan saran terkait dengan JS.

Sejauh yang saya pahami, yang ingin Anda lakukan hanyalah menonaktifkan seret, tidak lebih. Untuk melakukan itu, Anda akan membutuhkan dua hal, pertama fungsi untuk mencegat tindakan penghematan ajax, tetapi kedua Anda juga harus menghentikan JS menyeret dan menjatuhkan tanpa mematikan fungsionalitas di tempat lain di halaman, sementara itu juga dilakukan secara selektif untuk tipe posting atau metabox tertentu.

Menggunakan fungsi Jans dan beberapa jQuery kita bisa melakukannya tanpa benar-benar mematikan fungsionalitas lain yang dibuat skrip kotak pos, seperti itu ..

Kode PHP untuk file fungsi tema atau file plugin

Batalkan komentar 1 pada baris yang sesuai untuk membuat enqueue bekerja.

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 untuk file Javascript yang dirujuk di atas

Jquery yang sangat mendasar yang menghapus kelas sortir metabox dari elemen yang bisa diterapkan, ini mencegah penyeretan.

jQuery(document).ready(function($){
    $('.meta-box-sortables').removeClass('meta-box-sortables');
});

Seperti yang Anda lihat, saya telah menambahkan dalam 1 contoh jenis posting untuk menambahkan kode, pesan dalam hal ini. Namun Anda menyebutkan ingin juga memiliki kemungkinan menonaktifkannya untuk metabox tertentu.

Hal ini dapat dilakukan, hanya ada beberapa efek samping kecil salah satunya, yaitu dengan menghapus kelas dari metabox yang diberikan untuk mencegah menyeret, Anda juga mencegah fungsi sakelar bekerja (mis. Judul metabox judul fungsi sakelar).

Yang mengatakan, itu bisa dilakukan ...

Pertama, Anda akan memperbarui disable_metabox_draggingfungsi ke ..

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

Sekali lagi, perhatikan Anda perlu menghapus komentar pada wp_enqueue_scriptbaris yang berlaku .

Array di dalam panggilan pelokalan adalah yang menentukan metabox mana yang harus dinonaktifkan, item kosong 0 yang sengaja ada karena fungsi skrip pelokalan menghapus setiap indeks 0 yang dikunci dalam array.

Kedua, file JS baru direferensikan dalam fungsi enqueue tweak di atas.

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

Satu-satunya hal yang perlu Anda lakukan adalah menentukan ID untuk metabox yang ingin Anda sembunyikan, dan meneruskannya ke dalam array yang menetapkan metabox yang dinonaktifkan (dalam wp_localize_sciptpanggilan).

Secara keseluruhan saya tidak berpikir metabox menonaktifkan selektif kekurangan, tidak ada dukungan untuk mengkonfigurasi ulang tindakan init sortable di WordPress, jadi menonaktifkan metabox menyortir berdasarkan elemen per elemen akan menjadi hacky terbaik (kode saya di atas adalah bukti itu). Idealnya, yang diperlukan di sini adalah tindakan di WordPress untuk mengaitkan init sortable, tetapi saat ini hardcoded ke javascript kotak pos (yang melakukan lebih dari sekedar pengaturan sortir).

Bagaimanapun, saya harap itu membantu menjawab pertanyaan awal.

t31os
sumber
Catatan: Kode ini tidak berfungsi lagi dengan versi WordPress saat ini (3.9.1)
Philipp
0

Untuk menambah semua jawaban sebelumnya, jika Anda juga ingin mencegah WordPress dari memuat posisi kustom, berikut ini harus melakukan trik (ganti postdengan jenis posting apa pun):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Matthew Boynes
sumber
0

Baru saja menemukan cara yang sederhana, semoga pencari baru akan membantu dengan ini. Dengan asumsi Anda bisa menambahkan file css pada gaya admin enqueue, saya hanya menggunakan css untuk melakukan itu dan maaf untuk bahasa Inggris saya yang buruk.

.postbox#your-metabox-id .ui-sortable-handle {
    pointer-events: none;
}

Semoga ini bisa membantu.

Rahendra Putra K
sumber