Réponses:
J'ai eu le même problème et Google m'a conduit ici. Malheureusement, aucune de ces réponses n'a aidé, mais j'ai finalement trouvé la réponse, et c'est assez facile!
admin_enqueue_scripts
et cela a bien fonctionné.Désactivez la fonctionnalité de tri en mettant ceci dans ce fichier JavaScript:
jQuery(document).ready( function($) {
$('.meta-box-sortables').sortable({
disabled: true
});
$('.postbox .hndle').css('cursor', 'pointer');
});
Essentiellement, cela désactive simplement jQuery UI Sortable , qui alimente la fonctionnalité de déplacement de la métaboxe ( postbox.dev.js: 64 ). Cela fait également basculer le curseur de la poignée de la metabox sur un pointeur de souris standard au lieu d'un curseur de déplacement (idée reproduite avec l'aimable autorisation de brasofilo ci-dessous).
J'espère que cela t'aides!
Edit: je dois ajouter qu'il vaut probablement la peine de suivre certains des autres conseils ici et de désactiver l'enregistrement de l'ordre des métaboxes. Cela empêchera la confusion sur le hasard que quelque chose soit réactivé par erreur.
Deuxième édition: pour le bénéfice des générations futures (et des futurs chercheurs Google), ce correctif a été testé sur WordPress 3.3.1. Je ne peux pas parler aux autres versions!
Le moyen le plus rapide est de désactiver le JS pour cette fonction. Mais je pense que c'est mieux lorsque vous annulez également l'enregistrement du style de la boîte et que vous lancez un style personnalisé sans les effets de la souris et l'icône d'ouverture / fermeture sur les métadonnées.
function fb_remove_postbox() {
wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
admin_init
uniquement dans un type de message spécifique?
J'ai répondu à une question similaire avec la suggestion d'autoriser le glissement, mais de désactiver l'enregistrement de la nouvelle commande côté serveur. Cela pourrait vous donner plus de contrôle et être plus à l'épreuve du temps car le JavaScript pourrait changer rapidement, mais le protocole pour communiquer avec le serveur pourrait rester plus robuste. Cet exemple désactive tout glissement, mais vous pouvez le développer pour vérifier votre boîte ou méta page spécifique.
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
c'est une action, pas un filtre. Vous devriez juste die()
y mettre fin à l'exécution du script, ne rien retourner. Je vais réparer mon code.
Le javascript wordpress identifie les métaboxes déplaçables par leur titre h3 avec une classe de "hndle". Il est assez simple de les désactiver spécifiquement en référençant la métabox en question (si vous créez des métabox personnalisées, vous lui aurez attribué un identifiant) et en désactivant toutes les classes hndle en supprimant le nom de classe ou en le renommant. Dans mon cas, j'ai plusieurs types de séparateurs que j'ai étiquetés avec .hndle h3, mais il est peu probable que quelqu'un d'autre ait fait les choses de cette façon. Donc, vous pouvez faire ce que j'ai fait ci-dessous, ou vous pouvez utiliser .find ('. Hndle'). Attr ('class', '') .... ou quelque chose de similaire. Cela irait dans un fichier .js que vous avez mis en file d'attente dans votre fichier functions.php (que ce soit dans votre dossier de thèmes ou votre dossier de plugins). La mise en file d'attente serait appelée par un admin_print_scripts,
jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
J'ajouterais également ce hack Javascript:
<script type='text/javascript'>
jQuery(document).ready(function ($) {
$('.handlediv').remove();
});
</script>
... et ce CSS:
.postbox .hndle:hover {
cursor:default;
}
J'ai utilisé ce code pour profiter des métadonnées, mais sans le glisser-déposer et les fonctions d'ouverture / fermeture.
.postbox:hover .handlediv { display:none; }
du CSS pour masquer le .handlediv
J'ai remarqué que cette question est restée sans réponse, dans la mesure où le demandeur n'a pas sélectionné une réponse correcte.
Jan a donné un exemple pratique de l'arrêt de la réorganisation des métaboxes enregistrées sur Ajax, tandis que d'autres ont fait des suggestions concernant le JS.
Pour autant que je sache, tout ce que vous voulez faire est de désactiver le glissement, rien de plus. Pour ce faire, vous aurez besoin de deux choses, premièrement une fonction pour intercepter l'action de sauvegarde ajax, mais deuxièmement, vous devez également arrêter le glisser-déposer JS sans tuer de fonctionnalité n'importe où ailleurs dans la page, tout en étant de le faire sélectivement pour un type de poste ou une metabox particulière.
En utilisant la fonction Jans et certains jQuery, nous pouvons le faire sans tuer totalement les autres fonctionnalités créées par le script de la boîte aux lettres, comme ça.
Décommentez 1 des lignes appropriées pour que la mise en file d'attente fonctionne.
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 très basique qui supprime la classe triable metabox des éléments applicables, cela empêche le glissement.
jQuery(document).ready(function($){
$('.meta-box-sortables').removeClass('meta-box-sortables');
});
Comme vous pouvez le voir, j'ai ajouté dans 1 exemple de type de message pour ajouter le code, réservez dans ce cas. Cependant, vous avez mentionné vouloir avoir également la possibilité de le désactiver pour des métaboxes spécifiques.
Cela peut être fait, il y a juste quelques petits effets secondaires, en supprimant les classes des métaboxes données pour empêcher le glissement, vous empêchez également la fonction de basculement de fonctionner (c'est-à-dire la fonctionnalité de basculement du titre de la métaboxe).
Cela dit, cela peut être fait ...
Tout d'abord, vous mettriez à jour la disable_metabox_dragging
fonction en ..
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' ) );
}
Encore une fois, en notant que vous devez décommenter la wp_enqueue_script
ligne applicable .
Le tableau à l'intérieur de l'appel de localisation est ce qui détermine les métaboxes à désactiver, l'élément à clé 0 vide est là délibérément parce que la fonction de script de localisation supprime tous les index à clé 0 du tableau.
Deuxièmement, le nouveau fichier JS référencé dans la fonction de mise en file d'attente modifiée ci-dessus.
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');
} );
});
La seule chose que vous devez faire est de déterminer l'ID des métaboxes que vous souhaitez masquer et de les passer dans le tableau qui définit les métaboxes désactivées (dans l' wp_localize_scipt
appel).
Dans l'ensemble, je ne pense pas que la désactivation sélective des métaboxes soit à court d'inconvénients, il n'y a tout simplement pas de support pour reconfigurer l'action init triable dans WordPress, donc la désactivation du tri des métaboxes par élément va être au mieux hacky (mon code ci-dessus est preuve de cela). Idéalement, ce qui est nécessaire ici est une action dans WordPress pour accrocher l'init triable, mais qui est actuellement codée en dur dans la boîte aux lettres javascript (qui fait plus que simplement configurer triable).
En tout cas, j'espère que cela a aidé à répondre à la question d'origine.
Pour ajouter à toutes les réponses précédentes, si vous souhaitez également empêcher WordPress de charger des positions personnalisées, ce qui suit devrait faire l'affaire (remplacer post
par n'importe quel type de publication):
add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
Je viens de trouver le moyen simple, j'espère qu'un nouveau chercheur l'aidera. En supposant que vous puissiez ajouter un fichier CSS sur le style de mise en file d'attente d'administrateur, j'utilise uniquement CSS pour le faire et désolé pour mon mauvais anglais.
.postbox#your-metabox-id .ui-sortable-handle {
pointer-events: none;
}
J'espère que cela aide.
$('.postbox .hndle').css('cursor','default');
:::: Re: 2ème édition , vous devrez continuer à mettre à jour la réponse dans un avenir prévisible: P