Sto usando l'approccio giusto per utilizzare questa classe all'interno di un tema WordPress?

18 ott 2011, 15:51:33
Visualizzazioni: 474
Voti: -1

Sto utilizzando una classe per recuperare valori da tabelle personalizzate che devo usare in diversi file del mio Tema WordPress e non sono sicuro quale sia l'approccio migliore per questo.

Questa è la classe che ho al momento (non giudicatemi sono un po' alle prime armi :D)

class Plans {

    public $free_plans;
    public $purchased_plans;

    private $free_count;
    private $purchased_count;


    public function __construct(){
        global $current_user;
        $this->user_id= $current_user->ID;
        $this->free_plans();
        $this->purchased_plans();
    }
        public function free_plans($debug=false){
        global $wpdb;
        $free_plans =  query del database qui;
        $this->free_count= count($free_plans);
        if($debug) $this->debug_wpdb(); 
        $this->free_plans= $free_plans;
    }

    public function purchased_plans($debug=false){
        global $wpdb;
        $plans_purchased= query del database qui;
        $this->purchased_count=count($plans_purchased);
        if($debug) $this->debug_wpdb(); 
        $this->purchased_plans= $plans_purchased;
    }

    private function debug_wpdb(){
        global $wpdb;
            $wpdb->show_errors();  
            $wpdb->print_error();

    }

    public function get_pplans_count(){

            return $this->purchased_count;
    }

    public function get_fplans_count(){

            return $this->free_count;
    }

    public function get_purchased_plans(){

            return $this->purchased_plans;
    }

    public function get_free_plans(){

            return $this->free_plans;
    }

}

Devo utilizzare queste funzioni in tutto il mio tema (header.php, page-custom.php, ecc.) e voglio usare solo un'istanza della classe perché non voglio interrogare il database ogni volta che ho bisogno di un valore, dato che eseguire solo due query come faccio quando creo la classe è sufficiente.

Ora, dove dovrei chiamare questa classe? Pensavo che creando la classe in functions.php...

$p= new Plans();

... sarei stato in grado di accedere a $p ovunque, ma sembra che mi sbagli. Quale sarebbe l'approccio migliore?

Nel mio caso, ad esempio, ho bisogno in header.php di:

$p->get_fplans_count();

In page-plans.php:

$p->get_purchased_plans();

E così via...

MODIFICA: Non cerco aiuto sul PHP, voglio solo sapere come usare correttamente una classe PHP in WordPress. Sembra che sia un po' confuso da spiegare (l'inglese non è la mia lingua madre). Grazie davvero per tutto il vostro aiuto.

7
Commenti

Questa è una domanda su PHP, non su WordPress.

Chip Bennett Chip Bennett
18 ott 2011 15:53:13

No, non lo è. È una domanda su come usare php all'interno di WordPress. O forse WordPress non utilizza JavaScript, php, ecc.? Semplicemente non so come implementare la classe all'interno di WordPress. Per favore leggi attentamente prima di votarmi negativamente

chifliiiii chifliiiii
18 ott 2011 15:57:34

La tua domanda riguarda come chiamare una classe PHP ed è completamente indipendente dalla piattaforma. WordPress non influisce direttamente o indirettamente sulla risposta a questa domanda.

Chip Bennett Chip Bennett
18 ott 2011 15:59:34

Scusa Chip ma ancora non sono d'accordo con te. Ho solo bisogno di sapere come posso vedere le mie variabili nei diversi file di WordPress. Per favore, sii un po' più aperto mentalmente :D e aiutami

chifliiiii chifliiiii
18 ott 2011 16:04:13

Anche se sono un po' d'accordo con Chip, ti posso dire che http://w3prodigy.com/web-production/behind-wordpress/php-classes-wordpress-plugin/ questo ti darà qualche spunto, questo http://codex.wordpress.org/Writing_a_Plugin, http://www.devlounge.net/code/structure-of-a-wordpress-plugin e http://striderweb.com/nerdaphernalia/2008/07/use-classes-in-your-wordpress-plugins/ e praticamente tutto quello che trovi su Google. Avere un'istanza globalmente accessibile è una pratica accettabile, ma non chiamarla $p, troppo corta, potrebbe essere soggetta a collisioni.

soulseekah soulseekah
18 ott 2011 16:09:18

Inoltre, ti suggerirei di scaricare alcuni dei plugin ben fatti (specialmente quelli scritti dai maintainer) e guardare come fanno loro.

soulseekah soulseekah
18 ott 2011 16:14:42

Grazie mille @Soulseekah! Era semplice come un conflitto di nomi, in qualche modo $p non funzionava e non appena l'ho cambiato in $plans ha iniziato a funzionare. Grazie ancora

chifliiiii chifliiiii
18 ott 2011 16:21:12
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 2
1

Il modo più semplice per avere accesso alla tua variabile in altri file è fare esattamente ciò che Chip ha suggerito, globalizzare la variabile.

Questa è la stessa cosa che WordPress fa per rendere disponibili variabili globali come $wpdb in altri file. Vedo che stai già facendo chiamate alla variabile globale $wpdb nella tua classe. Devi fare la stessa cosa.

Quando crei un'istanza in functions.php:

global $p;
$p = new Plans();

Quando fai riferimento all'istanza globale in header.php, footer.php, ecc.:

global $p;
$p->get_purchased_plans();

Con questo in mente, voglio chiarire due cose:

Questa non è una domanda specifica di WordPress

Sì, stai usando WordPress. E sì, stai cercando di capire come usare una classe all'interno di WordPress. Ma questa domanda non è in alcun modo specifica per WordPress. Se stessi costruendo un sito web usando solo PHP (cioè un singolo file index.php che include header.php e footer.php e fa riferimenti dinamici) incontreresti lo stesso problema.

La tua domanda riguarda l'ambito delle variabili, non WordPress. Chip aveva perfettamente ragione a sottolinearlo prima. Lo sto spiegando qui piuttosto che in una risposta per farti capire perché.

Quando chiami $p = new Plans() nel tuo file functions.php, stai creando un'istanza dell'oggetto Plans e memorizzandola in una variabile locale chiamata $p. Se quella variabile è definita all'interno di una funzione (come dovrebbe essere), allora è locale a quella funzione. Se è definita all'interno di una classe, è locale a quella classe.

A volte, puoi accidentalmente definire una variabile nell'ambito globale... questo è un errore comune tra gli sviluppatori nuovi a PHP o che stanno iniziando con la programmazione orientata agli oggetti. Non è una cosa terribile di per sé, ma è una cattiva abitudine.

Se hai bisogno di accedere alla tua variabile al di fuori dell'ambito locale immediato, usa sempre sempre la parola chiave global per renderla disponibile. Detto questo, assicurati anche di nominare la tua variabile globale in modo da minimizzare le collisioni di nomi.

$p non è molto univoco. È molto probabile che un plugin (o WordPress stesso) possa ridefinire $p come qualcosa di diverso da un'istanza di Plans() in futuro. Questo romperebbe il tuo tema... dovrebbe essere evitato a tutti i costi!

Qualcosa come $chifiliii_plans_p sarebbe una scelta migliore perché è altamente improbabile che altri sistemi scelgano lo stesso nome.

Lo stai facendo nel modo sbagliato

1 - Le tabelle personalizzate sono UN PROBLEMA

Non è una buona pratica usare tabelle personalizzate in WordPress. Ci sono pochissimi casi in cui le tabelle personalizzate sono giustificate nel sistema, e in 6 anni di lavoro con la piattaforma ne ho visti solo 1 o 2 casi validi.

Se il tuo tema è destinato alla distribuzione, ricorda che alcune persone potrebbero non essere in grado di usarlo. Diversi consulenti di sicurezza raccomandano che l'utente con cui WordPress accede al database abbia funzionalità limitate - in molti sistemi condivisi, non può nemmeno creare tabelle.

Nei sistemi multisito, non stai aggiungendo nuove tabelle per un solo sito, ma per ogni sito che attiva il tuo tema. Questo aumenta drasticamente le dimensioni del database, il che potrebbe essere un problema per alcuni utenti (anche se non per tutti).

Se esegui query personalizzate direttamente sul database, ti assumi molte preoccupazioni di sicurezza. WordPress stesso è piuttosto sicuro... a meno che tu non faccia qualcosa di sbagliato, è molto difficile esporsi a utenti malintenzionati che tentano attacchi di SQL injection o altri attacchi al sistema. Se esegui le query da solo (al di fuori dell'API WP_Query), devi sanificare quelle query per prevenire dichiarazioni malevole.

Inoltre, WordPress ha già una fantastica Options API.

WordPress supporta anche i Custom Post Types per memorizzare dati personalizzati.

Non reinventare la ruota... usa gli strumenti già disponibili per aiutarti.

2 - Non includere funzionalità nei temi

Se hai così tanta funzionalità avanzata integrata nel tuo tema, ti stai preparando al fallimento. Cosa succede se un utente disattiva il tuo tema? Semplice... improvvisamente tutti i loro dati personalizzati scompaiono.

È stato detto molte volte su questo sito: i temi sono pensati per fornire stili a WordPress. I plugin sono pensati per fornire funzionalità. Se vuoi memorizzare dati personalizzati, fallo attraverso un plugin. Usa il tema per stilizzare la presentazione di quei dati personalizzati.

18 ott 2011 17:22:50
Commenti

Grazie per aver spiegato tutto questo. Il problema era una collisione di nomi come ho commentato nella mia domanda. Non uso mai tabelle personalizzate ma per questo progetto non ho trovato un modo migliore per farlo. Il tema viene utilizzato solo per un sito che è costruito con WordPress + BuddyPress. Hai ragione riguardo al plugin, penso che cambierò approccio la prossima volta. Grazie per aver dedicato tempo a rispondere.

chifliiiii chifliiiii
18 ott 2011 17:48:32
0

Se hai bisogno che una variabile sia disponibile in tutti i file dei template, globalizzala e chiamala in header.php:

global $p;    
$p = new Plans();

Assicurati solo di globalizzarla ovunque la chiami:

global $p;    
$p->get_fplans_count();
18 ott 2011 16:09:42