Folosesc abordarea corectă pentru a utiliza această clasă în tema WordPress?
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

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.

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.
