web-dev-qa-db-fra.com

Paramètre de barre latérale manquante "correctif" - before_content

comme vous le savez les paramètres de la barre latérale de register_sidebar () qui contrôlent la disposition du widget sont

- before_widget
- after_widget
- before_title
- after_title

le problème est que vous ne pouvez pas implémenter certains types de conceptions car un paramètre tel que 'before_content' est manquant.

par exemple:

<div class="container">
  <div class="title">
    title  
  </div>
  <div class="content">
    content
  </div>
</div>

une telle structure HTML n'est possible que si vous ajoutez <div class="content"> dans le paramètre after_title. Le problème est que si vous faites cela, les widgets sans titre vont casser la mise en page :(

alors, y a-t-il une solution pour ajouter en quelque sorte que <div class="content"> après div.title ou après div.container si le titre est manquant?

1
Alex

Ce code détecte si un titre a été défini et sinon, il modifie l'argument before_widget.

add_filter( 'widget_display_callback', 'wpse4213_widget_display_callback', 10, 3 );
function wpse4213_widget_display_callback( $instance, $widget, $args )
{
    if ( empty( $instance['title'] ) ) {
        $args['before_widget'] = '<div class="container"><div class="content">';
        $widget->widget( $args, $instance );
        return false;
    }
    return $instance;
}

Ce code fonctionne car le widget_display_callback vous permet de renvoyer false si vous ne souhaitez pas afficher le widget. Dans ce cas, nous affichons le widget nous-mêmes, nous ne voulons donc pas que WordPress le répète. Un bidouillage, mais ça marche.

Cette fonction échouera si le widget fournit un titre par défaut (comme le font la plupart des widgets fournis dans la distribution principale). Pour détecter cela, j'ai également créé une fonction qui tente d'abord de rendre le widget dans un tampon de sortie. Si nous détectons un élément de titre dans ce tampon de sortie, le widget avait un titre par défaut - nous ignorons donc le tampon et l’afficheons comme un widget normal. Mais cela peut également casser lorsque le widget utilise la mise en cache hyperactive, nous devons donc essayer de le vider également. Ai-je mentionné que c'est un hack?

add_filter( 'widget_display_callback', 'wpse4213_widget_display_callback', 10, 3 );
function wpse4213_widget_display_callback( $instance, $widget, $args )
{
    if ( empty( $instance['title'] ) ) {
        $args['before_widget'] = '<div class="container"><div class="content">';
        ob_start();
        $widget->widget( $args, $instance );
        $widget_content = ob_get_contents();
        ob_end_clean();
        if ( false !== strpos( $widget_content, 'widget-title' ) ) {
            // It did return a title!
            if ( method_exists( $widget, 'flush_widget_cache' ) ) {
                $widget->flush_widget_cache();
            }
            return $instance;
        }
        echo $widget_content;
        return false;
    }
    return $instance;
}
2
Jan Fabry