web-dev-qa-db-fra.com

Comment afficher le widget par identifiant

J'ai récupéré l'identifiant du widget de cette façon:

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

Ça montre:

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

Maintenant, je veux juste montrer le widget recent-posts-2, ce qui signifie que je veux juste passer l'ID du widget recent-posts-2 à la fonction, et la fonction affichera le widget, tel que le code suivant:

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

Quand je echo display_widget($widget_id), il affichera le widget avec HTML et la classe du thème par défaut.

Avez-vous une idée?

5
Vikas Rana

Vous pouvez utiliser wp_get_sidebars_widgets() avec un rappel de filtre "à la demande". Cela signifie que nous ajoutons le rappel de filtre, juste avant l'appel de la fonction, puis le supprimons à nouveau à l'intérieur du rappel. Cela nous permet de ne l'utiliser qu'une seule fois. Cela signifie également que nous devons le définir juste avant l'appel à wp_get_sidebars_widgets() chaque fois que nous n'avons besoin que du widget spécifié.

Si vous avez besoin de différents widgets sur différentes pages, ajoutez simplement un switch/foreach dans le rappel et utilisez des balises conditionnelles telles que is_home(), etc.

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