WordPress : Pourquoi mes barres latérales ne s’enregistrent-elles pas dans les tests unitaires

Publié par Jean-Michel le

J’essaie de tester unitairement la fonction que j’utilise dans un thème pour enregistrer les barres latérales.

Voici la fonction de functions.php.

function fp_register_sidebars() {
register_sidebar( array(
    'name' => __( 'Sidebar 1', 'fp' ),
    'id' => 'sidebar1',
    'before_widget' => '<div id="%1$s" class="widget %2$s">',
    'after_widget' => '</div>',
    'before_title' => '<h4 class="widget-title">',
    'after_title' => '</h4>'
) );

register_sidebar( array(
    'name' => __( 'Sidebar 2', 'fp' ),
    'id' => 'sidebar2',
    'before_widget' => '<div id="%1$s" class="widget %2$s">',
    'after_widget' => '</div>',
    'before_title' => '<h4 class="widget-title">',
    'after_title' => '</h4>'
) );
}

add_action( 'widgets_init', 'fp_register_sidebars' );

Voici la méthode de test unitaire.

function test_fp_register_sidebars() {
    do_action( 'widgets_init' ); // Run the widgets_init hook

    /** @var array $sidebars Array containing all active sidebars and their widgets. */
    $sidebars = wp_get_sidebars_widgets();

    $this->assertTrue( array_key_exists( 'sidebar1', $sidebars ), 'Sidebar 1 is registered at the widgets_init hook.' );
    $this->assertTrue( array_key_exists( 'sidebar2', $sidebars ), 'Sidebar 2 is registered at the widgets_init_hook.' );
}

Le test unitaire échoue. En examinant cela, j’ai constaté que les barres latérales ne sont pas mises à jour des barres latérales pour vingt-treize aux barres latérales pour ce thème (elles restent à la barre latérale-1 et à la barre latérale-2). Je passe à mon thème dans la méthode setUp() de la classe de test unitaire en utilisant switch_theme() et c’est réussi.

Lire également:  Wordpress : L'image d'arrière-plan personnalisée ne fonctionne pas

L’activation du thème sur un environnement WordPress enregistre correctement ces barres latérales, donc je pense que cela a quelque chose à voir avec le fonctionnement de switch_theme().

Solution n°1 trouvée

Tout d’abord, vous pouvez (devriez ?) enregistrer les barres latérales en général , il n’y a pas besoin d’un crochet spécifique (et widgets_initce n’est peut-être pas le meilleur). Deuxièmement, vous n’avez pas besoin de spécifier d’ID, car ils sont générés automatiquement. Vous pouvez, bien sûr, mais ce n’est pas non plus nécessaire.

Lire également:  Wordpress masque ou affiche la catégorie de la boucle dans certains cas

Mettez simplement ce qui suit dans votre functions.php:

register_sidebar( array(
    'name' => __( 'Sidebar 1', 'fp' ),
    // 'id' => 'sidebar1',
    'before_widget' => '<div id="%1$s" class="widget %2$s">',
    'after_widget' => '</div>',
    'before_title' => '<h4 class="widget-title">',
    'after_title' => '</h4>',
) );

register_sidebar( array(
    'name' => __( 'Sidebar 2', 'fp' ),
    // 'id' => 'sidebar2',
    'before_widget' => '<div id="%1$s" class="widget %2$s">',
    'after_widget' => '</div>',
    'before_title' => '<h4 class="widget-title">',
    'after_title' => '</h4>',
) );

Pour vérifier les widgets actuels pour toutes les barres latérales enregistrées (ainsi que les inactifs, etc.), procédez comme suit :

$sidebars = wp_get_sidebars_widgets();
echo '<pre>'.print_r($sidebars, true).'</pre>';

Et pour vérifier un ID de barre latérale donné, vous pouvez faire (comme vous l’avez fait):

if (array_key_exists('sidebar1', $sidebars))
    echo 'Sidebar 1 is registered.';

À votre question concernant les anciennes barres latérales. Tant qu’il y a des widgets dans une barre latérale, ils sont stockés (sous forme de tableau) pour l’ID de barre latérale correspondant. Si vous souhaitez partager les paramètres des widgets de la barre latérale entre les thèmes, vous devez enregistrer les mêmes barres latérales (ID).

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *