web-dev-qa-db-ja.com

IDによるウィジェットの表示方法

私はこのようにしてウィジェットIDを取得しました:

$the_sidebars = wp_get_sidebars_widgets();
print_r( $the_sidebars['sidebar-1'] );

それが示している:

Array ( [0] => recent-posts-2 [1] => recent-comments-2
        [2] => archives-2 [3] => categories-2 [4] => meta-2 ) 

recent-posts-2ウィジェットを表示したいだけなので、ウィジェットID recent-posts-2を関数に渡したいだけで、次のコードのように関数はウィジェットを表示します。

function display_widget($widget_id) {
  ...
  return $wid;
}

私がecho display_widget($widget_id)するとき、それはHTMLでウィジェットを表示し、デフォルトのテーマのクラスです。

何か考えがありますか?

5
Vikas Rana

wp_get_sidebars_widgets()は "オンデマンド"フィルタコールバックと共に使用できます。これは、関数の呼び出しの直前に、フィルタコールバックを追加してから、コールバックの内側で再び削除することを意味します。これにより、1回だけ使用できます。また、指定されたウィジェットだけが必要になるたびに、wp_get_sidebars_widgets()を呼び出す直前に設定する必要があるということです。

ページごとに異なるウィジェットが必要な場合は、コールバック内にswitch/foreachを追加し、is_home()などの条件付きタグを使用するだけです。

// For your functions.php
/**
 * Call a specific sidebar widget
 * Filter callback
 * 
 * @param array $sidebars_widgets
 * @return mixed bool/object $sidebars_widgets The widget or FALSE if not found
 */
function filter_sidebars_widgets( $sidebars_widgets )
{
    // SET your wanted widget right here:
    $wanted = 'recent-posts-2';

    // Prevent intercepting another call - on demand filter(!)
    remove_filter( current_filter(), __FUNCTION__ );

    if ( is_array( $sidebars_widgets ) )
    {
        // array_search() returns FALSE in case the widget isn't present
        $index            = array_search( $wanted, $sidebars_widgets, FALSE );
        $sidebars_widgets = $sidebars_widgets[ $index ];
    }
    else
    {
        // we add a manual FALSE in case the widget isn't present
        $sidebars_widgets = $wanted === $sidebars_widgets ? $sidebars_widgets : FALSE;
    }

    return $sidebars_widgets;
}

// In your template: First add the filter...
add_filter( 'sidebars_widgets', 'filter_sidebars_widgets' );
// ...then call the function.
$widget = wp_get_sidebars_widgets();

// Now do something with $widget :)

// As we removed the filter inside the callback, any other call
// to wp_get_sidebars_widgets(); will behave like normal.
2
kaiser