Un widget elenco forum migliore per bbPress

Quando bbPress era ancora un'installazione standalone, l'avevo provato e non ero davvero impressionato. Le cose erano goffe e non sempre funzionava come doveva. Dopo aver languito per alcuni anni, Automattic ha deciso di prendere bbpress e trasformarlo in un plug-in, migliorando la funzionalità e facendo diventare un forte concorrente tra le altre opzioni del forum per WordPress.

La cosa grandiosa di bbPress è che funziona con la maggior parte dei temi e si scava automaticamente attraverso il CSS del tema. Potrebbe essere necessario cambiare alcune cose qua o là per farlo sembrare come si desidera, ma è praticamente una soluzione pronta per l'uso. L'unico problema che ho avuto è stato il fatto che il widget Elenco forum non era effettivamente quello del forum di supporto di bbPress.


Widget Elenco forum sul forum di supporto bbPress

Per qualche motivo, il widget Elenco forum fornito con bbPress non ha il conteggio argomento. E non funziona così bene con le categorie del forum. Alla fine, ho deciso di mettere insieme un piccolo plugin per aggiungere quelle funzionalità.


L'umile inizio di un plugin

Se hai mai creato un plug-in in precedenza, saprai a cosa serve questa piccola sezione:

 

In caso contrario, è qui che si aggiunge il nome del plugin e le informazioni richieste in modo che appaia correttamente nella pagina di amministrazione del plugin della propria installazione di WordPress.


L'API Widget

Ogni volta che si crea un widget, è necessario estendere l'API Widget. Se quella frase non ha senso per te, non preoccuparti. Significa solo che è necessario mettere alcune cose in ordine affinché il tuo widget funzioni.

Ecco come appare il codice API di base del widget:

 class BBP_Forums_Topic_Count_Widget estende WP_Widget public function __construct () // widget actual processes widget di funzioni pubbliche ($ args, $ istanza) // restituisce il contenuto del widget modulo di funzione pubblico ($ instance) // restituisce le opzioni modulo su admin aggiornamento della funzione pubblica ($ new_instance, $ old_instance) // elabora le opzioni del widget da salvare

Questo tutorial non tratta in realtà i dettagli dell'API Widget, quindi ti suggerisco di dare un'occhiata all'API Widget nel codice WordPress.


Estensione dell'API del widget

Passiamo attraverso il codice API un blocco alla volta. Innanzitutto, è necessario aggiungere alcune informazioni di base sul widget:

 public function __construct () $ widget_ops = array ('classname' => 'bbp_forums_topic_count_widget_options', 'description' => __ ('Un elenco di forum categorizzati con il loro topic count')); genitore :: __ costrutto (falso, __ ('(bbPress) Elenco forum con conteggio argomenti'), $ widget_ops); 

Poi viene il codice di visualizzazione per come apparirà il widget sul front-end. Devi usare wp_list_pages () per organizzare l'elenco dei forum categorizzati. Devi anche includere un deambulatore per organizzare l'elenco, ma ci arriverò un po 'più tardi.

 widget di funzioni pubbliche ($ args, $ istanza) extract ($ args); $ title = apply_filters ('bbp_forum_widget_title', $ instance ['title']); echo $ before_widget; if (! empty ($ title)) echo $ before_title. $ titolo. $ After_title; ?> 
    ", 'post_type' => bbp_get_forum_post_type (), 'sort_column' => 'menu_order', 'walker' => nuovo Forum_List_Walker, 'no_found_rows' => true,))??>

C'è solo un'opzione nel widget in modo che il modulo di amministrazione abbia solo bisogno di quanto segue:

 modulo di funzione pubblica ($ istanza) $ title = vuoto ($ istanza ['titolo'])? ": esc_attr ($ istanza ['titolo']);?> 

Con una sola opzione di input, il blocco di aggiornamento richiede solo un semplice controllo:

 aggiornamento della funzione pubblica ($ new_instance, $ old_instance) $ instance = $ old_instance; $ instance ['title'] = strip_tags ($ new_instance ['title']); restituire $ istanza; 

Registrazione del widget

Hai esteso l'API, quindi ora devi assicurarti di registrare il widget o non sarai in grado di usarlo affatto.

 add_action ('widgets_init', function () register_widget ('BBP_Forums_Topic_Count_Widget'););

Prendendolo per una passeggiata

Per assicurarti che i tuoi forum categoriali vengano visualizzati correttamente nel widget, devi utilizzare un deambulatore avanzato. Hai chiamato un'istanza di walker nel wp_list_pages () funzione di cui sopra in modo da poter passare attraverso i forum e le categorie per assicurarsi che tutti vadano a posto.

Suggerisco di leggere le lezioni sul walker poiché è un po 'complicato. Per fortuna sono riuscito a craccarlo per ottenere ciò che mi serviva per il plugin.

 class Forum_List_Walker estende Walker var $ tree_type = 'page'; var $ db_fields = array ('parent' => 'post_parent', 'id' => 'ID'); function start_lvl (& $ output, $ depth = 0, $ args = array ()) $ indent = str_repeat ("\ t", $ depth); $ output. = "\ n $ indent
    \ n "; funzione end_lvl (& $ output, $ depth = 0, $ args = array ()) $ indent = str_repeat (" \ t ", $ depth); $ output. =" $ indent
\ n "; funzione start_el (& $ output, $ page, $ depth, $ args) $ indent = ($ depth)? str_repeat (" \ t ", $ depth):"; estratto ($ args, EXTR_SKIP); $ css_class = array (); $ has_children = forum_list_widget_has_children ($ page-> ID); if (! bbp_is_single_user () && $ current_page = get_the_ID ()) $ _current_page = get_post ($ current_page); if (in_array ($ page-> ID, $ _current_page-> antenati)) $ css_class [] = 'current_forum_ancestor'; if ($ ha_children) $ css_class [] = 'forum_category'; if ($ page-> ID == $ current_page) $ css_class [] = 'current_forum_item'; elseif ($ _current_page && $ page-> ID == $ _current_page-> post_parent) $ css_class [] = 'current_forum_parent'; elseif ($ page-> ID == get_option ('page_for_posts')) $ css_class [] = 'current_forum_parent'; $ css_class = implode (", $ css_class); $ topic_count = ($ ha_children)?": ''. bbp_get_forum_topic_count ($ page-> ID). ''; $ forum_item = ($ ha_children)? ''. apply_filters ('the_title', $ page-> post_title, $ page-> ID). ''. $ topic_count: 'ID). '">'. apply_filters ('the_title', $ page-> post_title, $ page-> ID). $ topic_count. ''; $ output. = $ indent. '
  • '. $ Forum_item; function end_el (& $ output, $ page, $ depth = 0, $ args = array ()) $ output. = "
  • \ n ";

    Il walker si basa anche su un piccolo condizionale chiamato forum_list_widget_has_children () che controlla se una pagina ha pagine secondarie.

     function forum_list_widget_has_children ($ page_id) $ children = get_pages (array ('child_of' => $ page_id, 'post_type' => bbp_get_forum_post_type (),)); se ($ bambini) restituisce true; altrimenti restituisce falso; 

    Aggiungiamo un po 'di stile

    Ci vuole solo un po 'di CSS per far sembrare le cose belle.

     .forum_category_title font-size: 1.2em; riempimento: 5px 0 0; blocco di visualizzazione; font-weight: bold;  .topic-count float: right;  .bbp_forums_topic_count_widget_options a text-decoration: none;  .bbp_forums_topic_count_widget_options ul.children padding: 0 0 0 5px; margine: 0; 

    Devi anche assicurarti di agganciarti all'azione appropriata per visualizzare il foglio di stile sul front-end.

     add_action ('wp_enqueue_scripts', 'forum_list_widget_styles'); function forum_list_widget_styles () wp_enqueue_style ('forum_list_widget_styles', plugins_url ('/css/style.css', __FILE__)); 

    Conclusione

    Se vuoi vedere l'intera she-bang insieme in un plugin, puoi scaricarlo qui sopra. Installalo e aggiungi il nuovo widget Elenco forum migliore alla barra laterale e vedrai qualcosa di simile a questo:


    Il risultato finale

    Ora la tua lista sarà organizzata meglio e mostrerà il numero totale di argomenti per ogni forum.

    Se hai commenti o feedback su qualcosa che hai letto sopra, non esitare a discuterne di seguito.