Un widget de lista de foro mejor para bbPress

Cuando bbPress todavía era una instalación independiente, lo había probado y no estaba realmente impresionado. Las cosas estaban torpes y no siempre funcionaban como se suponía. Después de languidecer durante algunos años, Automattic decidió tomar bbpress y convertirlo en un complemento, mejorando la funcionalidad a pasos agigantados y convirtiéndolo en un contendiente fuerte entre otras opciones de foro para WordPress.

Lo bueno de bbPress es que funciona con la mayoría de los temas y se autoexplica automáticamente a través del CSS del tema. Es posible que tenga que cambiar algunas cosas aquí o allá para que se vea como usted quiere, pero es una solución bastante simple. El único problema que tuve fue que el widget de la Lista de foros no se parecía en realidad al del foro de soporte de bbPress.


Widget de lista de foros en el foro de soporte de bbPress

Por alguna razón, el widget Lista de foros que viene con bbPress no tiene el número de temas. Y no funciona tan bien con las categorías del foro. Al final, decidí armar un pequeño complemento para agregar esas características.


El comienzo humilde de un plugin

Si alguna vez ha creado un complemento, sabrá para qué sirve esta pequeña sección:

 

Si no, ahí es donde agrega el nombre del complemento y la información requerida para que aparezca correctamente en la página de administración del complemento de su instalación de WordPress.


La API de widgets

Cada vez que cree un widget, debe ampliar la API del widget. Si esa frase no tiene sentido para ti, no te preocupes. Solo significa que necesita poner algunas cosas en orden para que su widget funcione..

Así es como se ve el código básico de la API del Widget:

 la clase BBP_Forums_Topic_Count_Widget amplía WP_Widget función pública __construct () // procesos reales del widget widget de función pública ($ args, $ instance) // genera el contenido del widget formulario de función pública ($ instancia) // genera las opciones formulario en admin actualización de la función pública ($ new_instance, $ old_instance) // procesa las opciones del widget para guardarlas

Este tutorial no es realmente acerca de los entresijos de la API de widgets, por lo que sugiero echar un vistazo a la API de widgets en el Códice de WordPress.


Extendiendo el Widget API

Revisemos el código API un bloque a la vez. Primero, debe agregar información básica sobre el widget:

 función pública __construct () $ widget_ops = array ('classname' => 'bbp_forums_topic_count_widget_options', 'description' => __ ('Una lista de foros categorizados con su cantidad de temas')); parent :: __ construct (false, __ ('(bbPress) Forums List with Topic Count'), $ widget_ops); 

Luego viene el código de visualización de cómo aparecerá el widget en la parte frontal. Necesitas usar wp_list_pages () Para organizar la lista de foros categorizados. También debe incluir un caminante para organizar la lista, pero me ocuparé un poco más adelante..

 widget de función pública ($ args, $ instance) extract ($ args); $ title = apply_filters ('bbp_forum_widget_title', $ instance ['title']); echo $ before_widget; if (! empty ($ title)) echo $ before_title. $ título. $ after_title; ?> 
    ", 'post_type' => bbp_get_forum_post_type (), 'sort_column' => 'menu_order', 'walker' => nuevo Forum_List_Walker, 'no_found_rows' => true,)));?>

Solo hay una opción en el widget, por lo que el formulario de administración solo necesita lo siguiente:

 formulario de función pública ($ instancia) $ título = vacío ($ instancia ['título'])? ": esc_attr ($ instancia ['título']);?> 

Con solo una opción de entrada, el bloque de actualización solo requiere una comprobación simple:

 actualización de la función pública ($ new_instance, $ old_instance) $ instance = $ old_instance; $ instance ['title'] = strip_tags ($ new_instance ['title']); return $ instance; 

Registro del Widget

Ha ampliado la API, por lo que ahora debe asegurarse de registrar el widget o no podrá utilizarlo en absoluto..

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

Tomandolo de paseo

Para asegurarse de que sus foros categorizados aparezcan correctamente en el widget, debe usar un caminante avanzado. Usted llamó a una instancia de walker en el wp_list_pages () funciona arriba para que puedas ir a través de los foros y las categorías para asegurarte de que todos encajen en su lugar.

Sugiero leer sobre la clase de caminante ya que es un poco complicado. Afortunadamente logré descifrarlo para obtener lo que necesitaba para el complemento.

 la clase Forum_List_Walker extiende 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 "; function end_lvl (& $ output, $ depth = 0, $ args = array ()) $ indent = str_repeat (" \ t ", $ depth); $ output. =" $ sang
\ n "; function start_el (& $ output, $ page, $ depth, $ args) $ indent = ($ depth)? str_repeat (" \ t ", $ depth):"; extracto ($ 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-> ancestros)) $ 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 ($ 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; function end_el (& $ output, $ page, $ depth = 0, $ args = array ()) $ output. = "
  • \ n ";

    El caminante también se basa en un pequeño condicional llamado forum_list_widget_has_children () que comprueba si una página tiene subpáginas.

     función forum_list_widget_has_children ($ page_id) $ children = get_pages (array ('child_of' => $ page_id, 'post_type' => bbp_get_forum_post_type (),)); if ($ children) devuelve true; de lo contrario devuelve falso; 

    Vamos a añadir un poco de estilo

    Solo se necesita un poco de CSS para hacer que las cosas se vean bien..

     .forum_category_title font-size: 1.2em; relleno: 5px 0 0; bloqueo de pantalla; font-weight: negrita;  .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; margen: 0; 

    También debe asegurarse de que se engancha en la acción apropiada para poder mostrar la hoja de estilos en la parte delantera.

     add_action ('wp_enqueue_scripts', 'forum_list_widget_styles'); función forum_list_widget_styles () wp_enqueue_style ('forum_list_widget_styles', plugins_url ('/css/style.css', __FILE__)); 

    Conclusión

    Si desea ver todo el paquete completo en un complemento, puede descargarlo arriba. Instálalo y agrega el nuevo widget de Mejor lista de foros en tu barra lateral y verás algo como esto:


    El resultado final

    Ahora su lista estará mejor organizada y mostrará el recuento total de temas para cada foro.

    Si tiene algún comentario o comentario sobre algo que leyó anteriormente, siéntase libre de discutirlo a continuación.