Explicación de la función apply_filters y sus variables
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.

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í:

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?

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í.

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

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

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

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

¿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?
