web-dev-qa-db-fra.com

Interdire certains widgets de certaines barres latérales

J'ai plusieurs sidebars dans le thème que je développe. Certains d'entre eux sont conçus pour contenir seulement quelques types de widgets. J'essaie donc de comprendre comment garder les autres widgets sans utiliser de plugin.

Après beaucoup de recherches sur Google, je crois qu'il n'y a que 2 options:

  1. Utilisez jquery sur la page d'administration des widgets pour empêcher le glisser-déposer de certains widgets vers certaines zones de widgets. Dans un monde parfait, l'utilisateur verra une sorte de message indiquant que ce widget n'est pas autorisé dans cette zone de widgets.
  2. Utilisez le filtre wp 'sidebars_widgets' pour supprimer les widgets côté serveur.

Tout d'abord, cela semble être un meilleur moyen, surtout en ce qui concerne les performances. Qu'est-ce que tu penses? Bien que je n’ai trouvé aucune solution efficace, ma connaissance de jQuery n’est pas suffisante. Malheureusement, mes PHP connaissances ne sont évidemment pas suffisantes non plus pour trouver la solution. Voici ce que j'ai

add_filter( 'sidebars_widgets', 'wp150734_code_disable_widgets' );


function wp150734_code_disable_widgets( $sidebars_widgets ) {

    // This code works for one sidebar & one widget :
    $allowed_widget  = 'wp150734_widget_social';
    $sidebar_to_check = 'wp150734_widgets_navbar';

    // But I want to check the array of sidebars with allowed widgets:
    $sidebars_to_check = array(
        // allowed widgets in 'wp00734_widgets_navbar'
        'wp150734_widgets_navbar' => array(
            'widget_search',
            'widget_text',
            'wp150734_widget_social'
        ),
        // allowed widgets in 'wp00734_widgets_footer'
        'wp00734_widgets_footer' => array(
            'widget_search',
            'widget_text',
            'wp00734_widget_social'
        )
    );


    foreach ( $sidebars_widgets as $sidebars_key=>$sidebars_widget ) {

        // Check if we even need to check this sidebar
        if ( $sidebars_key != $sidebar_to_check )
        continue;

        if ( $sidebars_widget ) {

            foreach ( $sidebars_widget as $k=>$v ) {

                // Look for our custom widget and unset all other widgets from the $sidebars_widgets array
                if ( stripos( $v, $allowed_widget ) === false ) {
                    unset( $sidebars_widgets[$sidebars_key][$k] );
                }

            }
        }
    }

    return $sidebars_widgets;
};

Qu'en pensez-vous? Je pense que la solution serait mieux, mais je ne trouve rien qui y soit lié.

EDIT: J'ai 2-3 widgets personnalisés en plus de tout le standard. Je veux que tous ces widgets fonctionnent normalement dans toutes les zones de widgets enregistrés. Maintenant, j'ai une barre de navigation supérieure dans le thème. Il est conçu pour contenir des données. Comme les menus, les icônes sociales, la recherche et le texte dans l'ordre choisi. Comme j'ai déjà tout cela sous forme de widgets qui peuvent être réorganisés, il semble logique d’inscrire une zone de widget personnalisée dans la barre de navigation et de laisser l’utilisateur choisir les widgets et les réorganiser. Pas besoin de dupliquer la fonctionnalité - les widgets l'offrent déjà prête à l'emploi. Le seul problème est que tous les widgets ne sont pas conçus pour s'asseoir dans la barre de navigation.

2
Nikita

Vous pensez à cela. Le concept de widgets est conçu pour être transférable entre zones de widgets (barres latérales AKA). Si un widget n'est pas transférable, il ne s'agit tout simplement pas d'un véritable widget wordpress.

Maintenant, créer votre propre cadre de widgets semble être une idée peu agréable. En plus de lutter contre le code principal de wordpress, vous allez devoir lutter contre les attentes établies des utilisateurs concernant les widgets.

Vous avez donc essentiellement deux options, appelez-la "barres latérales et widgets de Baitar" pour signaler à l'utilisateur qu'elles ne sont pas de véritables widgets wordpress et répliquer le code de base wordpress pour les gérer. Ou demandez-vous simplement pourquoi vous écrivez des widgets de qualité inférieure et corrigez votre conception et votre code.

La troisième option, et probablement la plus simple, consiste simplement à laisser l’utilisateur faire ce qu’il veut et à lui laisser voir lui-même que les widgets ne fonctionnent pas. Fournissez juste la documentation appropriée pour cela.

1
Mark Kaplun