Een betere lijst met forum-widgets voor bbPress

Toen bbPress nog steeds een zelfstandige installatie was, had ik het geprobeerd en was ik niet echt onder de indruk. Dingen waren onhandig en het werkte niet altijd zoals het bedoeld was. Na een paar jaar wegkwijnen, besloot Automattic om bbpress te nemen en het in een plug-in te veranderen, waardoor de functionaliteit sprongsgewijs verbeterde en het een sterke concurrent van andere forumoptie voor WordPress werd.

Het leuke van bbPress is dat het werkt met de meeste thema's en zichzelf automatisch laat zien via de CSS van het thema. Mogelijk moet je hier of daar een paar dingen wijzigen om te laten zien hoe je wilt, maar het is vrijwel een kant-en-klare oplossing. Het enige probleem dat ik had was dat de Forum List-widget er niet echt uitzag als die in het bbPress-ondersteuningsforum.


Forumlijst-widget op bbPress ondersteuningsforum

Om de een of andere reden heeft de Forum Lijst-widget die wordt geleverd met bbPress, niet het aantal van het onderwerp. En het werkt niet zo goed met forumcategorieën. Uiteindelijk besloot ik om een ​​kleine plug-in samen te stellen om die functies toe te voegen.


Het nederige begin van een plug-in

Als je ooit eerder een plug-in hebt gemaakt, weet je waar deze kleine sectie voor is:

 

Als dat niet het geval is, moet u de naam van de plug-in en de vereiste informatie toevoegen, zodat deze correct wordt weergegeven op de beheerderspagina Plugin van uw WordPress-installatie.


De widget-API

Wanneer u een widget maakt, moet u de widget-API uitbreiden. Als die zin je niet begrijpt, maak je dan geen zorgen. Het betekent alleen dat je een paar dingen op zijn plaats moet zetten om je widget te laten werken.

Dit is wat de basis-API-code voor Widgets ziet:

 klasse BBP_Forums_Topic_Count_Widget breidt WP_Widget uit openbare functie __construct () // feitelijke widgetprocessen openbare functie widget ($ args, $ instantie) // geeft de inhoud van de widget uit public function form ($ instantie) // geeft de opties uit form on admin update van openbare functie ($ new_instance, $ old_instance) // verwerkt widget-opties die moeten worden opgeslagen

Deze tutorial gaat niet echt over het reilen en zeilen van de Widget API, dus ik raad aan om eens naar de Widgets API in de WordPress Codex te kijken.


De widget-API uitbreiden

Laten we de API-code één blok per keer doorlopen. Eerst moet je wat basisinformatie over de widget toevoegen:

 public function __construct () $ widget_ops = array ('classname' => 'bbp_forums_topic_count_widget_options', 'description' => __ ('Een lijst met gecategoriseerde forums met hun aantal voor het onderwerp')); parent :: __ construct (false, __ ('(bbPress) Forums List with Topic Count'), $ widget_ops); 

Vervolgens wordt de weergavecode weergegeven voor hoe de widget aan de voorkant wordt weergegeven. Je moet gebruiken wp_list_pages () om de gecategoriseerde fora lijst te organiseren. Je moet ook een rollator toevoegen om de lijst te organiseren, maar daar kom ik later op terug.

 openbare functie widget ($ args, $ instance) extract ($ args); $ title = apply_filters ('bbp_forum_widget_title', $ instance ['title']); echo $ before_widget; if (! empty ($ title)) echo $ before_title. $ titel. $ After_title; ?> 
    ", 'post_type' => bbp_get_forum_post_type (), 'sort_column' => 'menu_order', 'walker' => nieuw Forum_List_Walker, 'no_found_rows' => true,))?>

Er is slechts één optie in de widget, dus het beheerdersformulier heeft alleen het volgende nodig:

 openbare functie formulier ($ instantie) $ title = leeg ($ instantie ['titel'])? ": esc_attr ($ instantie ['titel']);?> 

Met slechts één invoeroptie vereist het update-blok slechts een eenvoudige controle:

 update van openbare functies ($ new_instance, $ old_instance) $ instance = $ old_instance; $ instance ['title'] = strip_tags ($ new_instance ['title']); return $ instantie; 

De widget registreren

Je hebt de API uitgebreid, dus nu moet je ervoor zorgen dat je de widget registreert, anders kun je deze helemaal niet gebruiken.

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

Het nemen voor een wandeling

Om ervoor te zorgen dat je gecategoriseerde forums correct in de widget verschijnen, moet je een geavanceerd rollator gebruiken. Je hebt een rollator-instantie genoemd in de wp_list_pages () functie hierboven, zodat u door de forums en de categorieën kunt gaan om ervoor te zorgen dat ze allemaal op hun plaats vallen.

Ik stel voor om de Walker-les te lezen, omdat het een beetje ingewikkeld is. Gelukkig heb ik het gekraakt om te krijgen wat ik nodig had voor de plug-in.

 class Forum_List_Walker verlengt 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 $ streepje
    \ n "; functie end_lvl (& $ output, $ depth = 0, $ args = array ()) $ indent = str_repeat (" \ t ", $ depth); $ output. =" $ streepje
\ n "; functie start_el (& $ uitvoer, $ pagina, $ diepte, $ args) $ indent = ($ diepte)? str_repeat (" \ t ", $ depth):"; extract ($ 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-> ancestors)) $ css_class [] = 'current_forum_ancestor'; if ($ has_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 = ($ has_children)? ':''. bbp_get_forum_topic_count ($ pagina-> ID). ''; $ forum_item = ($ has_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 ";

    De wandelaar vertrouwt ook op een kleine voorwaardelijke naam forum_list_widget_has_children () die controleert of een pagina subpagina's heeft.

     function forum_list_widget_has_children ($ page_id) $ children = get_pages (array ('child_of' => $ page_id, 'post_type' => bbp_get_forum_post_type (),)); als ($ kinderen) true retourneren; anders return false; 

    Laten we een stijl toevoegen

    Er is maar een klein beetje CSS voor nodig om dingen er goed uit te laten zien.

     .forum_category_title font-size: 1.2em; opvulling: 5px 0 0; weergave: blok; lettertype: vet;  .topic-count float: right;  .bbp_forums_topic_count_widget_options a text-decoration: none;  .bbp_forums_topic_count_widget_options ul.children opvulling: 0 0 0 5px; marge: 0; 

    U moet er ook voor zorgen dat u de juiste actie invoert om het stylesheet aan de voorkant weer te geven.

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

    Conclusie

    Als je de hele knal in een plug-in wilt zien, kun je deze hierboven downloaden. Installeer het en voeg de nieuwe Better Forum List-widget toe aan je zijbalk en je ziet zoiets als dit:


    Het eindresultaat

    Uw lijst wordt nu beter georganiseerd en geeft het totale aantal onderwerpen weer voor elk forum.

    Als u opmerkingen of feedback heeft over iets dat u hierboven hebt gelezen, aarzel dan niet om het hieronder te bespreken.