web-dev-qa-db-fra.com

Activer/désactiver l'option dans les widgets de la barre latérale

Je voudrais utiliser l'option toggle dans mes widgets de la barre latérale. Mais mes widgets de la barre latérale ne génèrent pas d'identifiant unique. C'est le code de la barre latérale de mon registre.

register_sidebar(array(
        'name' => 'Main Sidebar',
        'before_widget' => '<div class="widget %2$s">',
        'after_widget' => '</div></div></div>',
        'before_title' => '<div class="titlediv">',
        'after_title' => '<a class="dropdown" style="float: right;" href="#%1$s" data-toggle="collapse"><b class="toggleicon"></b></a></div><div id="%1$s" class="collapse in"><div id="%1$s" class="boxdiv">'
    )

Voici comment je vais obtenir une sortie

<div class="widget widget_stc-followers">       
<div class="titlediv">Widget Title<a class="dropdown" style="float: right;" href="#%1$s" data-toggle="collapse"><b class="toggleicon"></b></a></div><div id="%1$s" class="collapse in"><div id="%1$s" class="boxdiv">       
Widget content
</div></div></div>

Je veux dire que %1$s ne travaille pas dans after_title. Je veux utiliser un identifiant unique. Alors, est-ce que quelqu'un peut me donner des conseils pour que cela fonctionne? Merci

1
Giri

Le after_title ne subit aucune transformation. En fait, seul le before_widget fait:

http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/widgets.php#L876

Cependant, un peu plus bas, vous pouvez voir que $params = apply_filters( 'dynamic_sidebar_params', $params ); contient un filtre que vous pouvez raccorder pour faire votre propre filtrage.

add_filter( 'dynamic_sidebar_params', 'wpse_45418_change_after_title' );
function wpse_45418_change_after_title( $params ) {

    $id = $params[0]['widget_id'];

    if ( $id != 'mywidget' ) return $params;

    global $wp_registered_widgets;
    foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {
        if ( is_string($cn) )
            $classname_ .= '_' . $cn;
        elseif ( is_object($cn) )
            $classname_ .= '_' . get_class($cn);
    }

    $params[0]['after_title'] = sprintf($params[0]['after_title'], $id, $classname );

    return $params;
}

C'est la réponse générale à la raison pour laquelle vos identifiants ne sont pas rendus. À partir de cet exemple, pour générer vos propres identifiants uniques dans la clé after_title, vous devez faire quelque chose de similaire, mais fournir des identifiants uniques, comme suit:

add_filter( 'dynamic_sidebar_params', 'wpse_45418_change_after_title' );
function wpse_45418_change_after_title( $params ) {

    $id = $params[0]['widget_id'];
    if ( $id != 'mywidget' ) return $params;

    $url = esc_url( 'http://some-url-you-need.com' );
    $uidcollapse = $id.'-unique-id';
    $uidboxdiv = $id.'-another-unique-id';

    // <a class="dropdown" style="float: right;" href="%1$s" data-toggle="collapse"><b class="toggleicon"></b></a></div><div id="#%2$s" class="collapse in"><div id="#%3$s" class="boxdiv">

    $params[0]['after_title'] = sprintf($params[0]['after_title'], $url, $classname, $uidcollapes, $uidboxdiv );

    return $params;
}
1
soulseekah

Remarque: L'identifiant doit être unique et vous essayez de définir le même identifiant sur 2 div différentes.

Maintenant, les attributs id %1$s et class %2$s ne fonctionnent que dans l'argument before_widget pour autant que je sache, mais vous pouvez utiliser pour basculer entre les widgets, mais avec un peu plus que data-toggle="collapse".

1
Bainternet