web-dev-qa-db-fra.com

Appelez dynamic_sidebar mais incluez/excluez les widgets nommés?

Est-il possible d'inclure ou d'exclure des widgets nommés spécifiques affectés à un appel nommé dynamic_sidebar?

Par exemple, si j'ai enregistré une barre latérale nommée "my_sidebar" et que l'utilisateur y a placé un widget "Liens", je souhaite pouvoir l'inclure ou l'exclure en fonction d'un paramètre personnalisé dans le panneau d'options de mon thème.

Est-ce possible?

Toutes les idées sont très appréciées.

6
Scott B

dynamic_sidebar() appelle wp_get_sidebars_widgets() pour obtenir tous les widgets par barre latérale. Je pense que filtrer cette sortie est le meilleur moyen de supprimer un widget d'une barre latérale.

add_filter( 'sidebars_widgets', 'wpse17681_sidebars_widgets' );
function wpse17681_sidebars_widgets( $sidebars_widgets )
{
    if ( is_page() /* Or whatever */ ) {
        foreach ( $sidebars_widgets as $sidebar_id => &$widgets ) {
            if ( 'my_sidebar' != $sidebar_id ) {
                continue;
            }
            foreach ( $widgets as $idx => $widget_id ) {
                // There might be a better way to check the widget name
                if ( 0 === strncmp( $widget_id, 'links-', 6 ) ) {
                    unset( $widgets[$idx] );
                }
            }
        }
    }

    return $sidebars_widgets;
}
7
Jan Fabry

J'ajoute une autre réponse pour répondre à cette question: - Comment exclure certains widgets de leur page d'accueil?

WordPress a une fonction interne _get_widget_id_base() Je ne suis pas sûr de l’utiliser en toute sécurité. Mais c’est la méthode que WordPress utilise pour obtenir une base d’ID de widget en utilisant un ID de widget au lieu de strpos() et strncmp().

Exemple:-

add_filter('sidebars_widgets', 'conditional_sidebar_widget');
/**
 * Filter the widget to display
 * @param array $widets Array of widget IDs
 * @return array $widets Array of widget IDs
 */
function conditional_sidebar_widget($widets) {
    $sidebar_id = 'sidebar-1'; //Sidebar ID in which widget is set

    if ( (is_home() || is_front_page()) && !empty($widets[$sidebar_id]) && is_array($widets[$sidebar_id]) ) {
        foreach ($widets[$sidebar_id] as $key => $widget_id) {
            $base_id = _get_widget_id_base($widget_id);
            if ($base_id == 'recent-posts') {
                unset($widets[$sidebar_id][$key]);
            }
        }
    }

    return $widets;
}
1
Sumit

En prolongeant la réponse de Jan, j'ai trouvé strpos() plutôt que strncmp() pour vérifier le nom du widget (c'est plus rapide ..)

Vous trouverez ci-dessous une fonction similaire (active et testée) qui vous mènera au même résultat:

 add_filter( 'sidebars_widgets', 'hide_widgets' );
 function hide_widgets( $excluded_widgets )
    {
        if ( is_page() /* Or whatever */ ) {
     //set the id in 'sidebar-id' to your needs
            foreach ( $excluded_widgets['sidebar-id'] as $i => $inst) {

     //in this example we'll check if the id for the rss widgets exists.(change it to suit your needs)

            $pos = strpos($inst, 'rss');

            if($pos !== false)
            {
                //unsetting the id will remove the widget 
                unset($excluded_widgets['sidebar-id'][$i]);
            }
        }    
    }
    return $sidebars_widgets;
    }
0
maioman