2009-09-06 11 views
15

Estoy tratando de filtrar TODAS las salidas de widgets a través de un filtro simple, pero no puedo encontrar ningún gancho y esperaba apuntar en la dirección correcta. ¿O posiblemente mis esfuerzos ni siquiera son posibles?¿Existen los widgets de WordPress (o barra lateral)?

Mi filtro simple es algo como esto:

function clean_widget_output($input) { 
    return str_replace(array("\t", "\n", "\r"), '', $input); 
} 

add_[FILTER OR ACTION]('need_a_hook', 'clean_widget_output', 99); 

¿Alguna idea? Soy bastante nuevo en PHP, pero puedo moverme.

+0

no estoy seguro de cuando se presentó el filtro widget_text, tal vez no lo tenían en ' 09 cuando esta pregunta fue originalmente hecha. Vea mi código de ejemplo a continuación en mi respuesta para obtener un ejemplo de trabajo completo (y muy simple). –

Respuesta

7

Esto surgió de la necesidad/deseo de limpiar el horrible HTML arrojado por los widgets de WordPress. Me encanta lo que hacen, pero parte de la producción me hace llorar.

La respuesta corta es output buffering porque no pude encontrar ningún widget o ganchos de la barra lateral.

La respuesta larga es:

function tidy_sidebar($sidebar_name_or_id) 
{ 
    ob_start(); 

    $bool = dynamic_sidebar($sidebar_name_or_id); 

    if ($bool) 
    { 
     $str = ob_get_contents(); 
     $str = 'do cleanup stuff...'; 
    } 
    else 
    { 
     $str = ''; 
    } 
    ob_end_clean(); 

    return $str; 
} 

Entonces llame echo tidy_sidebar('sidebar-name-or-id'); de su tema.

+0

Ahora puede controlar el envoltorio del widget y el título del widget html al registrar una barra lateral, por lo que no está seguro de cuánto se necesita. Si no le gusta un widget, lo mejor es reescribirlo con el resultado que desee. Eche un vistazo a la API de widgets (http://codex.wordpress.org/Widgets_API) y la función register_sidebar (http://codex.wordpress.org/Function_Reference/register_sidebar) – roborourke

4

hay un montón de ganchos para widgets de wordpress que no están documentados. El wordpress codex no los incluye, por el motivo que sea (como estos enganches pueden cambiar en el futuro y se romperán inesperadamente con nuevas actualizaciones y versiones) ... así que utilícelos con extrema precaución.

para averiguar lo que son, hay por lo menos 2 lugares para buscar:

<wordpress install directory>/wp-includes/default-filters.php 
<wordpress install directory>/wp-includes/default-widgets.php 

contenidas en esos dos archivos es un muy buen listado de todos los ganchos de los usos wordpress.

Un ejemplo podría ser un filtro para los widgets es widget_title

de nuevo, utilizar estos con precaución, no están garantizados para trabajar más allá de la versión específica del código que está viendo.

7

Tuve un problema similar y después de mirar a través de Adam Brown list of all WordPress filter hooks, encontré que el gancho que necesitaba existe (widget_title, como se menciona en pxl), pero que no hay ningún gancho para obtener toda la salida del widget. Pensé en elaborar la solución que funcionó para mí.

Teóricamente, el gancho widget_title debería afectar a todos los widgets en su blog, pero estoy seguro de que algunos widgets de terceros no incluyen la línea de código necesaria para aplicar filtros de título, por lo que no es infalible. Sin embargo, funcionó para mí y se puede usar para aplicar un 'shortcode' personalizado (más exactamente, en este caso, 'longcode') o sintaxis para los títulos de tus widgets. Por ejemplo, quería ocasionalmente incluir código html en mis títulos de widgets, pero de manera predeterminada, todo html es eliminado. Por lo tanto, con el fin de ser capaz de añadir cosas como <em> etiquetas de texto en algunos de mis títulos, he elegido una sintaxis personalizado: [[ en lugar de < & ]] en lugar de > (por ej, [[em]] y [[/em]]) y luego creé una función en las funciones de mi tema.archivo PHP para procesar esa sintaxis personalizada y reemplazarlo con el HTML equivalente:

function parse_html_widget_title($text) { 
    return str_replace(array('[[', ']]'), array('<', '>'), $text); 
} 

Luego he añadido una línea debajo de él para añadir la función como filtro:

add_filter('widget_title', 'parse_html_widget_title', 11); // 11 is one above the default priority of 10, meaning it will occur after any other default widget_title filters 

La funcionalidad add_filter/apply_filter automáticamente pasa el contenido que se filtra como el primer parámetro a la función especificada como filtro, así que eso es todo lo que necesita hacer.

Para hacer algo similar para la salida principal del widget, necesitará mirar todos sus widgets para ver qué gancho usan y verificar que tienen un filtro para su salida principal, que usar add_filter() para cada uno enlace que encuentre con su función de devolución de llamada personalizada (por ejemplo, es widget_text para la salida del widget de texto, o get_search_form para el formulario de búsqueda [puede verlo en wp-includes/general-template.php, en la función get_search_form()]). El problema es que algunos de los widgets generados dinámicamente no tienen ganchos (como el widget Meta), razón por la cual la solución de búfer de salida que proporciona Jeff es la solución más versátil, aunque no la ideal.

+0

¡GRACIAS! He buscado algo como esto por años: eres un salvavidas. :) – Michelle

2

No estoy seguro de cuándo introdujeron el filtro widget_text, quizás no lo tenían en el '09 cuando se hizo esta pregunta originalmente, pero dado que está ahí ahora, y por el bien de cualquiera que obtenga este stackoverflow hice de Google y sólo pasa a leer lo suficientemente lejos para ver esta respuesta, ahora es en realidad muy simple:

function my_widget_filter($content) 
{ 
    // manipulate $content as you see fit 
    return $content; 
} 

add_filter('widget_text', 'my_widget_filter', 99); 
Cuestiones relacionadas