Here With Me

Le blog technique d'Amaury Balmer qui parle de technologies open-source, mais surtout de WordPress !

Une barre de sidebar automatique par page et une sidebar par défaut !

| 8 Commentaires

Les , bien qu'améliorer depuis 2.8 (avec la nouvelle classe PHP et la multiplicité de ces derniers), sont toujours une source de frustration pour les utilisateurs.
Par exemple, n'ajouter un widget que sur une certaine page reste encore mission impossible ou presque !

Ici, je vais vous montrer avec 2 bouts de code, comment on peut générer automatiquement une barre de sidebar pour chaque page de votre blog/site sous WordPress, sans oublier une sidebar par défaut pour le reste du blog et les pages n'ayant aucun widget spécifique !

Étape 1 : Enregistrement automatique des nouvelles sidebars

Ici, on procède en 2 étapes,dans un premier temps on enregistre la sidebar par défaut, puis on récupère la liste complète des pages disponibles de votre blog via la fonction get_pages() et on fait une boucle dessus pour enregistrer chaque sidebar.

<?php
if ( function_exists('register_sidebar') ) {
 // Default sidebar
 register_sidebar(array(
 'id' => "sidebar-default",
 'name' => 'Sidebar par défaut',
 'before_widget' => '<li id="%1$s">',
 'after_widget' => '</div></li>',
 'before_title' => '<h2>',
 'after_title' => '</h2><div>',
 ));

 // One sidebar by page
 $_pages = get_pages();
 foreach( (array) $_pages as $_page ) {
 register_sidebar(array(
 'id' => "sidebar-$_page->ID",
 'name' => esc_html($_page->post_title),
 'before_widget' => '<li id="%1$s">',
 'after_widget' => '</div></li>',
 'before_title' => '<h2>',
 'after_title' => '</h2><div>',
 ));
 }
 unset($_pages, $_page);
 wp_reset_query();
}
?>

Étape 2 : Appel de la sidebar depuis votre thème

(Code généralement à placer dans le fichier sidebar.php de votre thème)

Ici il ne faut pas oublier d'ajouter la variable globale $wp_query, grâce à cette dernière nous récupérons l'ID de l'objet actuellement chargé, et je vérifie que je suis bien sur une page et que la sidebar est utilisée. (autrement dit qu'elle contient au moins un widget). Si ça n'est pas le cas, je charge la sidebar par défaut.

<?php
global $wp_query;
if ( function_exists('dynamic_sidebar') ) {
 if ( is_page() && is_active_sidebar( 'sidebar-' . $wp_query->queried_object_id ) ) {
 dynamic_sidebar( 'sidebar-' . $wp_query->queried_object_id );
 }  else {
 dynamic_sidebar( 'sidebar-default' );
 }
}
?>

Vous pouvez retrouver l'intégralité du code depuis cette page pastebin

8 Commentaires

  1. Très utile !
    Merci pour l’info :p

  2. Bonjour Amaury,
    Bravo et merci pour cette solution qui a le mérite de rester propre et simple.

  3. « Les widgets, bien qu’améliorer depuis[…] »
    Le commentaire d’un chieur, parce que j’en suis un vrai : ça s’écrit « améliorés ».

    Sinon, merci beaucoup, c’est super utile. WordPress peut servir de CMS de site web grâce à cette petite astuce fort sympathique!
    Merci encore!

  4. I really like this blog, we have to make friends.

  5. Excellent, c’est pratique.

    Y’a moyen de définir simplement l’affichage ou pas de la side bar pour une catégorie ou une page donnée ?

    Anthony

  6. Bonjour,

    Je vois très bien l’utilité de ce genre de chose. En revanche, n’y connaissant pas grand chose en code, 2 questions :

    Dans quel fichier mettre la première partie de code ?

    Et la 2eme partie, n’importe ou dans le sidebar.php ?

  7. Incroyable !

    J’ai cherché cette solution pendant des semaines, et là je tombe dessus tout à fait par hasard… Merci pour le tuyaux.

    Bien à vous

  8. Et dans le cas ou on utilise WPML qui ne gère pas les get_pages()… voici un petit script.

    //ONE BANNER BY PAGE
    if(function_exists(‘icl_object_id’))
    {
    global $wpdb;
    $wpmlpagesbanner = $wpdb->get_results(« SELECT * FROM $wpdb->posts WHERE post_status LIKE ‘publish’ AND post_type LIKE ‘page’ ORDER BY post_title ASC »);
    foreach($wpmlpagesbanner as $wpmlpagebanner) {
    $idwpmlpagebanner=$wpmlpagebanner->ID;
    $langbanner = $wpdb->get_row(« SELECT * FROM wp_icl_translations WHERE element_id LIKE ‘ ».$idwpmlpagebanner. »‘ »);
    register_sidebar(array(
    ‘name’ => ‘Banner ‘.esc_html($wpmlpagebanner->post_title).’ – ‘.$langbanner->language_code. »,
    ‘id’ => « banner-$wpmlpagebanner->ID-widget-area »,
    ‘description’ => __(‘Banner par Page widget area’, ‘framework’),
    ‘before_widget’ =>  »,
    ‘after_widget’ => « \n »,
    ‘before_title’ =>  »,
    ‘after_title’ => « \n »
    ));
    }
    unset($wpmlpagesbanner, $wpmlpagebanner);
    }
    else
    {
    $_pages = get_pages();
    foreach( (array) $_pages as $_page ) {
    register_sidebar(array(
    ‘name’ => ‘Banner ‘.esc_html($_page->post_title). »,
    ‘id’ => « banner-$wpmlpagebanner->ID-widget-area »,
    ‘description’ => __(‘Banner par Page widget area’, ‘framework’),
    ‘before_widget’ =>  »,
    ‘after_widget’ => « \n »,
    ‘before_title’ =>  »,
    ‘after_title’ => « \n »
    ));
    }
    unset($_pages, $_page);
    }
    wp_reset_query();

Répondre à Olivier C Annuler la réponse.

Champs Requis *.