Yanıtlar:
Aynı sorunu yaşadım ve Google beni buraya yönlendirdi. Ne yazık ki bu cevapların hiçbiri işe yaramadı, ama sonuçta cevabı anladım ve oldukça kolay!
admin_enqueue_scripts
ve iyi çalıştı.Bunu şu JavaScript dosyasına koyarak sıralama işlevini devre dışı bırakın:
jQuery(document).ready( function($) {
$('.meta-box-sortables').sortable({
disabled: true
});
$('.postbox .hndle').css('cursor', 'pointer');
});
Temelde bu sadece metabox sürükleme işlevselliğini güçlendiren jQuery UI Sortable'ı devre dışı bırakır ( postbox.dev.js: 64 ). Bu aynı zamanda metabox tanıtıcısındaki imleci bir hareket imleci yerine standart bir fare imlecine geçirir ( aşağıdaki brasofilo'nun fikri sayesinde ).
Bu yardımcı olur umarım!
Düzenleme: Buradaki diğer önerileri izlemeye ve meta kutu sırasının kaydedilmesini devre dışı bırakmaya değer olduğunu eklemeliyim. Bir şeyin yanlışlıkla yeniden etkinleştirilmesi ihtimal dışı karışıklığı önleyecektir.
İkinci düzenleme: Gelecek nesiller (ve gelecekteki Google araştırmacıları) yararına, bu düzeltme WordPress 3.3.1'de test edildi. Diğer sürümlerle konuşamıyorum!
En hızlı yol, bu işlev için JS'yi devre dışı bırakmaktır. Ama bence, kutu için stil kaydının silinmesi ve farenin efektleri ve meta kutulardaki açma / kapama simgesi olmadan özel bir stil başlatmanız daha iyi.
function fb_remove_postbox() {
wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
admin_init
yalnızca belirli bir gönderi türünde nasıl göndeririz ?
ben Benzer bir soruyu sürüklemeye izin verme önerisiyle yanıtladım , ancak yeni siparişi sunucu tarafında kaydetmeyi devre dışı . Bu, JavaScript'in hızlı bir şekilde değişebileceği için size daha fazla kontrol sağlayabilir ve geleceğe daha dayanıklı olabilir, ancak sunucuyla iletişim kurmak için protokol daha sağlam kalabilir. Bu örnek tüm sürüklemeyi devre dışı bırakır, ancak özel kutunuzu veya meta sayfanızı kontrol etmek için genişletebilirsiniz.
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
bir eylemdir, bir filtre değildir. die()
Komut dosyası yürütmeyi sonlandırmak için orada olmalısınız , hiçbir şey döndürmeyin. Kodumu düzeltirim.
Wordpress javascript, sürüklenebilir meta kutuları h3 başlıklarına göre bir "hndle" sınıfıyla tanımlar. Söz konusu meta kutuya başvurarak (özel meta kutular oluşturuyorsanız, bir tanımlayıcı atayacaksınız) ve sınıf adını kaldırarak veya yeniden adlandırarak tüm hndle sınıflarını devre dışı bırakarak bunları devre dışı bırakmak yeterince basittir. Benim durumumda, .hndle h3 ile etiketlediğim birkaç ayırıcı tipim var, ancak başkalarının bu şekilde yapması pek olası değil. Böylece, aşağıda yaptığım şeyi yapabilir veya .find ('. Hndle'). Attr ('class', '') .... veya benzer bir şey kullanabilirsiniz. Bu, function.php dosyanızda (temalar klasörünüzde veya eklentiler klasörünüzde olsun) sıktığınız bir .js dosyasına gider. Sıralama, admin_print_scripts tarafından çağrılır,
jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
Ayrıca bu Javascript Hack eklemek istiyorum:
<script type='text/javascript'>
jQuery(document).ready(function ($) {
$('.handlediv').remove();
});
</script>
... ve bu CSS:
.postbox .hndle:hover {
cursor:default;
}
Bu kodu meta kutulardan yararlanmak için kullandım, ancak sürükle bırak ve aç / kapat işlevleri olmadan.
.postbox:hover .handlediv { display:none; }
ve .handlediv'i gizlemek için CSS ekleyebilirsin
Asker doğru bir cevap seçmediği sürece bu sorunun cevapsız kaldığını fark ettim.
Jan, Ajabox üzerinden kaydedilen metabox yeniden siparişini durdurmanın çalışan bir örneğini verirken, diğerleri JS ile ilgili önerilerde bulundu.
Bildiğim kadarıyla yapmak istediğiniz tek şey sürüklemeyi devre dışı bırakmak, başka bir şey değil. Bunu yapmak için, öncelikle ajax kaydetme eylemini durdurmak için bir işlev olmak üzere iki şeye ihtiyacınız olacak, ancak ikincisi, JS'nin sayfanın başka herhangi bir yerinde işlevselliği öldürmeden sürükleyip bırakmasını da durdurmanız gerekir. bir gönderi türü veya belirli bir meta kutu.
Jans işlevini ve bazı jQuery kullanarak, postbox betiğinin oluşturduğu diğer işlevleri tamamen öldürmeden bunu yapabiliriz.
Sıralamanın çalışmasını sağlamak için uygun hatların 1'ini kaldırın.
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;
}
Metabox sıralanabilir sınıfını uygulanabilir öğelerden kaldıran çok temel jquery, bu sürüklemeyi önler.
jQuery(document).ready(function($){
$('.meta-box-sortables').removeClass('meta-box-sortables');
});
Gördüğünüz gibi kod eklemek için 1 örnek yazı türünde ekledim, bu durumda kitap. Bununla birlikte, belirli meta kutular için devre dışı bırakma olasılığına sahip olmak istediğinizden bahsettiniz.
Bu, sürüklenmeyi önlemek için verilen meta kutulardan sınıfları kaldırarak, geçiş işlevinin çalışmasını da önlersiniz (yani, metabox başlığı geçiş işlevi).
Yani, yapılabilir ...
İlk olarak, disable_metabox_dragging
işlevi şu şekilde güncellersiniz:
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' ) );
}
Yine, geçerli wp_enqueue_script
hattı açmanız gerektiğine dikkat edin .
Localize çağrısının içindeki dizi, hangi meta kutuların devre dışı bırakılacağını belirleyen şeydir, boş 0 anahtarlı öğe bilerek yerelleştirilir, çünkü localize komut dosyası işlevi dizideki 0 anahtarlı dizini çıkarır.
İkincisi, yukarıdaki ince ayar fonksiyonunda başvurulan yeni JS dosyası.
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');
} );
});
Yapmanız gereken tek şey, gizlemek istediğiniz meta kutuların kimliğini belirlemek ve bunları devre dışı bırakılan meta kutuları ( wp_localize_scipt
çağrıda) ayarlayan diziye aktarmaktır .
Genel olarak, seçerek meta kutuları devre dışı bırakmanın dezavantajları olduğunu düşünmüyorum, WordPress'te sıralanabilir init eylemini yeniden yapılandırmak için sadece destek yok, bu yüzden öğe başına metabox sıralama devre dışı bırakma en iyi ihtimalle hacky olacak (yukarıdaki kodum bunun kanıtı). İdeal olarak, burada ihtiyaç duyulan şey, WordPress'te sıralanabilir init'i bağlamak için bir eylemdir, ancak şu anda postbox javascript'e sabit kodlanmıştır (bu sadece sıralanabilir kurulumdan daha fazlasını yapar).
Her durumda, umarım bu orijinal sorunun ele alınmasına yardımcı olur.
Önceki yanıtların tümüne eklemek için, WordPress'in özel konumlar yüklemesini de önlemek istiyorsanız, aşağıdakileri yapmanız gerekir ( post
herhangi bir yazı türüyle değiştirin ):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Sadece basit yolu buldum, umarım yeni arayıcı buna yardımcı olur. Yönetici enqueue stilinde bir css dosyası ekleyebiliriz varsayarsak, sadece bunu yapmak için css kullanarak ve benim kötü ingilizce için üzgünüm.
.postbox#your-metabox-id .ui-sortable-handle {
pointer-events: none;
}
Umarım yardımcı olur.
$('.postbox .hndle').css('cursor','default');
:::: Re: 2nd edit ekleyerek , öngörülebilir gelecekte Yanıt güncellemeye devam etmek zorunda kalacak: P