Отключить перетаскивание meta полей?

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

17
02.10.2010, 03:23
6 ответов

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

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
4
19.02.2020, 21:57
  • 1
    что относительно того, если Вы просто хотите отключить перетаскивание для определенного метаполя на определенном пользовательском типе сообщения? –  NetConstructor.com 04.10.2010, 11:18
  • 2
    Это работает, но это также отключает другую функциональность как состояние –  fxfuture 06.10.2010, 12:45
  • 3
    , я думаю да, но я не тестирую это. Можно скрыться со сменным Adminimize как простой способ. –  bueltge 07.10.2010, 22:38
  • 4
    Хороший! Как мы диспетчеризировали бы это admin_init только в некотором определенном типе сообщения? –  brasofilo 06.01.2013, 18:15
  • 5
    казался идеальным решением сначала - но увы - это также отключает всю функциональность для добавления категории/таксономии... –  ptriek 12.11.2013, 17:07

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

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');
   }
}
4
19.02.2020, 21:57
  • 1
    Спасибо Jan - я добавил это к своему functions.php, но он ничего не делает? –  fxfuture 06.10.2010, 12:25
  • 2
    @fxfuture: Глупый я, check_ajax_referer действие, не фильтр. Вы должны просто die() там для окончания выполнения сценария, не возвращают что-либо. Я исправлю свой код. –  Jan Fabry 06.10.2010, 13:55
  • 3
    Да, Ваше исправление не работает.. Или, FireFox и Chrome кэшируют страницу по некоторым причинам.:/ –  Zack 02.02.2011, 23:47

Я также добавил бы этот Взлом JavaScript:

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

... и этот CSS:

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

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

2
19.02.2020, 21:57
  • 1
    Хорошее дополнение к ответу @bueltge (я использовал комбинацию обоих) - хотя Вы могли также пропустить jQuery, укусил и добавил .postbox:hover .handlediv { display:none; } в CSS для сокрытия .handlediv –  ptriek 12.11.2013, 11:25

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

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

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

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

Код 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, который удаляет метаполе поддающийся сортировке класс из appliable элементов, это предотвращает перетаскивание.

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 строка.

Массив в локализовать вызове - то, что определяет, какие метаполя отключить, пустые 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');
    } );
});

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

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

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

0
19.02.2020, 21:57
  • 1
    : Этот код не работает больше с текущей версией WordPress (3.9.1) –  Philipp 27.07.2014, 17:37

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

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

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

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

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

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

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

13
19.02.2020, 21:57
  • 1
    +1 изображения меньше стычки бесплатное решение для Q, по моему скромному мнению, конечно. И много тяжеловесов взвесило в ;):::: я использую только JS для всех, добавляя $('.postbox .hndle').css('cursor','default'); :::: Ре: 2-е редактирование, необходимо будет продолжать обновлять Ответ в короткой версии :P –  brasofilo 06.01.2013, 18:27
  • 2
    Управление CSS от JS умно! Я добавлю это к своему ответу. –  Chris Van Patten 11.01.2013, 23:15
  • 3
    Этот код работает с текущим WordPress 3.9.1 - очень хороший! :) –  Philipp 27.07.2014, 17:41

JavaScript Wordpress определяет перемещаемые метаполя их h3 заголовком с классом "hndle". Достаточно просто отключить их конкретно путем ссылки на рассматриваемое метаполе (при создании пользовательских метаполей Вы присвоите ему идентификатор), и запрещающий любые hndle классы путем удаления имени класса или путем переименования его. В моем случае у меня есть несколько типов разделителя, которые я маркировал .hndle h3, но маловероятно, что кто-либо еще сделает вещи этот путь. Так, можно сделать то, что я сделал ниже, или можно использовать .find ('.hndle') .attr ('класс''').... или что-то подобное. Это вошло бы в .js файл, который Вы ставили в очередь в своем functions.php файле (ли это быть в Вашей папке тем или Вашей папке плагинов). Постановку в очередь назвал бы admin_print_scripts, init или безотносительно рычага, который Вы предпочитаете использовать для добавления материала к администраторским страницам.

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

Теги

Похожие вопросы