Folosesc abordarea corectă pentru a utiliza această clasă în tema WordPress?

18 oct. 2011, 15:51:33
Vizualizări: 474
Voturi: -1

Folosesc o clasă pentru a prelua valori din tabele personalizate pe care trebuie să le utilizez în diferite fișiere ale temei mele WordPress și nu sunt sigur care este cea mai bună abordare pentru asta.

Aceasta este clasa pe care o am în prezent (nu mă criticați, sunt începător :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 =  interogare baza de date aici;
        $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= interogare baza de date aici;
        $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;
    }

}

Trebuie să folosesc aceste funcții în întreaga mea temă (header.php, page-custom.php, etc) și vreau să folosesc o singură instanță a clasei, deoarece nu vreau să interogez baza de date de fiecare dată când am nevoie de o valoare, deoarece interogarea doar a două valori (așa cum fac când creez clasa) este suficientă.

Unde ar trebui să apelez această clasă? Am crezut că prin crearea clasei în functions.php...

$p= new Plans();

...voi putea accesa $p peste tot, dar se pare că greșesc. Care ar fi cea mai bună abordare?

În cazul meu, de exemplu, am nevoie în header.php de

$p->get_fplans_count();

În page-plans.php

$p->get_purchased_plans();

Și așa mai departe...

EDIT: Nu am nevoie de ajutor PHP, vreau doar să știu cum să utilizez corect o clasă PHP în WordPress. Se pare că este puțin confuz pentru mine să explic (Engleza nu este limba mea maternă) Mulțumesc mult pentru ajutorul vostru

7
Comentarii

Aceasta este o întrebare despre PHP, nu despre WordPress.

Chip Bennett Chip Bennett
18 oct. 2011 15:53:13

Nu, nu este. Este o întrebare despre cum să folosești PHP în WordPress. Sau WordPress nu folosește JavaScript, PHP, etc.? Pur și simplu nu știu cum să implementez clasa în WordPress. Te rog să citești cu atenție înainte să dai vot negativ

chifliiiii chifliiiii
18 oct. 2011 15:57:34

Întrebarea ta este despre cum să apelezi o clasă PHP și este complet independentă de platformă. WordPress nu afectează direct sau indirect răspunsul la această întrebare.

Chip Bennett Chip Bennett
18 oct. 2011 15:59:34

Îmi pare rău Chip, dar tot nu sunt de acord cu tine. Am nevoie doar să știu cum pot vedea variabilele mele în diferite fișiere WordPress. Te rog să fii un pic mai deschis :D și ajută-mă

chifliiiii chifliiiii
18 oct. 2011 16:04:13

Deși sunt parțial de acord cu Chip, trebuie să menționez că http://w3prodigy.com/web-production/behind-wordpress/php-classes-wordpress-plugin/ acest link îți va oferi o perspectivă, la fel și acesta http://codex.wordpress.org/Writing_a_Plugin, http://www.devlounge.net/code/structure-of-a-wordpress-plugin și http://striderweb.com/nerdaphernalia/2008/07/use-classes-in-your-wordpress-plugins/ plus aproape orice altceva găsești pe Google. A avea o instanță accesibilă global este o practică acceptabilă, dar nu o denumi $p, este prea scurt și poate cauza coliziuni.

soulseekah soulseekah
18 oct. 2011 16:09:18

De asemenea, îți sugerez să descarci câteva plugin-uri bune (mai ales cele scrise de maintaineri) și să vezi cum au implementat ei.

soulseekah soulseekah
18 oct. 2011 16:14:42

Mulțumesc mult @Soulseekah ! A fost la fel de simplu ca o coliziune de nume, cumva $p nu a funcționat și imediat ce l-am schimbat în $plans a început să funcționeze. Mulțumesc din nou

chifliiiii chifliiiii
18 oct. 2011 16:21:12
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 2
1

Cea mai ușoară metodă de a avea acces la variabila ta în alte fișiere este să faci exact ce a sugerat Chip, să globalizezi variabila.

Aceasta este aceeași metodă pe care WordPress o folosește pentru a face variabile globale precum $wpdb disponibile în alte fișiere. Deja văd că faci apeluri la variabila globală $wpdb în clasa ta. Trebuie să faci același lucru.

Când creezi o instanță în functions.php:

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

Când faci referire la instanța globală în header.php, footer.php, etc:

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

Cu acestea în minte, vreau să clarific două lucruri:

Aceasta nu este o întrebare specifică WordPress

Da, folosești WordPress. Și da, încerci să înțelegi cum să folosești o clasă în WordPress. Dar această întrebare nu este în niciun fel specifică WordPress. Dacă ai construi un site folosind doar PHP (adică un singur fișier index.php care include header.php și footer.php și face referiri dinamice), ai întâmpina aceeași problemă.

Întrebarea ta este despre domeniul de aplicare al variabilelor, nu despre WordPress. Chip a avut 100% dreptate să sublinieze acest lucru mai devreme. Explic aici și nu într-o întrebare pentru a înțelege de ce.

Când apelezi $p = new Plans() în fișierul tău functions.php, creezi o instanță a obiectului Plans și o stochezi într-o variabilă locală numită $p. Dacă acea variabilă este definită într-o funcție (așa cum ar trebui), atunci acea variabilă este locală pentru acea funcție. Dacă este definită într-o clasă, este locală pentru acea clasă.

Uneori, poți defini accidental o variabilă în domeniul global... aceasta este o greșeală făcută adesea de dezvoltatorii noi în PHP sau care abia încep cu programarea orientată pe obiecte. Nu este ceva rău în sine, dar este un obicei prost în care să cazi.

Dacă ai nevoie de acces la variabila ta în afara domeniului local imediat, folosește întotdeauna întotdeauna cuvântul cheie global pentru a o face disponibilă. Cu toate acestea, asigură-te că denumești variabila ta globală într-un mod care minimizează coliziunile de nume.

$p nu este foarte unic. Este foarte posibil ca un plugin (sau WordPress însuși) să redefinească $p ca altceva decât o instanță a Plans() mai târziu. Acest lucru ar strica tema ta... ar trebui evitat cu orice preț!

Ceva de genul $chifiliii_plans_p ar fi o alegere mai bună, deoarece este puțin probabil ca orice alt sistem să aleagă același nume.

O faci greșit

1 - Tabelele personalizate sunt RELE

Este o practică proastă să folosești tabele personalizate în WordPress. Există foarte puține cazuri în care tabelele personalizate sunt justificate în sistem, iar în 6 ani de lucru cu platforma, am întâlnit doar 1 sau 2 motive pentru a le avea.

Dacă tema ta este destinată distribuirii, ține minte că unii utilizatori nu o vor putea folosi. Mai mulți consultanți de securitate recomandă ca utilizatorul prin care WordPress accesează baza de date să fie limitat în funcționalități - în multe sisteme partajate, nu poate crea tabele în primul rând.

În sistemele multisite, nu doar că adaugi tabele noi pentru un singur site, ci adaugi tabele noi pentru fiecare site care activează tema ta. Acest lucru crește drastic dimensiunea bazei de date, ceea ce ar putea fi o problemă pentru unii utilizatori (deși nu pentru toți).

Dacă rulezi interogări personalizate direct pe baza de date, îți asumi multe probleme de securitate pe umerii tăi. WordPress în sine este destul de sigur... dacă nu faci ceva greșit, este foarte dificil să te expui utilizatorilor rău intenționați care încearcă injectări SQL și alte atacuri împotriva sistemului tău. Dacă rulezi interogările singur (în afara API-ului WP_Query), atunci trebuie să saniezi acele interogări pentru a preveni declarații malicioase.

În prezent, WordPress are deja un fantastic API pentru opțiuni.

WordPress suportă și Tipuri de postări personalizate pentru stocarea datelor personalizate.

Nu reinventa roata... folosește instrumentele care există deja pentru a te ajuta.

2 - Nu include funcționalități în teme

Dacă ai atât de multă funcționalitate avansată încorporate în tema ta, te pregătești pentru eșec. Ce se întâmplă dacă un utilizator dezactivează tema ta? Simplu... brusc toate datele lor personalizate dispar.

S-a spus de multe ori pe acest site: temele sunt menite să ofere stilizare pentru WordPress. Plugin-urile sunt menite să ofere funcționalitate. Dacă intenționezi să stochezi date personalizate, fă-o printr-un plugin. Folosește tema pentru a stiliza prezentarea acelor date personalizate.

18 oct. 2011 17:22:50
Comentarii

Mulțumesc pentru explicarea tuturor acestor detalii. Problema a fost o coliziune de nume, așa cum am menționat în întrebarea mea. Niciodată nu folosesc tabele personalizate, dar pentru acest proiect nu am găsit o metodă mai bună de a realiza acest lucru. Tema este utilizată doar pentru un singur site care este construit pe WordPress + BuddyPress. Ai dreptate în legătură cu plugin-ul, cred că voi schimba abordarea data viitoare. Mulțumesc că ți-ai luat timp să răspunzi la aceasta.

chifliiiii chifliiiii
18 oct. 2011 17:48:32
0

Dacă ai nevoie ca o variabilă să fie disponibilă în toate fișierele de șabloane, globalizeaz-o și apeleaz-o în header.php:

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

Doar asigură-te că o globalizezi oriunde o apelezi:

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