web-dev-qa-db-ja.com

プラグインのdynamic_sidebar()を上書きしますか?

私は、特定のページにウィジェット付きの独自のサイドバーを持たせることを可能にするカスタムプラグインを書いています。今のところうまくいきますが、もっと一般化して、テンプレートファイルを編集しなくても、プラグインが任意のページの動的サイドバー(カスタムサイドバーがある場合)を「オーバーライド」できるようにしたいのです。

私はいくつかのフックを試してみて、コードを少し詳しく調べましたが、私たちの立場に立っているものもこれまでのところうまくいきません。

時間を節約するために、この問題に対する有効な解決策が他にあるかどうかを確認したいと思いますか。私はこの問題を解決することができるかもしれませんが、それは私の "勤務時間外"の頭脳に負担をかけています。

それが不可能な場合は、これを実行するための短いコードまたは関数呼び出しを用意しても構いませんが、本当に馬鹿げた証拠にして、テンプレートを変更しなくても機能するようにしたいです。

3
dpgtfc

dynamic_sidebar()wp_get_sidebars_widgets()を呼び出して、すべてのサイドバーとそのウィジェットのリストを取得します。この出力はsidebars_widgetsを通してフィルタリングされるので、 それを修正してウィジェットを追加または削除することができます

この配列にはウィジェットIDしか含まれていないので、ウィジェットインスタンスも登録する必要があります(それはグローバルな$wp_registered_widgets配列になっているはずです)。私はあなたがwp_register_sidebar_widget()でこれを行うことができると思いますが、これはウィジェットがまだ複数のインスタンスを持つことができなかった時から古いコードである可能性があります。

3
Jan Fabry

はい、それは完全に可能ですが、できる最も簡単なことではありません。私が Total Widget Control に取り組んでいたとき、それを完成させるのに約2ヶ月かかりましたが、私はそれをすることができました。

これは直接のオーバーライドではありません。dynamic_sidebar$registered_widgetsグローバルをロードしてウィジェットをループ処理し、これらの各ウィジェットのコールバックをトリガーします。

ステップ1結局、このregistered_widgetsグローバルを取得し、自分のグローバルにバックアップしてから、元のコールバックを空のコールバック関数に置き換えることになりました。

このようにしてdynamic_sidebarsはまだ呼び出されましたが、実際には何もしません。

ステップ2次のステップは少し面倒で、少しデバッグが必要でした。特定のサイドバーの元のウィジェットの総数を数え、そのdynamic_sidebarsがどのループにあったのかを追跡する必要がありました。 dynamic_sidbarsが最後のウィジェットに到達したとき、私は自分のdo_action( 'trigger_new_sidebar')を呼び出しました。

これにより基本的に、このトリガーにアクションを追加したり、表示したいウィジェットを表示したりすることができます。

がんばろう!