fxfuture
  • 0
Новичок

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

  • 0

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

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

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

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

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

    • 0
  2. На аналогичный вопрос я ответил предложением разрешить перетаскивание, но отключить сохранение нового заказа на стороне сервера. Это может дать вам больше контроля и быть более перспективным, поскольку 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');
       }
    }
    
    • 0
  3. Самый быстрый способ — деактивировать JS для этой функции. Но я думаю, что лучше, если вы также отмените регистрацию стиля для окна и инициируете пользовательский стиль без эффектов для мыши и значка открытия/закрытия на мета-полях.

    function fb_remove_postbox() {
        wp_deregister_script('postbox');
    }
    add_action( 'admin_init', 'fb_remove_postbox' );
    
    • 0
  4. Javascript wordpress идентифицирует перетаскиваемые метабоксы по их заголовку 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");
    });
    
    • 0
  5. Я бы также добавил этот Javascript Hack:

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

    … и этот CSS:

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

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

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

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

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

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

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

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

    Используя функцию Jans и немного 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, который удаляет сортируемый класс метабокса из применимых элементов, это предотвращает перетаскивание.

    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 вызове).

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

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

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

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

Оставить ответ

You must login to add an answer.