Desativar o arrastamento de caixas meta?

16

Alguém sabe como desativar essa funcionalidade para que as caixas meta não possam ser reposicionadas?

    
por fxfuture 02.10.2010 / 00:43

8 respostas

12

Eu tive o mesmo problema e o Google me conduziu até aqui. Infelizmente nenhuma dessas respostas ajudou, mas finalmente descobri a resposta, e é bem fácil!

  1. Primeiro, enfileire um arquivo JavaScript (não vou refazer este processo; há muitos tutoriais que podem descrever esse processo melhor do que eu). Eu fiquei viciada em admin_enqueue_scripts e funcionou bem.
  2. Desative a funcionalidade de classificação colocando isso no arquivo JavaScript:

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

Essencialmente, apenas desativa o jQuery UI Sortable , que aciona a funcionalidade de arrastar o metabox (postbox.dev.js:64 ). Isso também muda o cursor do identificador de metabox para um ponteiro de mouse padrão em vez de um cursor de movimento (idéia cortesia de brasofilo abaixo).

Espero que isso ajude!

Editar: Devo acrescentar que provavelmente vale a pena seguir alguns dos outros conselhos aqui e desativar o salvamento da ordem metabox. Isso evitará a confusão sobre a chance de que algo seja reabilitado por engano.

Segunda edição: Para o benefício das gerações futuras (e futuros pesquisadores do Google), essa correção foi testada no WordPress 3.3.1. Eu não posso falar com outras versões!

    
por Chris Van Patten 06.03.2012 / 01:41
4

O caminho mais rápido é desativar o JS para esta função. Mas eu acho que é melhor quando você também desregistra o estilo da caixa e inicia um estilo personalizado sem os efeitos para o mouse e o ícone abrir / fechar nas caixas meta.

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
    
por bueltge 02.10.2010 / 21:01
4

Eu respondi a uma pergunta semelhante com a sugestão para permitir arrastar, mas desabilite o salvamento do novo pedido no lado do servidor. Isso pode lhe dar mais controle e ser mais à prova do futuro, pois o JavaScript pode mudar rapidamente, mas o protocolo para se comunicar com o servidor pode ficar mais robusto. Este exemplo desativa todos os arrastos, mas você pode expandi-lo para verificar sua caixa ou meta page específica.

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');
   }
}
    
por Jan Fabry 04.10.2010 / 11:44
3

O javascript do wordpress identifica os metaboxes arrastáveis pelo seu título h3 com uma classe de "hndle". É simples o suficiente para desativá-los especificamente referenciando o metabox em questão (se você estiver criando metaboxes customizados, você terá designado um identificador) e desabilitando quaisquer classes de hndle removendo o nome da classe ou renomeando-o. No meu caso, eu tenho vários tipos de separadores que rotulei com .hndle h3, mas é improvável que alguém tenha feito as coisas dessa maneira. Então, você pode fazer o que eu fiz abaixo, ou você pode usar o .find ('.hndle'). Attr ('class', '') .... ou algo similar. Isso iria para um arquivo .js que você enfileirou no arquivo functions.php (seja na pasta de temas ou na pasta de plugins). O enfileiramento seria chamado por um admin_print_scripts, init ou qualquer gancho que você preferir usar para adicionar itens às suas páginas de administração.

jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
    
por Aryan Duntley 12.03.2013 / 16:31
2

Eu também adicionaria este Hack de Javascript:

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

... e este CSS:

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

Eu usei esse código para aproveitar as caixas meta, mas sem as funções de arrastar e soltar e abrir / fechar.

    
por Maxime 02.08.2011 / 21:34
0

Percebi que esta questão permanece sem resposta, na medida em que o consulente não seleciona uma resposta correta.

Jan deu um exemplo de trabalho de parar o reordenamento do metabox sendo salvo no Ajax, enquanto outros deram sugestões relacionadas ao JS.

Tanto quanto eu entendo tudo o que você quer fazer é desativar o arrastar, nada mais. Para fazer isso, você precisará de duas coisas, primeiro uma função para interceptar a ação de salvamento do ajax, mas, em segundo lugar, também precisa parar o JS arrastando e soltando sem matar a funcionalidade em qualquer outro lugar da página, sendo também seletiva para um tipo de post ou metabox particular.

Usando a função Jans e alguns jQuery, podemos fazer isso sem matar totalmente outras funcionalidades que o script de caixa de correio cria, assim.

Código PHP para arquivo de funções de tema ou arquivo de plug-in

Remova o comentário 1 das linhas apropriadas para fazer o enfileiramento funcionar.

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 para o arquivo Javascript mencionado acima

Jquery muito básica que remove a classe classificável do metabox dos elementos appliable, isso evita o arrastamento.

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

Como você pode ver, eu adicionei 1 exemplo de tipo de postagem para adicionar o código, reserve neste caso. No entanto, você mencionou querer também ter a possibilidade de desativá-lo para metaboxes específicos.

Isso pode ser feito, há apenas alguns pequenos efeitos colaterais sendo que, removendo as classes de determinados metaboxes para evitar o arrastamento, você também impede que a função de alternância funcione (ou seja, a funcionalidade de alternância de títulos do metabox).

Dito isto, isso pode ser feito ...

Primeiro, você atualizaria a função disable_metabox_dragging para ..

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

Novamente, observe que você precisa descomentar a linha wp_enqueue_script aplicável.

O array dentro da chamada de localização é o que determina quais metaboxes serão desabilitados, o item 0 vazio está lá propositalmente porque a função de script de localização remove qualquer índice com chave 0 no array.

Em segundo lugar, o novo arquivo JS referenciado na função de enfileiramento tweaked acima.

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

A única coisa que você precisa fazer é determinar o ID dos metaboxes que deseja ocultar e passá-los para a matriz que define os metaboxes desativados (na chamada wp_localize_scipt ).

No geral, eu não acho que a desativação seletiva de metaboxes tenha poucas desvantagens, simplesmente não há suporte para reconfigurar a ação de inicialização classificável no WordPress, portanto, desabilitar a classificação do metabox em uma base por elemento será, na melhor das hipóteses, hacky código acima é uma prova disso). Idealmente, o que é necessário aqui é uma ação no WordPress para ligar o init ordenável, mas que atualmente está codificado no javascript postbox (que faz mais do que apenas configurar ordenável).

De qualquer forma, espero que isso ajude a resolver a questão original.

    
por t31os 03.08.2011 / 17:11
0

Para adicionar a todas as respostas anteriores, se você também quiser evitar que o WordPress carregue posições personalizadas, o seguinte deve ser feito (substitua post por qualquer tipo de postagem):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
    
por Matthew Boynes 23.03.2016 / 21:10
0

Apenas encontrei o caminho mais simples, espero que o novo buscador tenha ajudado com isso. Supondo que você poderia adicionar um arquivo css no estilo de enfileiramento do administrador, eu só uso o css para fazer isso e desculpe pelo meu inglês ruim.

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

Espero que ajude.

    
por Rahendra Putra K 06.10.2018 / 13:43