Respostas:
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!
admin_enqueue_scripts
e funcionou bem.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!
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' );
admin_init
apenas em algum tipo de postagem específico?
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');
}
}
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.
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");
});
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.
.postbox:hover .handlediv { display:none; }
em CSS para esconder a .handlediv
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.
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 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_dragging
funçã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_script
linha 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_scipt
chamada).
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.
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 post
por qualquer tipo de postagem):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
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.
$('.postbox .hndle').css('cursor','default');
:::: Re: 2ª edição , você precisará atualizar a Resposta no futuro próximo: P