web-dev-qa-db-fra.com

Existe-t-il un moyen de n’autoriser que certains types de widgets dans les barres latérales?

Par exemple, je veux que la barre latérale A n’affiche qu’un seul widget texte et la barre latérale B n’affiche ( rien d’autre que widgets de texte. Comment puis je faire ça?

Merci.

1
Luigi

Il est possible de se connecter à sidebars_widgets et de trouver quel widget se trouve dans quelle barre latérale.

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

En vérifiant ce tableau, vous pouvez éliminer des widgets particuliers.

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');

Cela fonctionne à l'avant et à l'arrière, mais n'empêche pas le déplacement d'un widget dans la mauvaise barre latérale à l'arrière. Autrement dit, vous pouvez toujours faire glisser un widget dans la mauvaise barre latérale et le faire paraître, mais il sera supprimé lors du prochain chargement de la page. Pour résoudre ce problème, vous devrez construire du code Javascript afin d’empêcher le glissement ou émettre une sorte d’avertissement.

1
s_ha_dum

Le panneau d'administration WordPress comporte trois zones de widgets:

  1. tous les widgets disponibles
  2. encadrés inscrits
  3. widgets inactifs

Afin de définir un widget imbattable quand il provient de "tous les widgets disponibles" ou "widgets inactifs" dans une "mauvaise" barre latérale, utilisez simplement la classe .widget et un identifiant pour l'identifier. Je dois définir le widget "Custom Recent Posts" pour qu'il soit impossible à supprimer:

Faites glisser depuis: zone des widgets disponibles, zone des widgets inactifs

$('.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
    })
  }
});

C'est bon, mais que se passe-t-il avec les widgets actifs? Ces widgets ne sont pas affectés par "glisser", mais "trier". Cette partie était un peu délicate, il est possible que ma solution ne soit pas cool, mais cela fonctionne:) Je dois configurer le widget "Custom Recent Posts" non triable (vous faites glisser, la logique jQuery est une sorte):

Faites glisser/Trier depuis les widgets actifs:

$( '.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');
  } 
});

J'avais besoin de la même logique dans mon projet, je teste maintenant et il semble fonctionner comme prévu l'essayer:) J'espère que ça aide

1
iEmanuele