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

17

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

fxfuture
источник

Ответы:

13

У меня была такая же проблема, и 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 ). Это также переключает курсор на METABOX ручку стандартного указателя мыши вместо перемещения курсора (идея любезно brasofilo ниже).

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

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

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

Крис Ван Паттен
источник
+1 менее беспроблемное бесплатное решение для Q, ИМХО конечно. И много тяжеловесов, взвешенных;) :::: Я использую только JS для всех, добавив $('.postbox .hndle').css('cursor','default');:::: Re: 2-е редактирование , вам придется постоянно обновлять Ответ в обозримом будущем: P
brasofilo
Управлять CSS из JS - это умно! Я добавлю это к моему ответу.
Крис Ван Паттен
Этот код работает с текущей версией WordPress 3.9.1 - очень приятно! :)
Филипп
4

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

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
bueltge
источник
а что если вы просто хотите отключить перетаскивание для определенного метабокса на определенный пользовательский тип записи?
NetConstructor.com
4
Это работает, но также отключает другие функции, такие как статус сообщения
fxfuture
Я думаю да, но я не проверяю это. Вы можете скрыть с плагином Администрирование как простой способ.
Bueltge
1
Хороший! Как бы мы отправили это admin_initтолько в какой-то конкретный тип сообщения?
brasofilo
1
сначала казалось идеальным решением - но увы - это также отключает все функциональные возможности для добавления категории / таксономии ...
ptriek
4

Я ответил на аналогичный вопрос с предложением разрешить перетаскивание, но отключить сохранение нового заказа на стороне сервера. Это может дать вам больше контроля и быть более ориентированным на будущее, поскольку 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');
   }
}
Ян Фабри
источник
Спасибо, Ян. Я добавил это в мои functions.php, но это ничего не делает?
fxfuture
@fxfuture: Глупый я, check_ajax_refererэто действие, а не фильтр. Вы должны просто die()завершить выполнение скрипта, а не возвращать ничего. Я исправлю свой код.
Ян Фабри
Да, ваша коррекция не работает .. Или FireFox и Chrome почему-то кэшируют страницу. : /
Зак
3

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");
});
Арий дантли
источник
2

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

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

... и этот CSS:

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

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

Maxime
источник
Хорошее дополнение к ответу @bueltge (я использовал комбинацию обоих) - хотя вы также можете пропустить бит jQuery и добавить .postbox:hover .handlediv { display:none; }CSS, чтобы скрыть .handlediv
ptriek
0

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

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

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

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

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

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

Очень простой 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 почтового ящика (который делает больше, чем просто настройка сортируемого).

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

t31os
источник
Примечание. Этот код больше не работает с текущей версией WordPress (3.9.1)
Филипп,
0

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

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Мэтью Бойнс
источник
0

Просто нашел простой способ, надеюсь, новый искатель поможет с этим. Предполагая, что вы можете добавить файл CSS в стиле администратора, я использую только CSS для этого и извините за мой плохой английский.

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

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

Рахендра Путра К
источник