Foros del Web » Creando para Internet » Sistemas de gestión de contenidos » WordPress »

[Mini-tutorial] Introducción a los filtros de WordPress

Estas en el tema de [Mini-tutorial] Introducción a los filtros de WordPress en el foro de WordPress en Foros del Web. Supongamos que escribimos esta función en WordPress: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original function pepe ( ) {     return 'Pepe es gordo' ; ...
  #1 (permalink)  
Antiguo 05/06/2011, 20:02
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 20 años, 5 meses
Puntos: 832
[Mini-tutorial] Introducción a los filtros de WordPress

Supongamos que escribimos esta función en WordPress:

Código PHP:
Ver original
  1. function pepe() {
  2.     return 'Pepe es gordo';
  3. }
  4.  
  5. echo pepe();

Naturalmente obtendremos "Pepe es gordo" hoy y en 1000 años. Si quisiéramos mostrar "Pepe es flaco" tendríamos que escribir otra función o aplicar un str_replace() a la existente; métodos viables con el presente ejemplo pero definitivamente engorrosos con funciones más complejas. Ahora abordemos esto al estilo WordPress:

Código PHP:
Ver original
  1. function pepe() {
  2.     return 'Pepe es '. apply_filters( 'contextura', 'gordo' );
  3. }
  4.  
  5. echo pepe();

Aquí hemos aplicado un hook tipo filtro. "Hook" significa "gancho", palabra que los define correctamente, pues literalmente son ganchos ubicados dentro de las funciones que nos permiten añadir trozos de código para alterar su comportamiento. Ahora nuestra función pepe() está lista para ser modificada sin tocarle un pelo. Veamos:

Código PHP:
Ver original
  1. function pepe() {
  2.     return 'Pepe es '. apply_filters( 'contextura', 'gordo' );
  3. }
  4.  
  5. function contex() {
  6.     return 'flaco';
  7. }
  8.  
  9. add_filter( 'contextura', 'contex');
  10.  
  11. echo pepe();

Ahora tenemos que "Pepe es flaco" mientras echo pepe() permanece inmutable. Esto es sencillamente genial, pues hablamos de la posibilidad de construir funciones modificables de forma externa.

Revisemos de nuevo lo que ha sucedido en el código anterior: apply_filters es el hook que nos dice "hey, pssst... puedes modificar esta parte", mientras add_filter es el hook que la modifica. Ambos se enganchan a través de un identificador único ('contextura') y se logra la sobrescritura.

Ahora bien ¿Qué pasaría si quisiéramos mostrar "Laura es flaca"?. Pues nada, construimos nuestros "ganchos" donde haga falta:

Código PHP:
Ver original
  1. function pepe() {
  2.     return apply_filters( 'nombre', 'Pepe' ) .' es '. apply_filters( 'contextura', 'gordo' );
  3. }
  4.  
  5. function otra_cosa() {
  6.     return 'Laura';
  7. }
  8.  
  9. function contex() {
  10.     return 'flaca';
  11. }
  12.  
  13. add_filter( 'nombre', 'otra_cosa');
  14. add_filter( 'contextura', 'contex');
  15.  
  16. echo pepe(); // "Laura es flaca"

El ejemplo es bastante básico pero nos ayuda a comprender esta parte de una vez por todas. La estructura de parámetros básica de apply_filters es:

Código PHP:
Ver original
  1. apply_filters('identificador' , 'elemento modificable');

y la de add_filter:

Código PHP:
Ver original
  1. add_filter( 'identificador', 'funcion modificadora' );

Notas:

1) Los hooks también aceptan parámetros extra. Igualmente es posible establecer la prioridad entre dos o más hooks de un mismo tipo. La configuración es la siguiente:

Código PHP:
Ver original
  1. add_filter('identificador' , 'funcion modificadora' , 'prioridad frente a otros hooks del mismo tipo', 'parámetros extra');

2) En el propio sistema de archivos de WordPress, muchas funciones vienen preparadas para ser modificadas mediante filtros. Puedes revisar la lista.

De interés:

- Referencia de filtros.
- apply_filters
- add_filter
- Using Filter Hooks in WordPress Child Themes (el mejor tutorial de inicio que he visto en la red hasta el momento).

Última edición por metacortex; 05/06/2011 a las 21:27 Razón: Corrección
  #2 (permalink)  
Antiguo 05/06/2011, 20:21
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: [Mini-tutorial] Introducción a los filtros de WordPress

Excelente tutorial metacortex, creo que me leíste la mente, porque estaba por hacer una pregunta sobre los filtros que se utilizan en el archivo functions, mas que todo cual era su uso y creo que mas claro no puede estar, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 10/11/2011, 13:53
 
Fecha de Ingreso: abril-2011
Ubicación: Colombia
Mensajes: 59
Antigüedad: 13 años, 7 meses
Puntos: 19
Respuesta: [Mini-tutorial] Introducción a los filtros de WordPress

Excelente información y aprendí de una.. xD

Gracias!
  #4 (permalink)  
Antiguo 10/11/2012, 05:35
 
Fecha de Ingreso: octubre-2012
Mensajes: 2
Antigüedad: 12 años, 1 mes
Puntos: 1
Respuesta: [Mini-tutorial] Introducción a los filtros de WordPress

Fantástico tutorial! Por fin me queda un poquito claro, la verdad que el codex es bastante pobre en algunas secciones. Una duda.
En el tema por defecto twenty eleven, la función que se encarga de validar el registro del grupo de opciones de la página de administración en theme-options.php termina así:
Código PHP:
return apply_filters'twentyeleven_theme_options_validate'$output$input$defaults); 
En este caso concreto, he buscado un add_filter que se encargue de modificar la función, pero no lo he encontrado. Lo único, que el identificador tiene el mismo nombre que la función que lo aplica,
Código PHP:
twentyeleven_theme_options_validate($input
He comprobado también la variable $output, es un array y no contiene ninguna función. Aquí ya estoy perdido del todo, pero del todo todo.
Espero haberme explicado bien.

Un saludo.

Etiquetas: filtros, mini, tutoriales
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 8 personas




La zona horaria es GMT -6. Ahora son las 09:11.