Adakah yang tahu cara menonaktifkan fungsi ini sehingga kotak meta tidak dapat diposisikan ulang?
Adakah yang tahu cara menonaktifkan fungsi ini sehingga kotak meta tidak dapat diposisikan ulang?
Jawaban:
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!
admin_enqueue_scripts
, dan itu bekerja dengan baik.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!
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' );
admin_init
hanya dalam beberapa jenis posting tertentu?
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');
}
}
check_ajax_referer
adalah tindakan, bukan filter. Anda seharusnya hanya di die()
sana untuk mengakhiri eksekusi skrip, bukan mengembalikan apa pun. Saya akan memperbaiki kode saya.
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");
});
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.
.postbox:hover .handlediv { display:none; }
CSS untuk menyembunyikan .handlediv
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 ..
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 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_dragging
fungsi 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_script
baris 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_scipt
panggilan).
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.
Untuk menambah semua jawaban sebelumnya, jika Anda juga ingin mencegah WordPress dari memuat posisi kustom, berikut ini harus melakukan trik (ganti post
dengan jenis posting apa pun):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
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.
$('.postbox .hndle').css('cursor','default');
:::: Re: edit 2 , Anda harus terus memperbarui Jawaban di masa mendatang: P