私はこのようにしてウィジェット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でウィジェットを表示し、デフォルトのテーマのクラスです。
何か考えがありますか?
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.