web-dev-qa-db-fra.com

Afficher un widget dans la barre latérale uniquement quand aucun autre widget n'est rendu?

Je travaille sur un thème personnalisé, en effectuant la migration de l'apparence des sites actuels vers WordPress. La plupart de tout est basé sur les pages et toutes ces pages doivent avoir une barre latérale gauche. Parmi ces pages, il en est une des 3 ci-dessous:

  1. La page fait partie d'une section, affiche donc une liste de toutes les parties de la section dans un widget
  2. Page fait partie d'une section, affiche donc une liste de toutes les parties de la section d'un widget, mais a également des enfants, affiche donc ces pages dans un widget séparé ci-dessus.
  3. La page ne fait pas partie d'une section, elle n'a donc ni page de frère ni sœur.

Je ne veux pas avoir à faire un modèle de page séparé pour ceux qui sont en # 3. Actuellement, quelque chose dans le n ° 3 ne rendra rien, sauf un aparté contenant la fonction get_sidebar(). Si tel est le cas, j'aimerais plutôt énumérer toutes les sections afin que j'y trouve quelque chose.

Je n'arrive pas à trouver de bons exemples de cela. Parmi toutes les fonctions de base, ils semblent chercher à savoir si cette barre latérale contient des widgets au sens de ceux disponibles dans la barre latérale - pas réellement rendus (sauf si quelque chose me manque). J'ai également essayé de définir une variable dans le widget et de la lire sur la page, mais cela ne semblait pas fonctionner non plus.

Comment puis-je conditionnellement afficher un widget supplémentaire si aucun autre n'est affiché? Ou, si de toute façon j'y ai ajouté ce widget, cachez-le si d'autres widgets sont rendus dans la même barre latérale?

Mise à jour : Lorsque je déclare "aucun affichage", je veux dire de sorte que le widget ne renvoie pas quelque chose en retour. Par exemple, mon widget obtient une liste d'éléments à afficher. Si la liste est vide, j'ai déjà une logique conditionnelle qui ne restitue pas (ni ne renvoie aucun écho) le widget. Un exemple est ci-dessous:

$subpages = wp_list_pages('title_li=&child_of='.$thisPageID.'&echo=0&depth=1');
if($subpages)
{
    // I have subpages, so display them
    echo $subpages;
}
else
{
     // no subpages, doesn't echo anything. 
}

Si le résultat est positif et que rien n’est rendu, je me demande s’il existe une logique que je pourrais utiliser dans la barre latérale pour savoir que je n’ai rien reçu, puis que quelque chose d’autre se substitue.

Une autre façon de voir les choses serait de dire que j'ai un widget par défaut, une liste de tout. Mais, si j'ai un autre contenu à afficher, je masque le widget par défaut et l'affiche à la place. Par conséquent, chaque page aurait quelque chose sur elle.

Mise à jour 2 : un ami a évoqué une idée à laquelle je n'avais pas pensé auparavant - ce widget pourrait simplement avoir le contraire de la logique qui l'a fait afficher l'un des précédents - plutôt que de s'appuyer sur la sortie des précédents . Par conséquent, puisque les deux s’exclueraient mutuellement, toutes les pages rendraient ce qu’elles devraient. Dans cet exemple simple, cela fonctionnerait. Je suis toujours très curieux de savoir s'il existe un moyen de vérifier si un widget renvoie quelque chose.

1
jmlumpkin

Je ne sais pas à 100% quelle est votre question, alors j'espère que cela peut vous orienter dans la bonne direction pour les widgets conditionnels. Je vais vous donner 3 options.

1.is_active_widget vérifie si les widgets sont actifs en fonction de l'ID de widget.

2. L'utilisation de is_active_sidebar et la création de plusieurs barres latérales vous permettent généralement de mieux contrôler la sortie du widget.

3. Utilisez un plugin, il existe plusieurs plugins qui ont une logique post ou conditionnelle intégrée.

4. Essayez d'utiliser le filtre widget_display_callback :

add_filter('widget_display_callback','your_custom_function',10,3);
1
Wyck

Je ne suis pas un expert de Wordpress, mais je ne pense pas qu'il soit possible de détecter directement un contenu vide, comme vous le suggérez. Il y a deux choses que je pourrais recommander.

1) Mes préférences: Ajoutez de la logique supplémentaire à votre widget "Afficher les parties de la section" pour qu'il affiche les sections si la page ne figure pas dans une section.

2) Créez un nouveau widget utilisant jQuery. Vous pouvez ensuite utiliser jQuery pour déterminer si les autres widgets ont un contenu et s’afficher en conséquence.

0
user1269310

Vous pouvez utiliser le plugin Widget Logic pour vérifier si un widget renvoie quelque chose et modifier son contenu si nécessaire.

Une fois installé, il vous permet d'utiliser le filtre 'widget_content'.

Ensuite, en fonction de l’arborescence DOM de votre widget, vous pouvez vérifier s’il possède des nœuds appropriés:

    function check_empty_widget($content='' , $widget_id='')    {
        if ($widget_id == "your-widget-id-1" || $widget_id == "your-widget-id-2" ) {
                $htmldoc = new DOMDocument();
                $htmldoc->loadHTML($content);
                $tag=$htmldoc->getElementsByTagName('ul')->item(0);
                return $tag->hasChildNodes()? $content:'';
        }
        return $content;
}
add_filter('widget_content', 'check_empty_widget',10,2);

Il est également possible de filtrer le contenu avec une expression régulière.

0
infrcl