¿Qué significa este código de función PHP?

29 mar 2012, 00:41:37
Vistas: 828
Votos: -7

¿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);
    }
}
1
Comentarios

Por favor, intenta formular esto como una pregunta manejable. En su forma actual, esto ni siquiera es una pregunta, sino una solicitud para que alguien haga el trabajo de documentar código de terceros y explicártelo. Como tal, no es adecuado para el formato de preguntas y respuestas de este sitio.

Rarst Rarst
29 mar 2012 01:40:02
Todas las respuestas a la pregunta 1
4

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);
    }
29 mar 2012 00:53:13
Comentarios

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

fritids fritids
29 mar 2012 01:15:13

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.

EAMann EAMann
29 mar 2012 01:25:37

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!

fritids fritids
29 mar 2012 01:48:00

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.

EAMann EAMann
29 mar 2012 01:49:19