Explicación de la función apply_filters y sus variables

6 may 2011, 18:56:15
Vistas: 20.5K
Votos: 17

Estoy aprendiendo a construir formularios HTML usando PHP tomando como ejemplo el plugin "simplr form registration".

Estoy mirando este código:

$form .= apply_filters('simplr-reg-instructions', __('Please fill out this form to sign up for this site', 'simplr-reg'));

¿Podrían explicar qué está sucediendo aquí - qué hace la función, por qué se necesita 'simplr-reg-instructions' y 'simplr-reg'?

¿Por qué esta línea no puede ser simplemente:

$form .= 'Please fill out this form to sign up for this site' ;

He leído la referencia de la función pero aún no logro entenderlo.

0
Todas las respuestas a la pregunta 2
4
23

Esa línea está utilizando dos funciones diferentes que necesitan explicaciones por separado.

__()

Esta es una función de traducción. Si la configuración es correcta, traducirá el primer parámetro de una lista de cadenas pre-traducidas. Si una instalación tiene un archivo con una traducción compilada para que esta función la use, la utilizará. Por supuesto, el plugin debe incluir su propia traducción, de ahí el segundo parámetro. simplr-reg le indica a __() que la traducción de la cadena 'Please fill out this form to sign up for this site' debe estar en el archivo de traducción asociado con 'simplr-reg' (esto se configura antes en el plugin mediante la función load_plugin_textdomain()).

La función luego devuelve la traducción. Si no hay una traducción disponible (por ejemplo, el idioma actual no tiene una traducción compilada, la cadena no tiene una traducción compilada para ese paquete, etc.), se devuelve la entrada original.

Así que para un sitio WordPress en inglés, __( 'This', 'simplr-reg' ) es funcionalmente lo mismo que 'This'. Para aprender más sobre l10n (Localización), puedes leer sobre ello en el codex:

http://codex.wordpress.org/I18n_for_WordPress_Developers

apply_filters()

Esta función te permite filtrar valores utilizados por el plugin según sea necesario. Este es uno de los principales conceptos que debes comprender como desarrollador de plugins. WordPress se extiende mediante hooks, que son básicamente puntos de acceso que te permiten sincronizar la ejecución de las acciones de tu plugin y/o manipular la información/datos que WordPress utiliza, etc.

Para manipular datos como el fragmento de código sobre el que preguntaste, usarías la función add_filter(). Aquí un ejemplo básico de cómo funciona:

add_filter( 'simplr-reg-instructions', 'wpse16573_my_filter' );

Probablemente reconocerás el primer argumento. Es el mismo que se usa en add_filter arriba. Este es el nombre del hook. El segundo argumento es el callback del filtro. Debe ser un callback válido a una función (lee más sobre callbacks aquí). Esa línea de código dice "Cuando se ejecute el hook 'simplr-reg-instructions', ejecuta la función con el callback que proporcioné." apply_filters() ejecuta el hook encontrado en su primer argumento, esencialmente significa "ejecuta todas las funciones registradas para este hook." apply_filters luego pasa todos los demás argumentos (en este caso, 'Please fill out this form to sign up for this site') a las funciones en ese filtro. Entonces, el callback que usé arriba debería verse así:

function wpse16573_my_filter( $text ){
  $text = "<strong>$text</strong>";
  return $text;
}

Hay dos tipos de hooks en WordPress: filtros (el tipo que estamos usando aquí) y acciones. La principal diferencia entre ambos es que los filtros esperan que devuelvas algo mientras que las acciones no. Así que, para este filtro, mi ejemplo de arriba añade algo de html alrededor de 'Please fill out this form to sign up for this site' y lo devuelve.

Lee más sobre acciones y hooks aquí:

http://codex.wordpress.org/Plugin_API

6 may 2011 19:27:29
Comentarios

John, muchas gracias. ¡Excelente respuesta! Pero no logro encontrar ni una sola línea "add_filter( 'simplr-reg-instructions',..." en los archivos del plugin. ¿Cómo puede ejecutarse entonces el apply_filter?

Ash Ash
8 may 2011 10:31:54

Si no hay filtros añadidos a un hook, simplemente devuelve la entrada original tal cual. El filtro no está ahí para que lo use el plugin, está ahí para que tú puedas usarlo si lo necesitas/quieres, de modo que no tengas que modificar el plugin en sí.

John P Bloch John P Bloch
9 may 2011 16:13:37

+1 Explicación Excelente - Se Lee Como Deberían Ser las Documentaciones ;-)

Edward J Beckett Edward J Beckett
10 ene 2013 06:00:34

+1 Excelente respuesta, exactamente lo que estaba buscando, me estaba confundiendo muchísimo pero ahora todo está tan claro ;)

doz87 doz87
30 nov 2015 16:21:23
4

Aquí tienes dos funciones diferentes apply_filters y __()

La función apply_filters es la forma en que WordPress te permite modificar/editar el valor de variables usando tus propias funciones callback y la función add_filter. Acepta varios argumentos, pero los importantes son los dos primeros:

$algo = apply_filters( $tag, $valor, $var ... );

$tag es el nombre del hook del filtro que se usa en add_filter, por ejemplo:

add_filter($tag, funcion_callback);

$valor es el valor real que podrás cambiar o editar.

$var son variables que tu función callback puede usar, una o más.

La función __() se usa para traducciones:

__($mensaje, $dominio_texto);

$mensaje es el mensaje real a traducir.

$dominio_texto es la etiqueta del dominio de texto usado para cargar la traducción del plugin o tema con load_plugin_textdomain()

¿Qué hace?

Busca en el módulo de localización la traducción de $mensaje, y pasa la traducción al return de PHP. Si no encuentra traducción para $mensaje, simplemente devuelve $mensaje.

Así que ahora las dos funciones en tu caso trabajan de la misma manera, apply_filters enviará a cualquier función callback asociada con el hook de filtro simplr-reg-instructions el valor traducido (si existe) de 'Por favor rellena este formulario para registrarte en este sitio' usando el dominio de texto simplr-reg

6 may 2011 19:23:12
Comentarios

¡Bainternet, muchas gracias! ¿Cómo es que no puedo encontrar ninguna línea "add_filter( 'simplr-reg-instructions', " en los archivos del plugin?

Ash Ash
8 may 2011 10:33:50

Es un hook dejado para desarrolladores que quieran extender o filtrar la funcionalidad del plugin.

Bainternet Bainternet
8 may 2011 10:55:19

¿Entonces no se espera un add_filter aquí? No entiendo por qué. ¿No debería apply_filters ejecutar todas las funciones asociadas a su hook por las funciones add_filter?

Ash Ash
8 may 2011 11:08:06

apply_filters es un marcador de posición que te permite enlazar tus propias funciones usando add_filter, así que no se espera ningún add_filter a menos que añadas uno propio

Bainternet Bainternet
8 may 2011 12:23:47