italia / design-comuni-wordpress-theme

Tema Wordpress per i siti dei comuni italiani
GNU Affero General Public License v3.0
33 stars 33 forks source link

Third party breadcrumb filter #410

Closed milesimarco closed 5 months ago

milesimarco commented 8 months ago

Descrizione

Aggiunta di un filtro per consentire a funzioni e plugin terzi di variare il risultato dei breadcrumb, ad esempio aggiungendo prefissi o sezioni in alcuni livelli.

Esempio di utilizzo:

add_filter( 'dci_get_breadcrumb_items',  'my_test_function', 10, 2 );

function my_test_function( $items ) {     
 $items[] =  "<a href='URL'>TITLE</a>";
 return $items;
}

Checklist

enrimk commented 6 months ago

ogni cambiamento potrebbe avere impatti negativi.

O positivi: al momento breadcrumb.php non è per nulla conforme ai requisiti. Inoltre, il modo in cui è stato adattato a partire dal plugin breadcrumb-trail impedisce di correggerne il comportamento senza riscriverne molte parti. Ad es., viene diminuita di molto l'utilità del filtro "_breadcrumb_trailitems", che permetterebbe di intervenire più puntualmente, e che invece può venire eluso dai return aggiunti prima.

La PR offre un modo di intervenire per sostituire le breadcrumb del tema con le proprie, con una forma di short-circuit che previene il tema. Già c'è qualcosa del genere, ma è più radicale perché sostituisce tutto l'oggetto.

Serve sicuramente agli sviluppatori di plugin esterni (il che dev'essere l'intento dell'OP), ma può tornare utile anche per un child theme. Anche se, per correggere i difetti fondamentali che impattano sull'asseverazione, sarebbe meglio ristrutturare il modulo all'origine.

astagi commented 6 months ago

Grazie @enrimk attendiamo un riscontro di @milesimarco

zetareticoli commented 5 months ago

@enrimk temo che non possiamo dare uno strumento così flessibile per personalizzare le breadcrumb, perché sarebbe troppo facile alterarle e non passare asseverazione.

milesimarco commented 5 months ago

Ciao, in generale la modifica apre possibilità di personalizzazione, e come tale positiva o negativa a seconda di come venga utilizzata.

Può essere utilizzata male e portare a non superare l'asseverazione, analogamente può essere fatta una riscrittura dell'oggetto o una modifica da template tramite temi child con lo stesso risultato quindi la responsabilità di come vengono integrati tra di loro gli strumenti messi a disposizione dipende dalle capacità o dal buon senso di chi la implementa e che ha responsabilità per asseverazione.

Attualmente, le breadcrumb non sono gestite correttamente quando si utilizzano plugin di terze parti, specialmente nel caso di tassonomie o post type aggiuntivi. Questo è particolarmente rilevante per coloro che utilizzano https://github.com/WPGov/amministrazione-trasparente (che potrebbe beneficiare del nuovo filtro) ma anche per altri sistemi di gestione eventi o qualsiasi altro plugin anche sviluppato da chi implementa il singolo sito WP.

Credo che in ogni caso l'apertura sia sensata, forse sarebbe utile anche una ristrutturazione del modulo o una naming convention più spinta per gestire e documentare questi filtri, ma temo che questi casi d'uso ad oggi non giustifichino un effort in tal senso.

Qui un esempio di integrazione che adotterei su https://github.com/WPGov/amministrazione-trasparente (ancora non rilasciato)

add_filter( 'dci_get_breadcrumb_items',  [ $this, 'dci_get_breadcrumb_items' ], 10, 2 );

function dci_get_breadcrumb_items( $items ) { // Design Comuni WordPress theme

if ( is_tax(array('tipologie') ) ) {
      $terms = get_the_terms( get_the_ID(), 'tipologie');
      $group = at_getGroupNameByTerm( $terms[0]->term_id );

      if ( at_option('page_id') ) {
          $items[] =  "<a href='".get_permalink( at_option('page_id') )."'>".get_the_title( at_option('page_id') )."</a>";
          $items[] =  '<a href="'.get_permalink( at_option('page_id') ).'#'.$group.'">'.at_getGroupNameBySlug($group).'</a>';
      }
      $taxonomy = get_queried_object();
      $items[] = $taxonomy->name;
      return $items;

  } else if (get_post_type() == 'amm-trasparente') {

      $terms = get_the_terms( get_the_ID(), 'tipologie');
      $group = at_getGroupNameByTerm( $terms[0]->term_id );

      if ( at_option('page_id') ) {
          $items[] =  "<a href='".get_permalink( at_option('page_id') )."'>".get_the_title( at_option('page_id') )."</a>";
          $items[] =  '<a href="'.get_permalink( at_option('page_id') ).'#'.$group.'">'.at_getGroupNameBySlug($group).'</a>';
      }

      if($terms){
          $items[] = sprintf( '<a href="%s">%s</a>', esc_url( get_term_link( $terms[0] ) ), $terms[0]->name );
      }
      $items[] = get_the_title();
      return $items;

  } 
  return;
}
astagi commented 5 months ago

Grazie infinite @milesimarco

fabricius4 commented 2 months ago

Ciao, in generale la modifica apre possibilità di personalizzazione, e come tale positiva o negativa a seconda di come venga utilizzata.

Può essere utilizzata male e portare a non superare l'asseverazione, analogamente può essere fatta una riscrittura dell'oggetto o una modifica da template tramite temi child con lo stesso risultato quindi la responsabilità di come vengono integrati tra di loro gli strumenti messi a disposizione dipende dalle capacità o dal buon senso di chi la implementa e che ha responsabilità per asseverazione.

Attualmente, le breadcrumb non sono gestite correttamente quando si utilizzano plugin di terze parti, specialmente nel caso di tassonomie o post type aggiuntivi. Questo è particolarmente rilevante per coloro che utilizzano https://github.com/WPGov/amministrazione-trasparente (che potrebbe beneficiare del nuovo filtro) ma anche per altri sistemi di gestione eventi o qualsiasi altro plugin anche sviluppato da chi implementa il singolo sito WP.

Credo che in ogni caso l'apertura sia sensata, forse sarebbe utile anche una ristrutturazione del modulo o una naming convention più spinta per gestire e documentare questi filtri, ma temo che questi casi d'uso ad oggi non giustifichino un effort in tal senso.

Qui un esempio di integrazione che adotterei su https://github.com/WPGov/amministrazione-trasparente (ancora non rilasciato)

add_filter( 'dci_get_breadcrumb_items',  [ $this, 'dci_get_breadcrumb_items' ], 10, 2 );

function dci_get_breadcrumb_items( $items ) { // Design Comuni WordPress theme

if ( is_tax(array('tipologie') ) ) {
      $terms = get_the_terms( get_the_ID(), 'tipologie');
      $group = at_getGroupNameByTerm( $terms[0]->term_id );

      if ( at_option('page_id') ) {
          $items[] =  "<a href='".get_permalink( at_option('page_id') )."'>".get_the_title( at_option('page_id') )."</a>";
          $items[] =  '<a href="'.get_permalink( at_option('page_id') ).'#'.$group.'">'.at_getGroupNameBySlug($group).'</a>';
      }
      $taxonomy = get_queried_object();
      $items[] = $taxonomy->name;
      return $items;

  } else if (get_post_type() == 'amm-trasparente') {

      $terms = get_the_terms( get_the_ID(), 'tipologie');
      $group = at_getGroupNameByTerm( $terms[0]->term_id );

      if ( at_option('page_id') ) {
          $items[] =  "<a href='".get_permalink( at_option('page_id') )."'>".get_the_title( at_option('page_id') )."</a>";
          $items[] =  '<a href="'.get_permalink( at_option('page_id') ).'#'.$group.'">'.at_getGroupNameBySlug($group).'</a>';
      }

      if($terms){
          $items[] = sprintf( '<a href="%s">%s</a>', esc_url( get_term_link( $terms[0] ) ), $terms[0]->name );
      }
      $items[] = get_the_title();
      return $items;

  } 
  return;
}

visto che ho lo stesso problema, poichè utilizzo il plugin amministrazione trasparente sul tema comuni, dove dovrei inserire questa modifica/aggiunta per far funzionare le breadcrumb? Grazie

enrimk commented 2 months ago

dove dovrei inserire questa modifica/aggiunta

Va bene dovunque; in functions.php di un child theme, o in un mini-plugin apposta. Un mini-plugin magari è meglio: così quando AT implementerà la modifica nativamente, farai prima a disattivare la tua (per non avere, a quel punto, il path doppio).

Però, dopo la 1.9.1, va formulato così (ad es):

add_filter( 'dci_get_breadcrumb_items',  'xyz_filter_dci_get_breadcrumb_items', 10, 2 );
function xyz_filter_dci_get_breadcrumb_items( $is_custom, $items ) {
  // [...]
  return $items;
}
fabricius4 commented 2 months ago

dove dovrei inserire questa modifica/aggiunta

Va bene dovunque; in functions.php di un child theme, o in un mini-plugin apposta. Un mini-plugin magari è meglio: così quando AT implementerà la modifica nativamente, farai prima a disattivare la tua (per non avere, a quel punto, il path doppio).

Però, dopo la 1.9.1, va formulato così (ad es):

add_filter( 'dci_get_breadcrumb_items',  'xyz_filter_dci_get_breadcrumb_items', 10, 2 );
function xyz_filter_dci_get_breadcrumb_items( $is_custom, $items ) {
  // [...]
  return $items;
}

ho provato ma niente. Entro nel dettaglio della problematica. Sto utilizzando il plug-in Amministrazione trasparente e ho inserito lo shortcode in una pagina. Ora quando entro nella singola voce, la breadcrumb risulta come da allegato, ma se clicco sulla voce "Amministrazione trasparente" della breadcrumb rimanda a comune...xxx.../amm-trasp/ che ovviamente non è il link corretto della pagina. Immagine

enrimk commented 2 months ago

Siamo ormai terribilmente OT qui. Ma riguarderei sia il codice della tua patch (è attivo?), sia il tuo setup del plugin AT (pagina? gruppi?).