Odpowiedzi:
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!
admin_enqueue_scripts
i działało dobrze.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!
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' );
admin_init
tylko w niektórych określonych typach postów?
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');
}
}
check_ajax_referer
to akcja, a nie filtr. Powinieneś die()
tam po prostu zakończyć wykonywanie skryptu, a nie zwracać niczego. Naprawię mój kod.
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");
});
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.
.postbox:hover .handlediv { display:none; }
CSS, aby ukryć plik .handlediv
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
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;
}
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_dragging
funkcję 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_script
linię.
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_scipt
wywoł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.
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 post
dowolnym postem):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
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.
$('.postbox .hndle').css('cursor','default');
:::: Re: 2. edycja , będziesz musiał aktualizować Odpowiedź w dającej się przewidzieć przyszłości: P