web-dev-qa-db-fra.com

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

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

16
fxfuture

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!

  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). Je me suis accroché à admin_enqueue_scripts, et cela a bien fonctionné.
  2. Désactivez la fonctionnalité de tri en la mettant dans ce fichier JavaScript:

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

En gros, cela vient simplement désactive jQuery UI Sortable , qui active la fonctionnalité de glissement de métabox ( postbox.dev.js: 64 ). Cela 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 en 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 la commande metabox. Cela évitera la confusion au hasard, quelque chose est réactivé par erreur.

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

12
Chris Van Patten

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 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' );
4
bueltge

I a répondu à une question similaire avec la suggestion d'autoriser le glissement, mais désactive l'enregistrement de la nouvelle commande 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');
   }
}
4
Jan Fabry

Le wordpress javascript 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 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 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 ('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");
});
3
Aryan Duntley

J'ajouterais aussi ce Javascript Hack:

<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.

2
Maxime

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' );
0
Matthew Boynes

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.

0
Rahendra Putra K

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 de manière sélective. un type de poste ou metabox particulier.

En utilisant Jans et jQuery, nous pouvons le faire sans détruire totalement les autres fonctionnalités créées par le script postbox, comme c’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 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/JS pour le fichier Javascript référencé ci-dessus

JQuery très basique qui supprime la classe sortable 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, livre 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 mineurs, notamment qu'en supprimant des classes de métaboxes 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 ...

Tout 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 à l'intérieur de l'appel à localiser est ce qui détermine les métaboxes à désactiver. L'élément à clé 0 vide est là, à dessein, 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 voulez masquer et de les transmettre au 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 à court d’inconvénients, il n’est tout simplement pas possible de reconfigurer l’action init pouvant être triée dans WordPress; preuve de cela). 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épondre à la question initiale.

0
t31os