web-dev-qa-db-fra.com

Injectez des widgets d’un encadré à un autre avec PHP

Problème:

  • J'étends Twenty Seventeen et j'ai ajouté une nouvelle zone de widget ("call to action") au-dessus du contenu de la page d'accueil. Sur la page d'accueil, j'affiche la barre latérale à l'endroit où je le souhaite, mais sur d'autres pages, je souhaite que ces widgets (importants) s'affichent dans la barre latérale par défaut de Twenty Seventeen.
  • Jusqu'à présent, ce que j'ai fait est d'insérer une nouvelle zone de widgets au-dessus de celle principale pour les écrans autres que les écrans d'accueil afin d'afficher mes widgets. Cela vient avec divers soucis CSS/HTML et une déviation du thème parent que je ne veux pas traiter.
  • Ce que je veux vraiment, c’est que mes widgets "appel à l’action" soient injectés directement dans l’autre barre latérale, afin qu’ils se comportent exactement comme s’ils y avaient été ajoutés directement.

Donc, en gros, cela revient à . Il doit y avoir un moyen d’utiliser le code de filtre functions.php pour récupérer les widgets enregistrés dans une barre latérale, puis les injecter dans une autre barre latérale avant de les afficher.

Cela peut être utile pour toutes sortes de scénarios dans lesquels vous voulez le même widget dans plusieurs barres latérales en fonction du contexte, en particulier lorsque vous utilisez un thème parent inflexible qui n'a pas "assez de barres latérales".

Notez que je n'ai pas besoin d'être informé sur les plug-ins "Contrôle de widget" ni sur l'option Jetpack qui vous permet d'afficher/masquer des widgets individuels en fonction du contexte. Ce dont j'ai besoin, c'est d'un moyen de contrôler les autres barres latérales dans lesquelles un widget apparaîtra.

Les suggestions de plugins sont les bienvenues si elles résolvent le problème clé.

Merci! Je vais essayer de le comprendre moi-même de toute façon et je vous répondrai si j'ai une solution satisfaisante :)

1
jerclarke

Voici une idée (non testée) où nous injectons la barre latérale sidebar-inject avant la barre latérale sidebar-target à l'aide du hook dynamic_sidebar_before:

add_action( 'dynamic_sidebar_before', 'wpse_inject_sidebar', 10, 2 );

function wpse_inject_sidebar( $index, $has_widgets )
{   
    // Only target front-end
    if( is_admin() )
        return;

    // Only target 'sidebar-target'
    if( 'sidebar-target' !== $index )
        return;

    // Make sure 'sidebar-inject' is active
    if( ! is_active_sidebar( 'sidebar-inject' ) ) 
        return;

    // Avoid recursive loop
    remove_action( 'dynamic_sidebar_before', 'wpse_inject_sidebar', 10 );

    // Inject  'sidebar-inject' 
    dynamic_sidebar( 'sidebar-inject' );

    // Re-hook it again
    add_action( 'dynamic_sidebar_before', 'wpse_inject_sidebar', 10, 2 );       
}

Ici, nous guettons une boucle récursive en supprimant l'action avant d'appeler dynamic_sidebar() dans le rappel du hook.

Mais en ne ciblant que 'sidebar-target' ici et en veillant à ce que ce soit différent de 'sidebar-inject', nous évitons en réalité une boucle récursive.

1
birgire