2017-04-11 8 views
0

Wordpressには、アクティブなウィジェットIDを持つすべての登録サイドバーIDの多次元配列を吐き出す関数wp_get_sidebars_widgets()があります。PHParray traversal

コンテキストの場合、これはサンプル出力です:

Array 
(
[wp_inactive_widgets] => Array 
    (
    ) 

[sidebar-requests] => Array 
    (
     [0] => widget-demographics-4 
     [1] => recent-posts-7 
     [2] => widget-newsletter-11 
    ) 

[sidebar-team] => Array 
    (
     [0] => widget-sidebar-list-6 
     [1] => widget-donate-2 
    ) 

) 

私はそれがに住んでいるサイドバーのIDを見つけるために、ウィジェットの内部でこのコードを使用していますたとえば、一つだけ「ウィジェットが存在することができます。 -newsletter-11 'と呼ばれ、' sidebar-requests 'ウィジェット領域内に存在します。

このウィジェットのIDの格納に問題があります。ここでは、私が使用しようとしているコードの単純なバージョンです。この終わりに

$this_widget_id = 'widget-newsletter-11'; 
$this_widget_area_id; 

$all_widgets = wp_get_sidebars_widgets(); 

foreach ($all_widgets as $widget_area => $widget_id) { 
    if ($widget_id == $this_widget_id) 
     $this_widget_area_id = $widget_area; 
} 

、格納された変数、$this_widget_area_idは空のまま。

私は間違っていますか?

+1

foreach内に別のループを追加する必要があります。 '$ wp_get_sidebars_widgets()'によって返される配列は2レベル深いです。だからあなたのコードが現在立っているので、配列を文字列 "widget-newsletters-11"と比較しています – WillardSolutions

+0

ああ!完璧! {$ widget_id == $ this_widget_id} $ this_widget_area_id = $ widget_areaのように、 'foreach($ widget_ids as $ widget_order => $ widget_id){ if($ widget_id == $ this_widget_id)を追加しました。 } 'すべて正常に動作します – idealbrandon

+0

このコードを実行する前に、実際にアプローチを考え直す必要があります。 wp_get_sidebars_widgetsはこの用途に使用されるものではありません。 文書を読む: https://developer.wordpress.org/reference/functions/wp_get_sidebars_widgets/ – vlasits

答えて

1

私はあなたが同上に対する配列をチェックしている、あなたがその特定の配列は、IDが含まれているかどうかを確認すべきだと思う:

foreach ($all_widgets as $widget_area => $widget_items) { 
    if (in_array($this_widget_id, $widget_items, true)) 
     $this_widget_area_id = $widget_area; 
} 

うまくいけば、私はあなたの質問を誤解していませんでした。

1

外側の配列セットをループしたくありません。サイドバーリクエストをループするだけです。

$this_widget_id = 'widget-newsletter-11'; 
$this_widget_area_id; 

$all_widgets = wp_get_sidebars_widgets(); 
$all_widgets = $all_widgets[sidebar-requests]; 
foreach ($all_widgets as $widget_area => $widget_id) { 
    if ($widget_id == $this_widget_id) 
    $this_widget_area_id = $widget_area; 
} 
0

もう1つのループを追加することをお勧めします。ありがとうございます。私は追加した

foreach ($widget_ids as $widget_order => $widget_id) { 
    if ($widget_id == $this_widget_id) 
     $this_widget_area_id = $widget_area; 
} 

すべて期待どおりに動作します。ありがとう!

+0

もちろん、この全体のアプローチは悪い考えです。私は、このコードでどのような問題を解決しようとしているのか分かりませんが、wp_get_sidebars_widgets()を使用することは、これを実現する唯一の方法ではなく、確かに推奨された方法ではありません。 wp_get_sidebars_widgets()はプライベートとしてマークされており、テーマやプラグインの開発者が使用するためのものではありません。 – vlasits

+0

良いキャッチ。私はそれが単なる愚かなPHPエラーであることを知っていたので、私は実際にWPの特定のサポートを期待していなかったが、それにもかかわらず良いキャッチ。プライベートWP機能を使用せずに、同じ結果を達成するためのいくつかのオプションを検討します。 – idealbrandon

関連する問題