¿Qué significa este código de función PHP?
¿Podría alguien ayudarme a entender cada parte de este código? ¿Pueden comentar cada línea para que pueda entender y personalizar el código según mis necesidades? Aquí está el enlace en pastebin:
class Towfiq_Person {
// Método estático que se ejecuta al cargar la clase
static function on_load() {
// Registra las acciones y filtros de WordPress
add_action('init',array(__CLASS__,'init')); // Ejecuta 'init' cuando WordPress inicializa
add_action('wp_insert_post',array(__CLASS__,'wp_insert_post'),10,2); // Se ejecuta al insertar un post
add_action('profile_update',array(__CLASS__,'profile_update'),10,2); // Se ejecuta al actualizar un perfil
add_action('user_register',array(__CLASS__,'profile_update')); // Se ejecuta al registrar un nuevo usuario
add_filter('author_link',array(__CLASS__,'author_link'),10,2); // Filtra los enlaces de autor
add_filter('get_the_author_url',array(__CLASS__,'author_link'),10,2); // Filtra las URLs de autor
}
El resto del código en este enlace: pastebin.com/30GCNhLv
Muchas gracias
ACTUALIZACIÓN 1:
La primera parte ya la entendí, ¿qué hay sobre esta parte? ¿Qué hace cada línea en lenguaje humano?
// Obtiene la clave del campo de email con posibilidad de filtrarlo
static function get_email_key() {
return apply_filters( 'person_email_key', '_email' ); // Permite modificar la clave del meta campo email
}
// Maneja la actualización del perfil de usuario
static function profile_update($user_id,$old_user_data=false) {
global $wpdb; // Accede a la base de datos de WordPress
$is_new_person = false; // Bandera para nuevo registro
$user = get_userdata($user_id); // Obtiene datos del usuario
$user_email = ($old_user_data ? $old_user_data->user_email : $user->user_email); // Email actual o anterior
$email_key = self::get_email_key(); // Obtiene la clave del campo email
// Busca si existe un post asociado a este email
$person_id = $wpdb->get_var($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' AND meta_value='%s'",$email_key,$user_email));
// Si no existe, crea un nuevo post de tipo 'towfiq-person'
if (!is_numeric($person_id)) {
$person_id = $is_new_person = wp_insert_post(array(
'post_type' => 'towfiq-person', // Tipo de post personalizado
'post_status' => 'publish', // ¿Quizás debería ser pending o draft?
'post_title' => $user->display_name, // Título del post = nombre del usuario
));
}
// Actualiza las relaciones entre usuario y post
update_user_meta($user_id,'_person_id',$person_id); // Guarda ID de post en el usuario
update_post_meta($person_id,'_user_id',$user_id); // Guarda ID de usuario en el post
// Si es nuevo o cambió el email, actualiza el campo email en el post
if ($is_new_person || ($old_user_data && $user->user_email!=$old_user_data->user_email)) {
update_post_meta($person_id,$email_key,$user->user_email);
}
}
Básicamente, este es un patrón de programación para organizar el código en espacios de nombres dentro de un plugin de WordPress. Normalmente, solo puedes tener una función llamada init()
en un programa, pero más de un autor intentará usar ese nombre. Colocar los nombres de las funciones dentro de una clase es una forma de evitar esta limitación.
Por ejemplo:
class Towfiq_Person {
static function on_load() { }
static function init() { }
static function profile_update() { }
}
En lugar de llamarlos directamente, los invocas con el nombre de la clase también. Entonces:
Towfiq_Person::on_load();
Towfiq_Person::init();
Towfiq_Person::profile_update();
La sección de código que incluiste en tu pregunta es el iniciador para esta clase. Al final del archivo PHP vinculado está Towfiq_Person::on_load()
, que le dice a WordPress que ejecute la función estática on_load()
de la clase Towfiq_Person
.
Esta función conecta varios eventos y filtros dentro de WordPress. Cuando WordPress dispara su acción init
, también llamará a Towfiq_Person::init()
. Cuando WordPress inserta una publicación y dispara su acción wp_insert_post
, también llamará a Towfiq_Person::wp_insert_post()
.
Cada línea que enumeraste arriba vincula una función específica en la clase a un evento específico disparado por WordPress.
Te recomiendo que leas un poco sobre Acciones y Filtros para entender exactamente lo que está pasando, pero esto es una descripción básica.
Actualización
Basado en tu solicitud de más información...
No podemos definir cada función por ti. Deberías contactar al desarrollador original y pedir documentación. Pero aquí hay una descripción rápida.
La función get_email_key()
aplica un filtro de WordPress a la cadena "_email". Básicamente, toma "_email" y la pasa por cualquier función vinculada a ese filtro antes de devolverla al usuario. Si llamaras a get_email_key()
ahora mismo, te devolvería "_email".
La función profile_update()
está vinculada a las acciones profile_update
y user_register
dentro de WordPress. Cuando se activa cualquiera de estas acciones, WordPress llamará a tu función y pasará el ID del usuario que se está modificando y (opcionalmente) los datos que se cambiaron.
Tu función luego hace lo siguiente:
// Referencia el objeto global de la base de datos para poder ejecutar consultas más tarde
global $wpdb;
// Asumimos que este es un registro existente por ahora. Esto se actualizará en otro lugar
// si es necesario.
$is_new_person = false;
// Obtiene datos del usuario pasado por WordPress
$user = get_userdata($user_id);
// Si tenemos datos antiguos del usuario, obtenemos el correo del usuario de ellos. Si no, obtenemos el correo
// del objeto $user creado arriba.
$user_email = ($old_user_data ? $old_user_data->user_email : $user->user_email);
// Obtiene la clave de correo. Típicamente será "_email"
$email_key = self::get_email_key();
// Obtiene el ID de la persona con la que estamos trabajando desde la base de datos. Buscamos
// el ID de una publicación que tenga meta información coincidente con la clave de correo de arriba y
// la dirección de correo del usuario.
$person_id = $wpdb->get_var($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' AND meta_value='%s'",$email_key,$user_email));
// Si no encontramos un ID de usuario (el ID devuelto es nulo o "false"), entonces
// insertamos un nuevo tipo de publicación personalizada "towfiq-person" con los datos que necesitamos. El título es
// el nombre del usuario, el estado es publicado, y establecemos meta información de la publicación para poder
// encontrarlo de nuevo con la consulta anterior.
if (!is_numeric($person_id)) {
$person_id = $is_new_person = wp_insert_post(array(
'post_type' => 'towfiq-person',
'post_status' => 'publish', // ¿Quizás esto debería ser pendiente o borrador?
'post_title' => $user->display_name,
));
}
// Actualiza la meta información del usuario para mapear al nuevo tipo de publicación personalizada
update_user_meta($user_id,'_person_id',$person_id);
// Actualiza la meta información del tipo de publicación personalizada para mapear al usuario
update_post_meta($person_id,'_user_id',$user_id);
if ($is_new_person || ($old_user_data && $user->user_email!=$old_user_data- >user_email)) {
// Actualiza la meta información del tipo de publicación personalizada para mapear al correo del usuario
update_post_meta($person_id,$email_key,$user->user_email);
}

gracias, entiendo la primera parte pero ¿qué pasa con la otra parte? mira update1.

Documentaré ese conjunto de funciones, pero honestamente no haremos todo el trabajo por ti. Lee el código. Si no entiendes lo que está haciendo, contacta al desarrollador original y pide documentación. No escribiremos tu código o documentación por ti.

muchas gracias por tus esfuerzos, lo entiendo. Intenté contactar al escritor de este código en este sitio pero sin éxito. No importa, ya es un comienzo. ¡Saludos!

Me puse en contacto directamente con el autor original de este código; si buscas, verás que la respuesta original fue enviada por Mike Schinkel. Simplemente busca su nombre en Google y estoy seguro de que podrás encontrar su información de contacto para comunicarte si necesitas más ayuda.
