web-dev-qa-db-ja.com

dynamic_sidebar()が管理セクションでfalseを返す

なんらかの理由でこのコードがWordPressの管理セクション(特にajaxがあるが他のページで問題が解決しない場合)では機能しないがうまく機能する

ob_start();
    dynamic_sidebar('frontpage_widgets');
$content = ob_get_clean();

print_r($content); // nothing 

サイドバーは、私が見たものから設定されます(サイドバーを登録したコードを呼び出したため)。

print_r($GLOBALS['wp_registered_sidebars'])

    Array
    (
        [frontpage_widgets] => Array
            (
                [name] => Frontpage Widgets
                [id] => frontpage_widgets
                [description] => Widgets for the Frontpage Widgetspage
                [class] => 
                [before_widget] => 
                ...

ウィジェットが管理セクションに表示されないようにするものはありますか?

編集 - 私はウィジェットがグローバルに設定されていないようです:$ wp_registered_widgetsは空です

2
rugbert

はい、サイドバーが登録された後のある時点でこの関数をフックするようにしなければなりません。完全には説明されていませんが、この関数 dynamic_sidebar( $index ) は、実行時までに登録されたとおりに登録およびロードされることを期待していることを暗黙のうちに示唆しています。そうでなければ、$index引数に一致するものは何もないでしょう。それはあなたの場合'frontpage_widgets'です。

サイドバーが番号で登録されている場合は、番号で取得する必要があります。登録時に名前があった場合は、それらの名前を使って検索します。

私が手から推測しなければならなかったならば、私は wp_loaded() をあなたが安全にフックすることができる最も早い行動であると言うでしょう。あるいは、必要に応じて、 wp_register_sidebar_widget にフックして、テストしている特定のウィジェットにフックすることもできます。

デバッグ目的でオブジェクトバッファリングを使用しているだけだと思います。あなたはほとんどの場合、編集するためにあなたのテンプレートのフックや領域に適切なアクションを見つけることができます。アクションが実行される順序を理解することは非常に貴重です。これを見てみましょう birgireによる答え さまざまなアクションが実行されたときの良い参考として。これはデバッグをずっと簡単にします。通常、適切なフック場所を見つけることは、作業内容によってはかなり直感的にわかります。

2
iyrin