Désactiver le glissement des métadonnées?

17

Quelqu'un sait comment désactiver cette fonctionnalité afin que les métadonnées ne puissent pas être repositionnées?

fxfuture
la source

Réponses:

13

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. Tout d'abord, mettez en file d'attente un fichier JavaScript (je ne vais pas refaire ce processus; il existe de nombreux tutoriels qui peuvent mieux décrire ce processus que moi). Je me suis accroché admin_enqueue_scriptset cela a bien fonctionné.
  2. 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!

Chris Van Patten
la source
+1 solution sans tracas en moins pour le Q, à mon humble avis bien sûr. Et beaucoup de poids lourds pondérés;) :::: J'utilise uniquement le JS pour tous, ajoutant $('.postbox .hndle').css('cursor','default');:::: Re: 2ème édition , vous devrez continuer à mettre à jour la réponse dans un avenir prévisible: P
brasofilo
Manipuler le CSS à partir du JS est intelligent! J'ajouterai cela à ma réponse.
Chris Van Patten
Ce code fonctionne avec WordPress 3.9.1 actuel - très sympa! :)
Philipp
4

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' );
bueltge
la source
Qu'en est-il si vous souhaitez simplement désactiver le glissement pour une métabox spécifique sur un type de publication personnalisé spécifique?
NetConstructor.com
4
Cela fonctionne, mais il désactive également d'autres fonctionnalités comme le statut de publication
fxfuture
Je pense que oui, mais je ne teste pas cela. Vous pouvez vous cacher avec le plugin Adminimize comme un moyen simple.
bueltge
1
Joli! Comment pourrions-nous envoyer cela admin_inituniquement dans un type de message spécifique?
brasofilo
1
semblait une solution parfaite au début - mais hélas - cela désactive également toutes les fonctionnalités pour ajouter une catégorie / taxonomie ...
ptriek
4

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');
   }
}
Jan Fabry
la source
Merci Jan - J'ai ajouté ceci à mon functions.php mais ça ne fait rien?
fxfuture
@fxfuture: Silly me, check_ajax_refererc'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.
Jan Fabry
Oui, votre correction ne fonctionne pas ... Ou, FireFox et Chrome mettent la page en cache pour une raison quelconque. : /
Zack
3

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");
});
Aryan Duntley
la source
2

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.

Maxime
la source
Bon ajout à la réponse @bueltge (j'ai utilisé une combinaison des deux) - bien que vous puissiez également ignorer le bit jQuery et ajouter .postbox:hover .handlediv { display:none; }du CSS pour masquer le .handlediv
ptriek
0

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.

Code PHP pour fichier de fonctions de thème ou fichier de plugin

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 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_draggingfonction 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_scriptligne 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_sciptappel).

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.

t31os
la source
Remarque: Ce code ne fonctionne plus avec la version actuelle de WordPress (3.9.1)
Philipp
0

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 postpar n'importe quel type de publication):

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

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.

Rahendra Putra K
la source