Wyłączyć przeciąganie metatoksów?

17

Czy ktoś wie, jak wyłączyć tę funkcję, aby nie można było zmienić położenia metaboksów?

fxfuture
źródło

Odpowiedzi:

13

Miałem ten sam problem i Google zaprowadził mnie tutaj. Niestety żadna z tych odpowiedzi nie pomogła, ale w końcu wymyśliłem odpowiedź i to całkiem proste!

  1. Najpierw umieść w kolejce plik JavaScript (nie powtórzę tego procesu; istnieje wiele samouczków, które lepiej opisują ten proces niż ja). Połączyłem się admin_enqueue_scriptsi działało dobrze.
  2. Wyłącz funkcję sortowania, umieszczając to w tym pliku JavaScript:

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

Zasadniczo wyłącza to jQuery UI Sortable , który zasila funkcję przeciągania metaboksu ( postbox.dev.js: 64 ). Spowoduje to również przełączenie kursora na uchwycie metaboksu na standardowy wskaźnik myszy zamiast kursora ruchu (pomysł dzięki uprzejmości brasofilo poniżej).

Mam nadzieję że to pomoże!

Edycja: Powinienem dodać, że prawdopodobnie warto zastosować się do kilku innych porad tutaj i wyłączyć zapisywanie zamówienia metabox. Pozwoli to uniknąć nieporozumień związanych z przypadkowym ponownym włączeniem.

Druga edycja: z myślą o przyszłych pokoleniach (i przyszłych wyszukiwarkach Google) ta poprawka została przetestowana na WordPress 3.3.1. Nie mogę rozmawiać z innymi wersjami!

Chris Van Patten
źródło
+1 mniej bezproblemowe rozwiązanie dla Q, IMHO oczywiście. I dużo ważonych wag;) :::: Używam tylko JS dla wszystkich, dodając $('.postbox .hndle').css('cursor','default');:::: Re: 2. edycja , będziesz musiał aktualizować Odpowiedź w dającej się przewidzieć przyszłości: P
brasofilo,
Manipulowanie CSS z JS jest sprytne! Dodam to do mojej odpowiedzi.
Chris Van Patten,
Ten kod działa z obecnym WordPress 3.9.1 - bardzo fajnie! :)
Philipp
4

Najszybszym sposobem jest wyłączenie JS dla tej funkcji. Ale myślę, że lepiej jest wyrejestrować styl pudełka i zainicjować styl niestandardowy bez efektów dla myszy i ikony otwierania / zamykania na meta boxach.

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
bueltge
źródło
co jeśli chcesz po prostu wyłączyć przeciąganie dla określonego metaboksu dla określonego niestandardowego typu postu?
NetConstructor.com,
4
To działa, ale wyłącza także inne funkcje, takie jak status postu
fxfuture
Myślę, że tak, ale nie testuję tego. Możesz ukryć się za pomocą wtyczki Administruj jako łatwy sposób.
bueltge
1
Niezłe! Jak wysłalibyśmy to admin_inittylko w niektórych określonych typach postów?
brasofilo
1
wydawało się idealne rozwiązanie na pierwszy - ale niestety - to wyłącza również wszystkie funkcje dodawania kategorii / taksonomii ...
ptriek
4

I odpowiedział na podobne pytanie z sugestią, aby umożliwić przeciągnięcie, ale wyłączenie zapisywania nowego porządku po stronie serwera. Może to dać większą kontrolę i być bardziej przyszłościowym, ponieważ JavaScript może się szybko zmieniać, ale protokół komunikacji z serwerem może pozostać bardziej niezawodny. Ten przykład wyłącza wszystkie przeciąganie, ale możesz go rozwinąć, aby sprawdzić określone pole lub meta stronę.

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
źródło
Dzięki, Jan - dodałem to do mojego functions.php, ale to nic nie robi?
fxfuture
@fxfuture: Silly me, check_ajax_refererto akcja, a nie filtr. Powinieneś die()tam po prostu zakończyć wykonywanie skryptu, a nie zwracać niczego. Naprawię mój kod.
Jan Fabry
Tak, twoja korekta nie działa ... Lub, FireFox i Chrome z jakiegoś powodu buforują stronę. : /
Zack
3

Wordpress javascript identyfikuje przeciągalne metaboksy według tytułu h3 z klasą „hndle”. Wystarczy je wyłączyć, odwołując się do danego metaboksu (jeśli tworzysz niestandardowe metaboksy, przypisałeś mu identyfikator) i wyłączasz dowolne klasy hndle, usuwając nazwę klasy lub zmieniając jej nazwę. W moim przypadku mam kilka typów separatorów, które oznaczyłem za pomocą .hndle h3, ale jest mało prawdopodobne, aby ktokolwiek zrobił to w ten sposób. Możesz więc zrobić to, co zrobiłem poniżej, lub użyć .find ('. Hndle'). Attr ('class', '') .... lub coś podobnego. Byłoby to w pliku .js, który zapisałeś w kolejce w pliku functions.php (niezależnie od tego, czy znajduje się on w folderze motywów, czy w folderze wtyczek). Kolejkowanie byłoby wywoływane przez admin_print_scripts,

jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
Aryan Duntley
źródło
2

Dodałbym również ten JavaScript Hack:

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

... i ten CSS:

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

Użyłem tego kodu, aby skorzystać z metatoksów, ale bez funkcji przeciągania i upuszczania oraz funkcji otwierania / zamykania.

Maxime
źródło
Dobry dodatek do odpowiedzi @bueltge (użyłem kombinacji obu) - chociaż możesz również pominąć bit jQuery i dodać .postbox:hover .handlediv { display:none; }CSS, aby ukryć plik .handlediv
ptriek
0

Zauważyłem, że to pytanie pozostało bez odpowiedzi, o ile pytający nie wybrał poprawnej odpowiedzi.

Jan podał praktyczny przykład zatrzymania zapisywania ponownego zamawiania metaboksu nad Ajaxem, podczas gdy inni podali sugestie dotyczące JS.

O ile rozumiem, wszystko, co chcesz zrobić, to wyłączyć przeciąganie, nic więcej. Aby to zrobić, potrzebujesz dwóch rzeczy, po pierwsze funkcji przechwytującej akcję oszczędzania ajax, ale po drugie, musisz także zatrzymać przeciąganie i upuszczanie JS bez zabijania funkcji gdziekolwiek indziej na stronie, jednocześnie wykonując to wybiórczo dla typ postu lub określony metaboks.

Korzystając z funkcji Jans i niektórych jQuery, możemy to zrobić bez całkowitego niszczenia innych funkcji tworzonych przez skrypt skrzynki pocztowej, tak jak w przypadku

Kod PHP pliku funkcji motywu lub pliku wtyczki

Odkomentuj 1 z odpowiednich wierszy, aby kolejka działała.

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 dla pliku JavaScript, o którym mowa powyżej

Bardzo podstawowa jquery, która usuwa sortowalną klasę metabox z możliwych do zastosowania elementów, zapobiega to przeciąganiu.

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

Jak widać dodałem w 1 przykładowym typie wpisu, aby dodać kod, zarezerwuj w tym przypadku. Jednak wspomniałeś, że chcesz mieć również możliwość wyłączenia go dla określonych metaboksów.

Można to zrobić, istnieje tylko kilka małych efektów ubocznych, jednym z nich jest to, że usuwając klasy z danych metaboksów, aby zapobiec przeciąganiu, uniemożliwiasz również działanie funkcji przełączania (tj. Funkcji przełączania tytułu metaboksu).

To powiedziawszy, można to zrobić ...

Najpierw zaktualizujesz disable_metabox_draggingfunkcję do ...

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

Ponownie, zauważając, że musisz odkomentować odpowiednią wp_enqueue_scriptlinię.

Tablica wewnątrz wywołania lokalizacji określa, które metaboksy mają zostać wyłączone, pusty element z kluczem 0 jest tam celowo, ponieważ funkcja skryptu lokalizacji usuwa wszystkie indeksy z kluczem 0 w tablicy.

Po drugie, nowy plik JS, do którego odwołuje się powyższa poprawiona funkcja kolejkowania.

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

Jedyne, co musisz zrobić, to określić identyfikator metaboksów, które chcesz ukryć, i przekazać je do tablicy, która ustawia wyłączone metaboksy (w wp_localize_sciptwywołaniu).

Ogólnie rzecz biorąc, nie sądzę, aby selektywne wyłączanie metaboksów było pozbawione wad, po prostu nie ma wsparcia w ponownej konfiguracji sortowalnej akcji init w WordPress, więc wyłączenie sortowania metaboksów na podstawie poszczególnych elementów będzie w najlepszym przypadku hakujące (mój kod powyżej to dowód na to). Idealnie, tutaj potrzebna jest akcja w WordPress, aby podpiąć sortowalny init, ale obecnie jest on zakodowany na stałe w javascript skrzynki pocztowej (która robi więcej niż tylko konfigurację sortowalną).

W każdym razie mam nadzieję, że pomogło to rozwiązać pierwotne pytanie.

t31os
źródło
Uwaga: ten kod nie działa już w bieżącej wersji WordPress (3.9.1)
Philipp
0

Aby dodać do wszystkich poprzednich odpowiedzi, jeśli chcesz również uniemożliwić WordPressowi ładowanie niestandardowych pozycji, następujące czynności powinny załatwić sprawę (zastąp postdowolnym postem):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Matthew Boynes
źródło
0

Właśnie znalazłem prosty sposób, mam nadzieję, że nowy poszukiwacz pomógłby w tym. Zakładając, że możesz dodać plik css w stylu kolejki administratora, używam tylko css, aby to zrobić i przepraszam za mój zły angielski.

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

Mam nadzieję, że to pomoże.

Rahendra Putra K.
źródło