web-dev-qa-db-ja.com

Dynamic_sidebarを呼び出しますが、名前付きウィジェットを含めたり除外したりしますか?

名前付きdynamic_sidebar呼び出しに割り当てられている特定の名前付きウィジェットを含めたり除外したりすることは可能ですか?

たとえば、 "my_sidebar"という名前のサイドバーを登録していて、その中にユーザーが "リンク"ウィジェットを配置した場合は、テーマオプションパネルのカスタム設定に基づいて追加または除外できるようにします。

これは可能ですか?

どんな洞察も大いに感謝しています。

6
Scott B

dynamic_sidebar()はサイドバーごとにすべてのウィジェットを取得するためにwp_get_sidebars_widgets()を呼び出します。サイドバーからウィジェットを削除するには、この出力をフィルタリングするのが最善の方法だと思います。

add_filter( 'sidebars_widgets', 'wpse17681_sidebars_widgets' );
function wpse17681_sidebars_widgets( $sidebars_widgets )
{
    if ( is_page() /* Or whatever */ ) {
        foreach ( $sidebars_widgets as $sidebar_id => &$widgets ) {
            if ( 'my_sidebar' != $sidebar_id ) {
                continue;
            }
            foreach ( $widgets as $idx => $widget_id ) {
                // There might be a better way to check the widget name
                if ( 0 === strncmp( $widget_id, 'links-', 6 ) ) {
                    unset( $widgets[$idx] );
                }
            }
        }
    }

    return $sidebars_widgets;
}
7
Jan Fabry

私はこの質問に答えるために別の答えを追加しています: - どのようにホーム/フロントページに表示されないように特定のウィジェットを除外するには?

WordPressは内部関数を持っています _get_widget_id_base() それを使うのがどれほど安全かわからない。しかしこれはWordPressがstrpos()strncmp()の代わりにウィジェットIDを使ってウィジェットIDベースを取得するために使う方法です。

例: -

add_filter('sidebars_widgets', 'conditional_sidebar_widget');
/**
 * Filter the widget to display
 * @param array $widets Array of widget IDs
 * @return array $widets Array of widget IDs
 */
function conditional_sidebar_widget($widets) {
    $sidebar_id = 'sidebar-1'; //Sidebar ID in which widget is set

    if ( (is_home() || is_front_page()) && !empty($widets[$sidebar_id]) && is_array($widets[$sidebar_id]) ) {
        foreach ($widets[$sidebar_id] as $key => $widget_id) {
            $base_id = _get_widget_id_base($widget_id);
            if ($base_id == 'recent-posts') {
                unset($widets[$sidebar_id][$key]);
            }
        }
    }

    return $widets;
}
1
Sumit

Janの答えを拡張すると、ウィジェット名をチェックするのにstrpos()ではなくstrncmp()が見つかりました(もっと速いです)。

以下に、同様の機能(動作中およびテスト済み)を見つけて、同じ結果を得ることができます。

 add_filter( 'sidebars_widgets', 'hide_widgets' );
 function hide_widgets( $excluded_widgets )
    {
        if ( is_page() /* Or whatever */ ) {
     //set the id in 'sidebar-id' to your needs
            foreach ( $excluded_widgets['sidebar-id'] as $i => $inst) {

     //in this example we'll check if the id for the rss widgets exists.(change it to suit your needs)

            $pos = strpos($inst, 'rss');

            if($pos !== false)
            {
                //unsetting the id will remove the widget 
                unset($excluded_widgets['sidebar-id'][$i]);
            }
        }    
    }
    return $sidebars_widgets;
    }
0
maioman