Désactiver le glissement des boîtes de méta?

16

Quelqu'un sait-il comment désactiver cette fonctionnalité afin que les méta-boîtes ne puissent pas être repositionnées?

    
posée fxfuture 02.10.2010 - 00:43

8 réponses

12

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 très facile!

  1. Commencez par mettre en file d'attente un fichier JavaScript (je ne reviendrai pas sur ce processus; de nombreux tutoriels peuvent décrire ce processus mieux que moi). J'ai accroché à admin_enqueue_scripts , et cela a bien fonctionné.
  2. Désactivez la fonctionnalité de tri en le mettant dans le fichier JavaScript suivant:

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

Il s’agit essentiellement de désactive jQuery UI Sortable , qui active la fonctionnalité de glissement de métabox (postbox.dev.js:64 ). Ceci déplace également le curseur de la poignée de métabox sur un pointeur de souris standard au lieu d’un curseur de déplacement (idée fournie par brasofilo ci-dessous).

J'espère que cela aide!

Modifier: J'ajouterai qu'il vaut probablement la peine de suivre certains des autres conseils donnés ici et de désactiver l'enregistrement de la commande Metabox. Cela évitera toute confusion au hasard, quelque chose est réactivé par erreur.

Deuxième édition: Ce correctif a été testé sur WordPress 3.3.1 pour le bénéfice des générations futures (et des futurs chercheurs de Google). Je ne peux pas parler à d'autres versions!

    
réponse donnée Chris Van Patten 06.03.2012 - 01:41
4

Le moyen le plus rapide est de désactiver le JS pour cette fonction. Mais je pense qu’il est préférable de désenregistrer également le style de la boîte et d’initier un style personnalisé sans les effets pour la souris et l’icône d’ouverture / fermeture des méta-boîtes.

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
    
réponse donnée bueltge 02.10.2010 - 21:01
4

I a répondu à une question similaire avec la suggestion d'autoriser le glissement, mais désactivez l'enregistrement de la nouvelle commande du côté serveur. Cela pourrait vous donner plus de contrôle et être plus sûr pour l'avenir, car le code JavaScript pourrait changer rapidement, mais le protocole de communication avec le serveur pourrait rester plus robuste. Cet exemple désactive tout glisser, 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');
   }
}
    
réponse donnée Jan Fabry 04.10.2010 - 11:44
3

Le wordpress javascript identifie les métabox glissables 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 les classes hndle en supprimant le nom de la classe ou en le renommant. Dans mon cas, j’ai étiqueté plusieurs types de séparateurs que j’ai étiquetés avec .hndle h3, mais il est peu probable que quelqu'un d’autre ait procédé de la sorte. Donc, vous pouvez faire ce que j'ai fait ci-dessous, ou vous pouvez utiliser .find ('. Hndle'). Attr ('classe', '') ... 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 themes ou votre dossier plugins). La mise en file d'attente serait appelée par un admin_print_scripts, par init ou par le hook que vous préférez utiliser pour ajouter des éléments à vos pages d'administration.

jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
    
réponse donnée Aryan Duntley 12.03.2013 - 16:31
2

Je voudrais aussi ajouter ce code 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 tirer parti des boîtes de méta mais sans les fonctions glisser-déposer et les fonctions d'ouverture / fermeture.

    
réponse donnée Maxime 02.08.2011 - 21:34
0

J'ai remarqué que cette question est restée sans réponse, dans la mesure où le demandeur n'a pas choisi une réponse correcte.

Jan a donné un exemple concret de l’arrêt de la sauvegarde de la réorganisation de la métabox sur Ajax, tandis que d’autres ont fait des suggestions concernant le SC.

Autant que je sache, tout ce que vous voulez faire est de désactiver le glissement, rien de plus. Pour ce faire, vous avez besoin de deux éléments: d’une part, une fonction permettant d’intercepter l’action de sauvegarde ajax, mais, d’autre part, d’arrêter le glisser-déposer de JS sans supprimer de fonctionnalité nulle part ailleurs dans la page, mais aussi de le faire sélectivement pour un type de message ou un métabox particulier.

En utilisant la fonction Jans et un certain jQuery, nous pouvons le faire sans détruire totalement les autres fonctionnalités créées par le script postbox, comme cela est le cas.

Code PHP pour le fichier de fonctions de thème ou le fichier de plug-in

Décommentez 1 des lignes appropriées pour faire fonctionner la mise en file d'attente.

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 pour le fichier Javascript référencé ci-dessus

JQuery très basique qui supprime la classe de 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 constater, j’ai ajouté dans un exemple de type de message pour ajouter le code, réserver dans ce cas. Cependant, vous avez indiqué vouloir également pouvoir le désactiver pour des métaboxes spécifiques.

Cela peut être fait, il y a juste quelques effets secondaires parmi lesquels, en supprimant des classes de métabox donnés pour empêcher le glissement, vous empêchez également la fonction de basculement de fonctionner (c'est-à-dire la fonctionnalité de basculement de titre de métabox).

Cela dit, cela peut être fait ...

D'abord, vous mettriez à jour la fonction disable_metabox_dragging 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, notez que vous devez supprimer le commentaire de la ligne wp_enqueue_script applicable.

Le tableau dans l'appel à la localisation est ce qui détermine les métaboxes à désactiver. L'élément vide à clé 0 y est volontairement car 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 à faire est de déterminer l'ID des métaboxes que vous souhaitez masquer et de les transférer dans le tableau définissant les métabox désactivés (dans l'appel wp_localize_scipt ).

Globalement, je ne pense pas que désactiver sélectivement les métaboxes soit à la base d’inconvénients, il n’ya aucune aide pour reconfigurer l’action init triable dans WordPress, aussi, désactiver le tri métabox par élément ne sera au mieux le code ci-dessus en est la preuve). Idéalement, il faut ici une action dans WordPress pour accrocher l'init triable, mais c'est actuellement codé en dur dans la boîte aux lettres javascript (ce qui fait plus que simplement configurer triable).

En tout cas, j'espère que cela a aidé à résoudre la question initiale.

    
réponse donnée t31os 03.08.2011 - 17:11
0

Pour ajouter à toutes les réponses précédentes, si vous souhaitez également empêcher WordPress de charger des positions personnalisées, procédez comme suit (remplacez post par tout type de publication):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
    
réponse donnée Matthew Boynes 23.03.2016 - 21:10
0

Je viens de trouver le moyen le plus simple, espérons que le nouveau chercheur l'aidera. En supposant que vous puissiez ajouter un fichier css sur le style de la mise en file d’administration, je n’utilise que 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 ça aide.

    
réponse donnée Rahendra Putra K 06.10.2018 - 13:43

Lire d'autres questions sur les étiquettes