Отключить перетаскивание мета-ящиков?

Кто-нибудь знает, как отключить эту функцию, чтобы мета-поля не могли быть перемещены?

Solutions Collecting From Web of "Отключить перетаскивание мета-ящиков?"

У меня была та же проблема, и Google привел меня сюда. К сожалению, ни один из этих ответов не помог, но я в конечном итоге понял ответ, и это довольно просто!

  1. Во-первых, вставьте файл JavaScript (я не буду перефразировать этот процесс, есть много учебников, которые могут описывать этот процесс лучше, чем я). Я подключился к admin_enqueue_scripts , и он работал нормально.
  2. Отключите функцию сортировки, поместив ее в этот файл JavaScript:

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

По сути, это просто отключает JQuery UI Sortable , который обеспечивает функциональность перетаскивания метабокса ( postbox.dev.js: 64 ). Это также переключает курсор на дескриптор метабокса на стандартный указатель мыши вместо курсора перемещения (идея любезно предоставлена брасофило ниже).

Надеюсь это поможет!

Изменить: я должен добавить, что, вероятно, стоит воспользоваться некоторыми другими советами здесь и отключить сохранение заказа на обмен. Это предотвратит путаницу в непредвиденном случае, и что-то по ошибке будет повторно включено.

Второе редактирование: в интересах будущих поколений (и будущих поисковиков Google) это исправление было протестировано в WordPress 3.3.1. Я не могу говорить с другими версиями!

Самый быстрый способ – отключить JS для этой функции. Но я думаю, что лучше, когда вы также отмените стиль для окна и запустите собственный стиль без эффектов для мыши и значка «Открыть / закрыть» в мета-боксах.

 function fb_remove_postbox() { wp_deregister_script('postbox'); } add_action( 'admin_init', 'fb_remove_postbox' ); 

Я ответил на аналогичный вопрос с предложением разрешить перетаскивание, но отключить сохранение нового порядка на стороне сервера. Это может дать вам больше контроля и быть более надежным, поскольку JavaScript может быстро измениться, но протокол для связи с сервером может оставаться более надежным. В этом примере отключено все перетаскивание, но вы можете развернуть его, чтобы проверить конкретную область или мета-страницу.

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

WordPress javascript идентифицирует перетаскиваемые обмены по заголовку h3 с классом «хендл». Достаточно просто их отключить, ссылаясь на рассматриваемый метабокс (если вы создаете настраиваемые обмены, вы назначили ему идентификатор) и отключите любые классы hndle, удалив имя класса или переименовав его. В моем случае у меня есть несколько типов разделителей, которые я обозначил с помощью .hdle h3, но вряд ли кто-то еще это сделает. Итак, вы можете делать то, что я сделал ниже, или вы можете использовать .find ('. Hndle'). Attr ('class', '') …. или что-то подобное. Это пойдет в файле .js, который вы указали в файле functions.php (будь то в папке тем или в папке ваших плагинов). Очередь будет вызываться с помощью admin_print_scripts, init или любого другого, что вы предпочитаете использовать для добавления материалов на страницы администратора.

 jQuery("#MY_METABOX_ID h3.hndle").each(function(e){ jQuery(this).attr("class", "hndlle"); }); 

Я бы также добавил этот Javascript Hack:

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

… и этот CSS:

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

Я использовал этот код, чтобы использовать мета-поля, но без функций перетаскивания и открытия / закрытия.

Я заметил, что этот вопрос остался без ответа, поскольку он не выбрал правильный ответ.

Ян дал рабочий пример остановки переупорядочения метабокса, который был сохранен над Ajax, в то время как другие дали предложения, касающиеся JS.

Насколько я понимаю, все, что вы хотите сделать, это отключить перетаскивание, не более того. Для этого вам понадобятся две вещи: во-первых, функция перехвата действия ajax save, но во-вторых, вам также необходимо остановить перетаскивание и удаление JS, не убивая функциональность нигде на странице, в то же время делая это выборочно для тип сообщения или конкретный метаболизм.

Используя Jans-функцию и некоторый jQuery, мы можем сделать это без полного уничтожения других функций, создаваемых сценарием postbox.

PHP-код для файла функций темы или файла плагина

Раскомментируйте 1 из соответствующих строк, чтобы сделать работу в очереди.

 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 для файла Javascript, указанного в приведенном выше

Очень простой jquery, который удаляет класс сортировки метабокса из управляемых элементов, что предотвращает перетаскивание.

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

Как вы можете видеть, я добавил в 1 пример типа сообщения, чтобы добавить код, закажите в этом случае. Однако вы упомянули о желании также иметь возможность отключить его для определенных метаболитов.

Это может быть сделано, есть лишь несколько небольших побочных эффектов, один из которых заключается в том, что, удаляя классы из данных обменов, чтобы предотвратить перетаскивание, вы также предотвращаете работу функции переключения (т. Е. Функции переключения заголовка метабокса).

Тем не менее, это можно сделать …

Во-первых, вы должны обновить функцию disable_metabox_dragging .

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

Опять же, отметив, что вам нужно раскомментировать применимую строку wp_enqueue_script .

Массив внутри вызова локализации определяет, какие метабоксы отключить, пустой элемент с нулевым значением имеет намеренно, потому что функция localize script блокирует любые индексы с ключом 0 в массиве.

Во-вторых, новый JS-файл, указанный в приведенной выше функции enqueue tweaked.

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

Единственное, что вам нужно сделать, это определить идентификатор для обменных ящиков, которые вы хотите скрыть, и передать их в массив, который устанавливает отключенные обмены (в вызове wp_localize_scipt ).

В целом я не думаю, что выборочное отключение метабокса не имеет недостатков, просто нет поддержки для повторной настройки сортируемого действия init в WordPress, поэтому отключение сортировки метабокса на основе каждого элемента будет в лучшем случае вредным (мой код выше доказательство этого). В идеале, здесь требуется действие в WordPress для захвата сортируемого init, но в настоящее время он жестко закодирован в javascript почтового ящика (который делает больше, чем просто сортировать сортировку).

В любом случае, я надеюсь, что это помогло решить первоначальный вопрос.

Чтобы добавить ко всем предыдущим ответам, если вы также хотите, чтобы WordPress не загружал пользовательские позиции, следующее должно выполнить трюк (заменить post любым типом сообщения):

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