Meta kutularının sürüklenmesi devre dışı bırakılsın mı?


17

Meta kutuları yeniden konumlandırılamaması için bu işlevi nasıl devre dışı bırakacağınızı bilen var mı?

Yanıtlar:


13

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!

  1. İlk olarak, bir JavaScript dosyasını sıkın (Bu işlemi yeniden şekillendirmeyeceğim; bu işlemi benden daha iyi tanımlayabilen birçok öğretici var). Bağlandım admin_enqueue_scriptsve iyi çalıştı.
  2. 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!


Tabii ki Q, IMHO için +1 daha az sorunsuz çözüm. Ve ağır ağırlıklar bir sürü ağırlıklı;) :::: Ben sadece herkes için JS kullanıyorum, $('.postbox .hndle').css('cursor','default');:::: Re: 2nd edit ekleyerek , öngörülebilir gelecekte Yanıt güncellemeye devam etmek zorunda kalacak: P
brasofilo

JS'den CSS'yi değiştirmek akıllıca! Bunu cevabıma ekleyeceğim.
Chris Van Patten

Bu kod mevcut WordPress 3.9.1 ile çalışıyor - çok güzel! :)
Philipp

4

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

belirli bir özel gönderi türünde belirli bir meta kutu için sürüklemeyi devre dışı bırakmak istiyorsanız ne olur?
NetConstructor.com

4
Bu çalışıyor ancak yazı durumu gibi diğer işlevleri de devre dışı bırakıyor
fxfuture

Bence evet, ama bunu test etmiyorum. Kolay bir şekilde Yönetici eklentisi ile gizleyebilirsiniz.
38'de bueltge

1
Güzel! Bunu admin_inityalnızca belirli bir gönderi türünde nasıl göndeririz ?
brasofilo

1
ilk başta mükemmel bir çözüm gibi görünüyordu - ama ne yazık ki - bu aynı zamanda kategori / taksonomi eklemek için tüm işlevselliği devre dışı bırakır ...
ptriek

4

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

Teşekkürler Jan - Bunu benim fonksiyonlarıma ekledim. Php ama hiçbir şey yapmıyor mu?
fxfuture

@fxfuture: Aptal ben, check_ajax_refererbir 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.
Jan Fabry

Evet, düzeltmeniz çalışmıyor ... Veya, FireFox ve Chrome bir nedenden ötürü sayfayı önbelleğe alıyor. : /
Zack

3

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

2

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.


@Bueltge cevabına iyi bir katkı (her ikisinin bir kombinasyonunu kullandım) - jQuery bitini atlayabilir .postbox:hover .handlediv { display:none; }ve .handlediv'i gizlemek için CSS ekleyebilirsin
ptriek

0

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.

Tema fonksiyonları dosyası veya eklenti dosyası için PHP Kodu

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

Yukarıda belirtilen Javascript dosyası için jQuery / JS

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_draggingiş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_scripthattı 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.


Not: Bu kod artık WordPress'in (3.9.1) geçerli sürümüyle çalışmıyor
Philipp

0

Ö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 ( postherhangi bir yazı türüyle değiştirin ):

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

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.