it-swarm.com.de

Gibt es eine Möglichkeit, nur bestimmte Arten von Widgets in den Seitenleisten zuzulassen?

Ich möchte zum Beispiel, dass Sidebar A nur ein Text-Widget und Sidebar B alles andere als Text-Widgets anzeigt. Wie kann ich das machen?

Vielen Dank.

1
Luigi

Es ist möglich, sich mit sidebars_widgets zu verbinden und herauszufinden, welches Widget sich in welcher Seitenleiste befindet.

function dump_sidebar($a) {
  echo '<pre>'.var_export($a,true).'</pre>';
}
add_action( 'sidebars_widgets', 'dump_sidebar');

Durch Überprüfen dieses Arrays können Sie bestimmte Widgets entfernen.

function limit_sidebar_wpse_101279($sidebars_widgets) {
  if (!empty($sidebars_widgets['sidebar-1'])) {
    foreach ($sidebars_widgets['sidebar-1'] as $k =>$v) {
      if ('pages' == substr($v,0,5)) {
        unset($sidebars_widgets['sidebar-1'][$k]);
      }
    }
  }
  return $sidebars_widgets;
}
add_action( 'sidebars_widgets', 'limit_sidebar_wpse_101279');

Dies funktioniert sowohl im Front-End als auch im Back-End, verhindert jedoch nicht, dass ein Widget in die falsche Seitenleiste im Back-End gezogen wird. Das heißt, Sie können ein Widget immer noch in die falsche Seitenleiste ziehen, damit es anscheinend funktioniert. Es wird jedoch beim nächsten Laden der Seite entfernt. Um dieses Problem zu lösen, müssen Sie Javascript erstellen, um das Ziehen zu verhindern, oder eine Warnung ausgeben.

1
s_ha_dum

Das WordPress-Admin-Panel verfügt über drei Widgets:

  1. alle verfügbaren Widgets
  2. registrierte Seitenleisten
  3. inaktive Widgets

Um ein Widget von "Alle verfügbaren Widgets" oder "Inaktive Widgets" auf eine "falsche" Seitenleiste zu setzen, verwenden Sie einfach die .widget-Klasse und eine ID, um es zu identifizieren. Ich muss das Widget "Benutzerdefinierte Beiträge" so einstellen, dass es nicht mehr zu entfernen ist:

Ziehen aus: Bereich für verfügbare Widgets, Bereich für inaktive Widgets

$('.widget').on( 'dragcreate dragstart', function( event, ui ){
  id =  $(this).find( 'input[name="id_base"]').val();
  if( id == 'custom_recent_posts' ){ //check if the widget is the right one
    $(this).draggable({
      connectToSortable: '#primary-sidebar, #wp_inactive_widgets'//limit drop event only to these sidebars
    })
  }
});

Das ist in Ordnung, aber was passiert mit den aktiven Widgets? Diese Widgets sind nicht von "Ziehen", sondern von "Sortieren" betroffen. Dieser Teil war ein bisschen knifflig, es ist möglich, dass meine Lösung nicht cool ist, aber es funktioniert:

Ziehen/Sortieren aus den aktiven Widgets:

$( '.widgets-sortables' ).on( 'sortactivate sort', function( event, ui ){
  id = $(ui.item).find( 'input[name="id_base"]').val();
  if ( id == 'custom_recent_posts'){//identifying the wrong or right widget

      if ( $(ui.sender).attr( 'id' ) != 'primary-sidebar' ){// if it's coming from a sidebar that is not his "right" place, set 'connectWith' option to this sidebar and the inactive widgets area
        $(this).sortable('option', 'connectWith', '#primary-sidebar, #wp_inactive_widgets');
        $(this).sortable('refresh');
      }else{//else set 'connectWith' to false
        $(this).sortable('option', 'connectWith', false);
        $(this).sortable('refresh');
      }

  }else{// else default behavior 
    $(this).sortable('option', 'connectWith', 'div.widgets-sortables');
    $(this).sortable('refresh');
  } 
});

Ich brauchte die gleiche Logik in meinem Projekt, ich teste sie jetzt und es scheint zu funktionieren, wie erwartet. Probiere es aus:) Hoffe, es hilft

1
iEmanuele