Ответы:
У меня была такая же проблема, и Google привел меня сюда. К сожалению, ни один из этих ответов не помог, но я в конце концов понял ответ, и это довольно просто!
admin_enqueue_scripts
, и все работало нормально.Отключите функцию сортировки, поместив это в этот файл JavaScript:
jQuery(document).ready( function($) {
$('.meta-box-sortables').sortable({
disabled: true
});
$('.postbox .hndle').css('cursor', 'pointer');
});
По сути, это просто отключает jQuery UI Sortable , который поддерживает функцию перетаскивания метабокса ( postbox.dev.js: 64 ). Это также переключает курсор на METABOX ручку стандартного указателя мыши вместо перемещения курсора (идея любезно brasofilo ниже).
Надеюсь это поможет!
Изменить: Я должен добавить, что, вероятно, стоит следовать некоторым другим советам здесь и отключить сохранение порядка метабокса. Это предотвратит путаницу в случае непредвиденного повторного включения чего-либо.
Второе редактирование: в интересах будущих поколений (и будущих поисковиков Google) это исправление было протестировано на WordPress 3.3.1. Я не могу говорить с другими версиями!
Самый быстрый способ - отключить JS для этой функции. Но я думаю, будет лучше, если вы также отмените регистрацию стиля для поля и начнете настраивать собственный стиль без эффектов для мыши и значка открытия / закрытия в мета-блоках.
function fb_remove_postbox() {
wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
admin_init
только в какой-то конкретный тип сообщения?
Я ответил на аналогичный вопрос с предложением разрешить перетаскивание, но отключить сохранение нового заказа на стороне сервера. Это может дать вам больше контроля и быть более ориентированным на будущее, поскольку 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');
}
}
check_ajax_referer
это действие, а не фильтр. Вы должны просто die()
завершить выполнение скрипта, а не возвращать ничего. Я исправлю свой код.
WordPress Javascript идентифицирует перетаскиваемые метабоксы по заголовку h3 с классом «hndle». Достаточно просто отключить их, ссылаясь на рассматриваемый метабокс (если вы создаете собственные метабоксы, вам будет назначен его идентификатор) и отключаете любые классы hndle, удаляя имя класса или переименовывая его. В моем случае у меня есть несколько типов разделителей, которые я пометил с помощью .hndle h3, но вряд ли кто-то еще поступил бы так. Таким образом, вы можете сделать то, что я сделал ниже, или вы можете использовать .find ('. Hndle'). Attr ('class', '') .... или что-то подобное. Это будет в файле .js, который вы поставили в очередь в вашем файле functions.php (будь то в папке тем или папки плагинов). Постановка в очередь будет вызвана admin_print_scripts,
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:hover .handlediv { display:none; }
CSS, чтобы скрыть .handlediv
Я заметил, что этот вопрос остается без ответа, поскольку спрашивающий не выбирает правильный ответ.
Ян привел рабочий пример остановки переупорядочения метабокса, сохраняемого через Ajax, в то время как другие дали предложения, касающиеся JS.
Насколько я понимаю, все, что вы хотите сделать, это отключить перетаскивание, не более того. Для этого вам понадобятся две вещи, во-первых, функция для перехвата действия сохранения ajax, а во-вторых, вам также нужно остановить перетаскивание JS без потери функциональности где-либо еще на странице, а также сделать это выборочно для тип сообщения или определенный метабокс.
Используя функцию Jans и некоторые jQuery, мы можем сделать это без полного уничтожения других функций, создаваемых сценарием почтового ящика, например ...
Раскомментируйте 1 из соответствующих строк, чтобы заставить enqueue работать.
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, который удаляет сортируемый класс metabox из применимых элементов, это предотвращает перетаскивание.
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 определяет, какие метабоксы отключить, пустой элемент с ключом 0 существует специально, потому что функция скрипта локализации удаляет все индексы с 0 ключами в массиве.
Во-вторых, новый файл JS, на который есть ссылка в приведенной выше функции настройки очереди.
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');
} );
});
Единственное, что вам нужно сделать, это определить ID для метабоксов, которые вы хотите скрыть, и передать их в массив, который устанавливает отключенные метабоксы (в wp_localize_scipt
вызове).
В целом, я не думаю, что выборочное отключение метабоксов лишено недостатков, просто нет поддержки для переконфигурирования сортируемого действия init в WordPress, поэтому отключение сортировки метабоксов для каждого элемента будет в лучшем случае хакерским (мой код выше доказательство тому). В идеале, здесь нужно действие в WordPress для подключения сортируемого инициата, но в настоящее время он жестко запрограммирован в javascript почтового ящика (который делает больше, чем просто настройка сортируемого).
В любом случае, я надеюсь, что это помогло решить первоначальный вопрос.
Чтобы добавить ко всем предыдущим ответам, если вы также хотите запретить WordPress загружать пользовательские позиции, нужно выполнить следующее (замените post
на любой тип записи):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Просто нашел простой способ, надеюсь, новый искатель поможет с этим. Предполагая, что вы можете добавить файл CSS в стиле администратора, я использую только CSS для этого и извините за мой плохой английский.
.postbox#your-metabox-id .ui-sortable-handle {
pointer-events: none;
}
Надеюсь, это поможет.
$('.postbox .hndle').css('cursor','default');
:::: Re: 2-е редактирование , вам придется постоянно обновлять Ответ в обозримом будущем: P