Desativar arrastar caixas de meta?

17

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

fxfuture
fonte

Respostas:

13

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

  1. Primeiro, enfileire um arquivo JavaScript (não refiz o processo novamente; há muitos tutoriais que podem descrever esse processo melhor do que eu). Eu liguei admin_enqueue_scriptse 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');
    });
    

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

Espero que isto ajude!

Editar: devo acrescentar que provavelmente vale a pena seguir alguns dos outros conselhos aqui e desativar a gravação da ordem metabox. Isso evitará confusão na possibilidade de algo ser reativado 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. Não posso falar com outras versões!

Chris Van Patten
fonte
+1 solução sem complicações para o Q, IMHO, é claro. E muitos pesos pesados ​​ponderados;) :::: Estou usando apenas o JS para todos, adicionando $('.postbox .hndle').css('cursor','default');:::: Re: 2ª edição , você precisará atualizar a Resposta no futuro próximo: P
brasofilo 06/01
Manipular o CSS do JS é inteligente! Vou acrescentar isso à minha resposta.
Chris Van Patten
Este código está funcionando com o WordPress 3.9.1 atual - muito bom! :)
Philipp
4

A maneira mais rápida é desativar o JS para esta função. Mas acho que é melhor quando você também cancela o registro do estilo da caixa e inicia um estilo personalizado sem os efeitos para o mouse e o ícone de abrir / fechar nas meta boxes.

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
bueltge
fonte
e se você quiser apenas desativar a arrastar para uma metabox específica em um tipo de postagem personalizado específico?
NetConstructor.com
4
Isso funciona, mas ele também desabilita outras funcionalidades como o status pós
fxfuture
Acho que sim, mas não testei isso. Você pode se esconder com o plugin Adminimize como uma maneira fácil.
bueltge
1
Agradável! Como enviaríamos isso admin_initapenas em algum tipo de postagem específico?
brasofilo
1
parecia uma solução perfeita em primeiro lugar - mas, infelizmente - isso também desactiva todas as funcionalidades para a adição de categoria / taxonomia ...
ptriek
4

Eu respondi uma pergunta semelhante com a sugestão para permitir arrastando, mas desativar salvar a nova ordem no lado do servidor. Isso pode lhe dar mais controle e ser mais à prova de futuro, pois o JavaScript pode mudar rapidamente, mas o protocolo para se comunicar com o servidor pode permanecer mais robusto. Este exemplo desabilita todos os arrastamentos, mas você pode expandi-lo para verificar sua caixa específica ou página 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');
   }
}
Jan Fabry
fonte
Obrigado Jan - Eu adicionei isso ao meu functions.php, mas ele não faz nada?
Fxfuture 6/10/10
@fxfuture: Silly me, check_ajax_refereré uma ação, não um filtro. Você deve die()chegar lá para finalizar a execução do script, e não retornar nada. Eu vou consertar meu código.
Jan Fabry
Sim, sua correção não funciona. Ou, o FireFox e o Chrome estão armazenando em cache a página por algum motivo. : /
Zack
3

O javascript wordpress identifica os metaboxes arrastáveis ​​pelo título h3 com uma classe de "hndle". É simples o suficiente para desabilitá-las especificamente, referenciando a metabox em questão (se você estiver criando metaboxes personalizadas, você terá atribuído um identificador) e desativando todas as classes hndle removendo o nome da classe ou renomeando-o. No meu caso, tenho vários tipos de separadores que rotulei com .hndle h3, mas é improvável que mais alguém tenha feito as coisas dessa maneira. Então, você pode fazer o que fiz abaixo ou usar .find ('. Hndle'). Attr ('class', '') ... ou algo semelhante. Isso incluiria um arquivo .js que você enfileirou no arquivo functions.php (seja na pasta de temas ou na pasta de plug-ins). O enfileiramento seria chamado por um admin_print_scripts,

jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
Aryan Duntley
fonte
2

Eu também adicionaria este Javascript Hack:

<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 tirar proveito das meta boxes, mas sem as funções de arrastar e soltar e de abrir / fechar.

Maxime
fonte
Boa adição a resposta @bueltge (i usou uma combinação de ambos) - embora você também pode pular o jQuery mordeu, e adicionar .postbox:hover .handlediv { display:none; }em CSS para esconder a .handlediv
ptriek
0

Percebi que essa pergunta permanece sem resposta, na medida em que o solicitante não selecionou uma resposta correta.

Jan deu um exemplo de como impedir que a reorganização da metabox fosse salva no Ajax, enquanto outros deram sugestões relacionadas ao JS.

Tanto quanto eu entendo tudo o que você quer fazer é desativar o arrasto, 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 é necessário parar o arrastar e soltar do JS sem eliminar a funcionalidade em qualquer outro lugar da página, além de fazê-lo seletivamente. um tipo de postagem ou metabox específico.

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

Código PHP para arquivo de funções do 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ásico que remove a classe classificável da metabox de elementos aplicáveis, isso evita o arrastamento.

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

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

Isso pode ser feito, existem apenas alguns pequenos efeitos colaterais, sendo que, ao remover as classes de metaboxes especificadas para evitar arrastar, você também impede que a função de alternância funcione (ou seja, a funcionalidade de alternância do título da metabox).

Dito isto, isso pode ser feito ...

Primeiro, você atualiza a disable_metabox_draggingfunção 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, observando que você precisa descomentar a wp_enqueue_scriptlinha aplicável .

A matriz dentro da chamada de localização é o que determina quais metaboxes devem ser desabilitados; o item com chave 0 vazio existe propositalmente porque a função de script de localização remove todos os índices com chave 0 da matriz.

Segundo, o novo arquivo JS mencionado na função de enfileiramento aprimorada 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 você deseja ocultar e passá-los para a matriz que define os metaboxes desativados (na wp_localize_sciptchamada).

No geral, eu não acho que desabilitar seletivamente metaboxes seja um inconveniente, não há suporte para reconfigurar a ação init classificável no WordPress, portanto, desabilitar a classificação metabox por elemento será hacky na melhor das hipóteses (meu código acima é evidência disso). Idealmente, o que é necessário aqui é uma ação no WordPress para conectar o init classificável, mas que atualmente está codificado no javascript da caixa postal (que faz mais do que apenas configurar a classificação).

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

t31os
fonte
Nota: Este código não está mais funcionando com a versão atual do WordPress (3.9.1)
Philipp
0

Para adicionar a todas as respostas anteriores, se você também deseja impedir que o WordPress carregue posições personalizadas, faça o seguinte (substitua postpor qualquer tipo de postagem):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Matthew Boynes
fonte
0

Acabei de encontrar o caminho simples, espero que um novo candidato ajude com isso. Supondo que você possa adicionar um arquivo css no estilo de enfileiramento de administrador, eu apenas uso o css para fazer isso e sinto muito pelo meu inglês ruim.

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

Espero que ajude.

Rahendra Putra K
fonte