O mai bună listă de listă widget pentru bbPress

Când bbPress era încă o instalare independentă, am încercat-o și nu a fost chiar impresionată. Lucrurile au fost ciudate și nu a funcționat întotdeauna așa cum trebuia. După ce a cedat timp de câțiva ani, Automattic a decis să ia bbpress și să o transforme într-un plugin, îmbunătățind funcționalitatea salturilor și limitelor și făcându-l un candidat puternic printre alte opțiuni forum pentru WordPress.

Lucrul minunat despre bbPress este că funcționează cu majoritatea temelor și se încarcă automat prin intermediul CSS-ului temei. S-ar putea să trebuiască să schimbați câteva lucruri aici sau acolo pentru a vă face să arătați cum vreți, dar este destul de mult o soluție extrasă din cutie. Singura problemă pe care am avut-o era că widget-ul Lista de forumuri nu arăta, de fapt, ca cel din forumul de suport bbPress.


Lista de widgeturi pe forumul de suport bbPress

Din anumite motive, widgetul Lista de forumuri care vine cu bbPress nu are numărul de subiecte. Și nu funcționează atât de bine cu categoriile de forumuri. În cele din urmă, am decis să pun împreună un mic plugin pentru a adăuga aceste caracteristici.


Începutul umil al unui plug-in

Dacă ați creat vreodată un plugin înainte, veți ști ce reprezintă această secțiune mică:

 

Dacă nu, atunci adăugați numele plugin-ului și informațiile necesare pentru ca acesta să apară corect pe pagina de administrare Plugin din instalarea WordPress.


API-ul Widget

Ori de câte ori creați un widget, trebuie să extindeți API-ul Widget. Dacă această frază nu are sens pentru tine, nu-ți face griji. Pur și simplu înseamnă că trebuie să puneți câteva lucruri în loc pentru ca widget-ul să funcționeze.

Acesta este cel care arată codul API de bază Widget:

 clasa BBP_Forums_Topic_Count_Widget extinde WP_Widget funcția publică __construct () // widget real processes widget funcția publică ($ args, $ instance) // expune conținutul widgetului formularul funcției publice ($ instance) // ieșeste opțiunile form pe admin actualizarea funcției publice ($ new_instance, $ old_instance) // procesează opțiunile de widget pentru a fi salvate

Acest tutorial nu este cu adevărat despre insulările și dezactivările API-ului Widget, așa că vă sugerez să aruncați o privire la API-urile Widgets în Codul WordPress.


Extinderea API-ului Widget

Să trecem prin codul API câte un bloc la un moment dat. În primul rând, trebuie să adăugați câteva informații de bază despre widget:

 funcția publică __construct () $ widget_ops = array ('classname' => 'bbp_forums_topic_count_widget_options', 'description' => __ ('O listă a forumurilor clasificate cu numărul lor de subiecte)); părinte :: __ construct (false, __ ('(bbPress) Lista de forumuri cu număr de subiecte'), $ widget_ops); 

În continuare apare codul de afișare pentru modul în care widgetul va apărea pe partea frontală. Trebuie să utilizați wp_list_pages () pentru a organiza lista categoriilor de forumuri. De asemenea, trebuie să includeți un walker pentru a organiza lista, dar o să intru într-un pic mai târziu.

 funcția publică funcțională ($ args, $ instance) extract ($ args); $ title = apply_filters ('bbp_forum_widget_title', $ instanță ['title']); echo $ before_widget; dacă (! gol ($ title)) echo $ before_title. titlul $. $ After_title; ?> 
    "," post_type "=> bbp_get_forum_post_type (), 'sort_column' => 'menu_order', 'walker' => new Forum_List_Walker, 'no_found_rows' => true,))

Există o singură opțiune în widget, astfel încât formularul de administrare are nevoie doar de următoarele:

 ($ instance ['title']);? $: $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 

Cu o singură opțiune de intrare, blocul de actualizare necesită doar o verificare simplă:

 actualizarea funcției publice ($ new_instance, $ old_instance) $ instance = $ old_instance; $ instanță ['title'] = strip_tags ($ new_instance ['title']); returnați $ instanță; 

Înregistrarea widgetului

Ați extins API-ul astfel încât acum trebuie să vă asigurați că vă înregistrați widget-ul sau nu veți putea să-l utilizați deloc.

 add_action ('widgets_init', funcția () register_widget ('BBP_Forums_Topic_Count_Widget'););

Luând-o pentru o plimbare

Pentru a vă asigura că forumurile dvs. clasificate apar corect în widget, trebuie să utilizați un walker avansat. Ați apelat la o instanță de plimbare în wp_list_pages () funcția de mai sus, astfel încât să puteți trece prin forumuri și categorii pentru a vă asigura că toți intră în loc.

Vă sugerez să citiți pe clasa Walker, deoarece este puțin complicat. Din fericire, am reusit sa o fisurez pentru a obtine ceea ce aveam nevoie pentru plugin.

 clasa Forum_List_Walker extinde Walker var $ tree_type = 'pagina'; var $ db_fields = array ('parent' => 'post_parent', 'id' => 'ID'); funcția start_lvl (& output, $ depth = 0, $ args = array ()) $ indent = str_repeat ("\ t", adâncime $); $ output. = "\ n $ indent
    \ n "; funcția end_lvl (& $ output, $ depth = 0, $ args = array ()) $ $ indent = str_repeat ("
\ n "; funcția start_el (& $ output, $ page, $ depth, $ args) $ indent = ($ depth)? str_repeat (" \ t ", depth depth):"; extract ($ args, EXTR_SKIP); $ css_class = array (); $ has_children = forum_list_widget_has_children ($ page-> ID); dacă (! bbp_is_single_user () && $ current_page = get_the_ID ()) $ _current_page = get_post ($ actual_page); dacă (in_array ($ page-> ID, $ _current_page-> strămoșii)) $ css_class [] = 'current_forum_ancestor'; dacă ($ has_children) $ css_class [] = 'forum_category'; dacă ($ page-> ID == $ current_page) $ css_class [] = 'actual_forum_item'; altfel ($ _current_page && $ page-> ID == $ _current_page-> post_parent) $ css_class [] = 'curent_forum_parent'; elseif ($ page-> ID == get_option ('page_for_posts')) $ css_class [] = 'actual_forum_parent'; $ css_class = implode (", $ css_class); $ topic_count = ($ has_children)?"". bbp_get_forum_topic_count ($ page-> 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; funcția end_el (& $ output, $ page, $ depth = 0, $ args = array ()) $ output. = "
  • \ n ";

    Walkerul se bazează, de asemenea, pe un mic nume condiționat forum_list_widget_has_children () care verifică dacă o pagină are subpagini.

     funcția forum_list_widget_has_children ($ page_id) $ copii = get_pages (array ('child_of' => $ page_id, 'post_type' => bbp_get_forum_post_type (),)); dacă ($ copii) returnează adevărat; altceva returnează fals; 

    Să adăugăm un stil

    Este nevoie doar de un pic de CSS pentru a face lucrurile să arate bine.

     .forum_category_title font-size: 1.2; umplutura: 5px 0 0; afișare: bloc; 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; marja: 0; 

    Trebuie, de asemenea, să vă asigurați că ați cârlig în acțiunea potrivită pentru a afișa foaia de stil de pe front.

     add_action ('wp_enqueue_scripts', 'forum_list_widget_styles'); funcția forum_list_widget_styles () wp_enqueue_style ('forum_list_widget_styles', plugins_url ('/css/style.css', __FILE__)); 

    Concluzie

    Dacă doriți să vedeți întreaga combinație într-un plugin, o puteți descărca mai sus. Instalați-l și adăugați widget-ul Better List List la bara laterală și veți vedea ceva de genul:


    Rezultatul final

    Acum, lista dvs. va fi mai bine organizată și va afișa numărul total de subiecte pentru fiecare forum.

    Dacă aveți comentarii sau feedback despre ceva ce ați citit mai sus, vă rugăm să discutați mai jos.

    Cod