web-dev-qa-db-de.com

Wie Widget nach ID anzeigen

Ich habe die Widget-ID folgendermaßen abgerufen:

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

Es zeigt:

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

Jetzt möchte ich nur das Widget recent-posts-2 anzeigen, dh, ich möchte nur die Widget-ID recent-posts-2 an die Funktion übergeben, und die Funktion zeigt das Widget an, z. B. den folgenden Code:

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

Wenn ich echo display_widget($widget_id), wird das Widget mit HTML und der Klasse des Standardthemas angezeigt.

Hast du irgendeine Idee?

5
Vikas Rana

Sie können wp_get_sidebars_widgets() mit einem "on demand" -Filterrückruf verwenden. Das heißt, wir fügen den Filter-Callback unmittelbar vor dem Aufruf der Funktion hinzu und entfernen ihn dann wieder direkt innerhalb des Callbacks. Dies erlaubt uns, es nur einmal zu benutzen. Dies bedeutet auch, dass wir es jedes Mal, wenn wir nur das angegebene Widget benötigen, direkt vor dem Aufruf von wp_get_sidebars_widgets() einstellen müssen.

Wenn Sie unterschiedliche Widgets auf verschiedenen Seiten benötigen, fügen Sie einfach einen switch/foreach in den Rückruf ein und verwenden Sie bedingte Tags wie is_home() usw.

// 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