it-swarm.com.de

Rufen Sie dynamic_sidebar auf, schließen Sie jedoch benannte Widgets ein oder aus?

Ist es möglich, bestimmte benannte Widgets, die einem benannten Aufruf von dynamic_sidebar zugewiesen sind, einzuschließen oder auszuschließen?

Wenn ich beispielsweise eine Seitenleiste mit dem Namen "my_sidebar" registriert habe und der Benutzer ein "Links" -Widget darin platziert hat, möchte ich in der Lage sein, es basierend auf einer benutzerdefinierten Einstellung in meinem Themenoptionenbedienfeld einzuschließen oder auszuschließen.

Ist das möglich?

Alle Erkenntnisse sehr geschätzt.

6
Scott B

dynamic_sidebar() ruft wp_get_sidebars_widgets() auf, um alle Widgets pro Seitenleiste abzurufen. Ich denke, das Filtern dieser Ausgabe ist der beste Weg, um ein Widget aus einer Seitenleiste zu entfernen.

add_filter( 'sidebars_widgets', 'wpse17681_sidebars_widgets' );
function wpse17681_sidebars_widgets( $sidebars_widgets )
{
    if ( is_page() /* Or whatever */ ) {
        foreach ( $sidebars_widgets as $sidebar_id => &$widgets ) {
            if ( 'my_sidebar' != $sidebar_id ) {
                continue;
            }
            foreach ( $widgets as $idx => $widget_id ) {
                // There might be a better way to check the widget name
                if ( 0 === strncmp( $widget_id, 'links-', 6 ) ) {
                    unset( $widgets[$idx] );
                }
            }
        }
    }

    return $sidebars_widgets;
}
7
Jan Fabry

Ich füge eine weitere Antwort hinzu, um diese Frage zu beantworten: - Wie kann ich bestimmte Widgets von der Anzeige auf der Startseite/Startseite ausschließen?

WordPress hat eine interne Funktion _get_widget_id_base() Ich bin mir nicht sicher, wie sicher ich es verwenden soll. Dies ist jedoch die Methode, mit der WordPress die Widget-ID ermittelt, indem die Widget-ID anstelle von strpos() und strncmp() verwendet wird.

Beispiel:-

add_filter('sidebars_widgets', 'conditional_sidebar_widget');
/**
 * Filter the widget to display
 * @param array $widets Array of widget IDs
 * @return array $widets Array of widget IDs
 */
function conditional_sidebar_widget($widets) {
    $sidebar_id = 'sidebar-1'; //Sidebar ID in which widget is set

    if ( (is_home() || is_front_page()) && !empty($widets[$sidebar_id]) && is_array($widets[$sidebar_id]) ) {
        foreach ($widets[$sidebar_id] as $key => $widget_id) {
            $base_id = _get_widget_id_base($widget_id);
            if ($base_id == 'recent-posts') {
                unset($widets[$sidebar_id][$key]);
            }
        }
    }

    return $widets;
}
1
Sumit

Als ich Jan antwortete, fand ich strpos() anstatt strncmp(), um den Widget-Namen zu überprüfen (es ist schneller ..)

Im Folgenden finden Sie eine ähnliche (funktionierende und getestete) Funktion, mit der Sie zum gleichen Ergebnis gelangen:

 add_filter( 'sidebars_widgets', 'hide_widgets' );
 function hide_widgets( $excluded_widgets )
    {
        if ( is_page() /* Or whatever */ ) {
     //set the id in 'sidebar-id' to your needs
            foreach ( $excluded_widgets['sidebar-id'] as $i => $inst) {

     //in this example we'll check if the id for the rss widgets exists.(change it to suit your needs)

            $pos = strpos($inst, 'rss');

            if($pos !== false)
            {
                //unsetting the id will remove the widget 
                unset($excluded_widgets['sidebar-id'][$i]);
            }
        }    
    }
    return $sidebars_widgets;
    }
0
maioman