web-dev-qa-db-fra.com

Enregistrement de plusieurs barres latérales avec les données d'un tableau

J'essaie d'enregistrer dynamiquement les barres latérales pour certaines pages. Les pages doivent répondre aux critères suivants:

  • être publié
  • être une page (pas un post)
  • utiliser le template 'template-generic-sidebar'

Dans mon functions.php, j'ai créé un court script en utilisant get_pages() qui obtient une liste de toutes les pages. Il compte le nombre de pages correspondant aux critères ci-dessus et stocke les informations requises à leur sujet dans un tableau appelé $sidebars_required:

$get_pages_args = array(
    'post_type' => 'page',
    'post_status' => 'publish'
    );

    $all_pages = get_pages($get_pages_args);
    $counter = 0;
    $sidebars_required = array();

foreach($all_pages as $page){
    $page_id = $page->ID;
    $page_template = get_page_template_slug($page_id);
    if (strpos($page_template,'template-generic-sidebar') !== false) {
        $counter++;
        $page_details = array(
            "ID" => $page_id,
            "title" => $page->post_title,
            "slug" => $page->post_name,
        );
        array_Push($sidebars_required,$page_details);
    }
}

Dans mon cas de test, le nombre requis de barres latérales stockées dans $counter = 3. Dans mon cas de test, $sidebars_required ressemble à ceci:

array(3) {
  [0]=>
  array(3) {
    ["ID"]=>
    int(27)
    ["title"]=>
    string(8) "About Us"
    ["slug"]=>
    string(8) "about-us"
  }
  [1]=>
  array(3) {
    ["ID"]=>
    int(13)
    ["title"]=>
    string(20) "Generic Page Example"
    ["slug"]=>
    string(20) "generic-page-example"
  }
  [2]=>
  array(3) {
    ["ID"]=>
    int(15)
    ["title"]=>
    string(9) "Resources"
    ["slug"]=>
    string(9) "resources"
  }
}

Mais je suis obligé d'enregistrer le nombre correct de barres latérales ayant chacune un nom différent, car je ne sais pas comment parcourir correctement mon tableau pour créer la liste de $args requise pour register_sidebar().

J'ai déjà $counter prêt à spécifier la number requise par register_sidebars():

register_sidebars($counter);

Mais comment puis-je créer mon $args en utilisant le page_name de mon tableau? Comment puis-je parcourir ce tableau, mais l'utiliser pour remplir le $args pour register_sidebars()

Je ne comprends pas comment register_sidebars permet d'enregistrer plusieurs barres latérales alors que plusieurs listes d'arguments ne sont pas incluses.

J'envisage quelque chose comme ceci:

$args = array(
  'name'          => __($sidebars_required[0]['title'].'sidebar'),
  'id'            => 'sidebar-'.$sidebars_required[0][slug],
  'before_widget' => '<li id="%1$s" class="widget %2$s">',
  'after_widget'  => '</li>',
  'before_title'  => '<h2 class="widgettitle">',
  'after_title'   => '</h2>'
);

Donc dans ce qui précède, le nom de la barre latérale serait par exemple About Us Sidebar et son identifiant serait sidebar-about-us

Mais comme il n’existe qu’une seule liste $args, il n’existe aucun moyen de l’enregistrer correctement pour 3 barres latérales différentes portant des noms différents. Je ne peux créer que trois barres latérales identiques.

2
user1486133

J'ai réussi à résoudre ce problème moi-même. Au lieu d'utiliser register_sidebars() pour enregistrer toutes les barres latérales, j'ai simplement utilisé le singulier register_sidebar() dans une boucle for, de sorte qu'il enregistre une barre latérale pour chaque page correspondante.

Tout ce qu'il faudrait faire pour que cela fonctionne est de changer le nom du modèle (dans mon cas, template-generic-sidebar) en son propre modèle slug/name et de placer ce code dans functions.php

$get_pages_args = array(
    'post_type' => 'page',
    'post_status' => 'publish'
    );
    $all_pages = get_pages($get_pages_args);
    $counter = 0;
    $sidebars_required = array();
    foreach($all_pages as $page){
        $page_id = $page->ID;
        $page_template = get_page_template_slug($page_id);
        if (strpos($page_template,'template-generic-sidebar') !== false) {
            $counter++;
            $page_details = array(
                "title" => $page->post_title,
                "slug" => $page->post_name,
            );
            array_Push($sidebars_required,$page_details);
        }
    }
    for ($i = 1; $i <= $counter; $i++) {
        $array_counter = $i-1;
        $args = array(
            'name'          => __($sidebars_required[$array_counter]['title'].' sidebar'),
            'id'            => 'sidebar-'.$sidebars_required[$array_counter]['slug'],
            'before_widget' => '<li id="%1$s" class="widget %2$s">',
            'after_widget'  => '</li>',
            'before_title'  => '<h2 class="widgettitle">',
            'after_title'   => '</h2>'
        );
        register_sidebar($args);
    }
2
user1486133