Cosa significa questo codice PHP? Spiegazione dettagliata delle funzioni

29 mar 2012, 00:41:37
Visualizzazioni: 828
Voti: -7

Qualcuno può aiutarmi a capire ogni parte di questo codice? Potete commentare ogni riga così posso capire e personalizzare il codice secondo le mie esigenze. Ecco il link su pastebin:

class Towfiq_Person {
    static function on_load() {
        // Aggiunge azioni e filtri quando la classe viene caricata
        add_action('init',array(__CLASS__,'init')); // Esegue 'init' quando WordPress si inizializza
        add_action('wp_insert_post',array(__CLASS__,'wp_insert_post'),10,2); // Scatta quando un post viene inserito
        add_action('profile_update',array(__CLASS__,'profile_update'),10,2); // Scatta quando un profilo utente viene aggiornato
        add_action('user_register',array(__CLASS__,'profile_update')); // Scatta quando un nuovo utente viene registrato
        add_filter('author_link',array(__CLASS__,'author_link'),10,2); // Filtra il link dell'autore
        add_filter('get_the_author_url',array(__CLASS__,'author_link'),10,2); // Filtra l'URL dell'autore
    }

Il resto del codice a questo link: pastebin.com/30GCNhLv

Grazie mille

AGGIORNAMENTO 1:

Ho capito la prima parte, ma cosa fa esattamente questa parte? Cosa fa ogni riga in linguaggio semplice?

// Restituisce la chiave email filtrata
static function get_email_key() {
    return apply_filters('person_email_key', '_email'); // Permette di modificare la chiave email tramite filtro
}

// Gestisce l'aggiornamento del profilo utente
static function profile_update($user_id, $old_user_data=false) {
    global $wpdb;
    $is_new_person = false;
    $user = get_userdata($user_id); // Ottiene i dati dell'utente
    $user_email = ($old_user_data ? $old_user_data->user_email : $user->user_email); // Prende la vecchia o nuova email
    $email_key = self::get_email_key(); // Ottiene la chiave email
    
    // Cerca il post associato a questa 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));
    
    // Se non esiste un post associato, ne crea uno nuovo
    if (!is_numeric($person_id)) {
        $person_id = $is_new_person = wp_insert_post(array(
            'post_type' => 'towfiq-person', // Tipo di post personalizzato
            'post_status' => 'publish',   // Forse dovrebbe essere 'pending' o 'draft'?
            'post_title' => $user->display_name, // Titolo del post = nome visualizzato
        ));
    }
    
    // Aggiorna i metadati
    update_user_meta($user_id, '_person_id', $person_id); // Associa ID utente a ID post
    update_post_meta($person_id, '_user_id', $user_id); // Associa ID post a ID utente
    
    // Se è un nuovo utente o l'email è cambiata, aggiorna l'email nel 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
Commenti

Per favore, cerca di formulare questo come una domanda gestibile. Nella forma attuale non è nemmeno una domanda, ma una richiesta a qualcuno di fare il lavoro di documentare codice di terze parti e di spiegartelo. In quanto tale, non si adatta bene al formato di domande e risposte di questo sito.

Rarst Rarst
29 mar 2012 01:40:02
Tutte le risposte alla domanda 1
4

Sostanzialmente, questo è un pattern di programmazione per l'organizzazione del codice in namespace all'interno di un plugin WordPress. Tipicamente, puoi avere solo una funzione chiamata init() in un programma, ma più autori proveranno a utilizzare quel nome. Inserire i nomi delle funzioni in una classe è un modo per aggirare questa limitazione.

Ad esempio:

class Towfiq_Person {
    static function on_load() { }

    static function init() { }

    static function profile_update() { }
}

Invece di chiamarle direttamente, le invochi anche con il nome della classe. Quindi:

Towfiq_Person::on_load();
Towfiq_Person::init();
Towfiq_Person::profile_update();

La sezione di codice che hai incluso nella tua domanda è il bootstrapper per questa classe. Alla fine del file PHP linkato c'è Towfiq_Person::on_load(), che dice a WordPress di eseguire la funzione statica on_load() della classe Towfiq_Person.

Questa funzione collega vari eventi e filtri all'interno di WordPress. Quando WordPress attiva la sua azione init, chiamerà anche Towfiq_Person::init(). Quando WordPress inserisce un post e attiva la sua azione wp_insert_post, chiamerà anche Towfiq_Person::wp_insert_post().

Ogni riga che hai elencato sopra associa una specifica funzione nella classe a un evento specifico attivato da WordPress.

Ti consiglio di leggere un po' su Azioni e Filtri per capire esattamente cosa succede, ma questa è una panoramica di base.

Aggiornamento

In base alla tua ulteriore richiesta di informazioni...

Non possiamo definire ogni funzione per te. Dovresti davvero contattare lo sviluppatore originale e chiedere la documentazione. Ma ecco una rapida panoramica.

La funzione get_email_key() applica un filtro WordPress alla stringa "_email". In sostanza, prende "_email" e la passa attraverso qualsiasi funzione collegata a quel filtro prima di restituirla all'utente. Se chiamassi get_email_key() ora, ti verrebbe restituito "_email".

La funzione profile_update() è collegata alle azioni profile_update e user_register in WordPress. Quando una di queste azioni viene attivata, WordPress chiamerà la tua funzione e passerà l'ID dell'utente che viene modificato e (opzionalmente) i dati che sono stati modificati.

La tua funzione fa quindi quanto segue:

// Riferimento all'oggetto database globale per eseguire query più tardi
global $wpdb;

// Assumiamo per ora che si tratti di un record esistente. Questo verrà aggiornato altrove
// se necessario.
$is_new_person = false;

// Ottieni i dati per l'utente passato da WordPress
$user = get_userdata($user_id);

// Se abbiamo vecchi dati utente, otteniamo l'email dell'utente da essi. Altrimenti, otteniamo l'email dell'utente
// dall'oggetto $user creato sopra.
$user_email = ($old_user_data ? $old_user_data->user_email : $user->user_email);

// Ottieni la chiave email. Tipicamente sarà "_email"
$email_key = self::get_email_key();

// Ottieni l'ID della persona su cui stiamo lavorando dal database. Stiamo cercando
// l'ID di un post che ha meta informazioni corrispondenti alla chiave email di cui sopra e
// all'indirizzo email dell'utente.
$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));

// Se non abbiamo trovato un ID utente (l'ID restituito è nullo o "false"), allora
// inseriamo un nuovo post type personalizzato "towfiq-person" con i dati che ci servono. Il titolo è
// il nome dell'utente, lo stato è pubblicato e impostiamo meta informazioni del post per poterlo
// trovare di nuovo con la query precedente.
if (!is_numeric($person_id)) {
         $person_id = $is_new_person = wp_insert_post(array(
            'post_type' => 'towfiq-person',
            'post_status' => 'publish',   // Forse dovrebbe essere pending o draft?
            'post_title' => $user->display_name,
        ));
    }
    // Aggiorna le meta informazioni dell'utente per mappare al nuovo post type personalizzato
    update_user_meta($user_id,'_person_id',$person_id);
    // Aggiorna le meta informazioni del post type personalizzato per mappare all'utente
    update_post_meta($person_id,'_user_id',$user_id);
    if ($is_new_person || ($old_user_data && $user->user_email!=$old_user_data-   >user_email)) {
        // Aggiorna le meta informazioni del post type personalizzato per mappare all'email dell'utente
        update_post_meta($person_id,$email_key,$user->user_email);
    }
29 mar 2012 00:53:13
Commenti

grazie, ho capito la prima parte ma per quanto riguarda l'altra parte vedi update1.

fritids fritids
29 mar 2012 01:15:13

Documenterò quel set di funzioni, ma onestamente non faremo tutto il lavoro al posto tuo. Leggi il codice. Se non capisci cosa fa, contatta lo sviluppatore originale e chiedi la documentazione. Non scriveremo il codice o la documentazione per te.

EAMann EAMann
29 mar 2012 01:25:37

grazie mille per i tuoi sforzi, ho capito. ho provato a contattare l'autore di questo codice su questo sito ma senza successo. non importa, è già un inizio. salute

fritids fritids
29 mar 2012 01:48:00

Ho contattato direttamente l'autore originale di questo codice - se guardi, la risposta originale è stata inviata da Mike Schinkel. Basta cercare su Google il suo nome e sono sicuro che puoi trovare le sue informazioni di contatto per metterti in contatto se hai bisogno di ulteriore aiuto.

EAMann EAMann
29 mar 2012 01:49:19