web-dev-qa-db-fra.com

Remplacer dynamic_sidebar () dans le plugin?

J'écris un plugin personnalisé qui permet à une page particulière d'avoir sa propre barre latérale avec des widgets. Cela fonctionne très bien jusqu'à présent, mais ce que je voudrais faire est de le généraliser davantage et de permettre au plug-in de "remplacer" la barre latérale dynamique de n'importe quelle page (si elle a une barre latérale personnalisée) sans avoir à éditer les fichiers de modèle.

J'ai essayé plusieurs crochets et j'ai un peu fouillé dans le code, mais rien ne résiste à notre travail actuel.

Pour gagner du temps, je pensais voir si quelqu'un avait des solutions efficaces à ce problème? Je pourrais peut-être résoudre ce problème, mais cela met à rude épreuve mon cerveau "après les heures de travail".

Si ce n'est pas possible, je serais plus que disposé à avoir un code abrégé ou un appel de fonction qui le fait pour moi, mais j'aimerais vraiment le rendre indélicat et le faire fonctionner sans aucun changement de modèle.

3
dpgtfc

dynamic_sidebar() appelle wp_get_sidebars_widgets() pour obtenir la liste de toutes les barres latérales et de leurs widgets. Cette sortie est filtrée par sidebars_widgets, vous pouvez donc la modifier pour ajouter ou supprimer des widgets .

Ce tableau ne contient que des ID de widget, vous devez donc également enregistrer l'instance de widget (elle devrait se retrouver dans le tableau global $wp_registered_widgets). Je pense que vous pouvez le faire avec wp_register_sidebar_widget(), mais il est possible qu'il s'agisse d'un code plus ancien à partir du moment où un widget ne pouvait pas encore avoir plusieurs instances.

3
Jan Fabry

Oui, c'est tout à fait possible, mais pas la chose la plus facile à faire. Il m'a fallu environ deux mois pour le perfectionner lorsque je travaillais sur Total Widget Control , mais j'ai pu le faire.

Ce n'est pas une substitution directe, mais dynamic_sidebar charge le $registered_widgets global et parcourt les widgets, déclenchant le rappel de chacun de ces widgets.

Step oneDonc, ce que je finis par faire fut de saisir ce global registered_widgets, de le sauvegarder sur mon propre global, puis de remplacer les rappels d'origine par une fonction de rappel vide.

Ainsi, dynamic_sidebars était encore appelé, mais il ne fait rien.

Deuxième étapeLa prochaine étape fut un peu plus délicate et demanda un peu de débogage. Je devais prendre le nombre total de widgets d'origine pour la barre latérale donnée, puis garder une trace de la boucle sur laquelle se trouvait dynamic_sidebars. Lorsque dynamic_sidbars a atteint son dernier widget, j'ai appelé mon propre do_action ('trigger_new_sidebar').

Cela me permet essentiellement d'ajouter des actions à ce déclencheur et d'afficher tous les widgets que je voulais afficher.

Bonne chance!

1