web-dev-qa-db-fra.com

Empêcher le retrait des widgets

Je construis un site avec beaucoup de widgets. Ils ont été hautement personnalisés.

Plusieurs administrateurs/éditeurs devront éditer ces widgets lorsque le site sera en ligne.

En ce moment, j'ai peur de voir qu'un widget (et sa configuration) peut être complètement effacé en un seul mouvement de souris (en le laissant tomber de la barre latérale).

Existe-t-il un moyen d'empêcher la suppression des widgets tout en conservant la possibilité de modifier son contenu?

De plus, la page de gestion des widgets dans l’administration laisse à mon avis trop de place au module "ajouter un widget" et pas assez au module "widget activé". Ceci est utile lors de la construction d'un site, mais inutile lorsque le site est terminé. Est-il possible de changer la taille de ces modules?

Merci beaucoup

5
kursus

La solution à laquelle je peux penser est de supprimer les panneaux Widgets disponible et Inactif des panneaux. Il n’ya donc aucun endroit où glisser (et supprimer) les widgets utilisés dans la barre latérale.

Vous pouvez injecter quelque chose d'autre pour combler le vide.

Dans cet exemple, un seul utilisateur peut ajouter/supprimer des widgets.

function wpse_53398_script_printer(){
    // used to display the front end site
    $site = get_site_url();

    // here you can filter who can add/delete widgets
    global $current_user;  
    if ( 'kursus' == $current_user->data->user_login ) 
    {
            echo <<<HTML
            <!-- CSS to hide the widgets descriptions = real estate gains -->
            <style type="text/css">#widget-list .widget-description {display:none;}</style>
            <script type="text/javascript">
            jQuery(document).ready( function($) {
                // swaps the placement of the panels Available Widgets and Incactive Widgets
                $('#available-widgets').appendTo('#widgets-left');
            });     
            </script>
HTML;
    }
    else
    {
            echo <<<HTML
            <!-- CSS to prevent the div from briefly appearing before the jQuery can act -->
            <style type="text/css">#widgets-left {display:none;}</style>
            <script type="text/javascript">
            // reload the contents of the iframe
            function Reload () {
                var f = document.getElementById('the-front-end');
                f.src = f.src;
            }
            jQuery(document).ready( function($) {
                // inject other content to fill the void
                $('<div style="width:70%;"><input type="button" value="Reload front page" onclick="Reload();" style="float:right"><br /><iframe id="the-front-end" src="{$site}" frameborder="0" width="100%" height="700"></div>').insertBefore('#widgets-left');

                // removes the whole left side of the widgets page
                $('#widgets-left').remove();

            });     
            </script>
HTML;
    }
}
add_action('admin_footer-widgets.php', 'wpse_53398_script_printer');

Important: la ligne de fermeture HTML; ne peut comporter aucun caractère d'espacement avant ou après

PS: this la syntaxe Heredoc<<<HTML code HTML; empêche le code d'afficher le PHP correctement formaté ici dans WPSE. Mais le code est testé et fonctionne.

2
brasofilo

Le problème de la suppression des widgets est plus général, il est causé par le développeur et l'éditeur utilisant la même interface backend. Des problèmes similaires, tels que la suppression de widgets, sont - l'insertion d'images de taille incorrecte - l'ajout de polices non conçues par le concepteur - la création de plusieurs éléments de menu par rapport à ceux autorisés .. et bien plus encore

La solution est simple, donnez aux éditeurs leur propre interface. Et probablement la meilleure façon de faire est de laisser cette interface ressembler au site Web lui-même. Cette approche est ce que j'appelle un "CMS frontend"

L'éditeur frontend est un plugin gratuit qui peut être utilisé à cet effet. J'ai moi-même écrit un plugin qui va un peu plus loin dans cette philosophie, frontendcms.com . Ce n'est pas gratuit cependant.

2
Carlo Roosen