¿Estoy usando el enfoque correcto para utilizar esta clase dentro de un tema de WordPress?
Estoy usando una clase para recuperar valores de tablas personalizadas que necesito usar en diferentes archivos de mi Tema de WordPress y no estoy seguro de cuál es el mejor enfoque para esto.
Esta es la clase que tengo ahora mismo (no me juzguen, soy un poco novato :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 = consulta de base de datos aquí;
$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= consulta de base de datos aquí;
$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;
}
}
Necesito usar estas funciones en todo mi tema (header.php, page-custom.php, etc) y solo quiero usar una instancia de la clase porque no quiero consultar la base de datos cada vez que necesite un valor, ya que hacer solo las dos consultas cuando creo la clase es suficiente.
¿Dónde debería llamar a esta clase? Pensé que creando la clase en functions.php...
$p= new Plans();
... podría acceder a $p en todas partes, pero parece que estoy equivocado. ¿Cuál sería el mejor enfoque?
En mi caso, por ejemplo, necesito en header.php:
$p->get_fplans_count();
En page-plans.php:
$p->get_purchased_plans();
Y así sucesivamente...
EDIT: No busco ayuda con PHP, solo quiero saber cómo usar una clase PHP correctamente en WordPress. Parece que es un poco confuso para mí explicarlo (el inglés no es mi lengua materna). Muchas gracias por toda su ayuda.

La forma más fácil de tener acceso a tu variable en otros archivos es hacer exactamente lo que Chip sugirió, globalizar la variable.
Esto es lo mismo que hace WordPress para hacer que variables globales como $wpdb
estén disponibles en otros archivos. Ya puedo ver que estás haciendo llamadas a la variable global $wpdb
en tu clase. Necesitas hacer lo mismo.
Al crear una instancia en functions.php
:
global $p;
$p = new Plans();
Al hacer referencia a la instancia global en header.php
, footer.php
, etc:
global $p;
$p->get_purchased_plans();
Con esto en mente, quiero aclarar dos cosas:
Esto no es una pregunta sobre WordPress
Sí, estás usando WordPress. Y sí, estás intentando averiguar cómo usar una clase dentro de WordPress. Pero esta pregunta no es específica de WordPress. Si estuvieras construyendo un sitio web usando solo PHP (es decir, un solo archivo index.php
que incluye header.php
y footer.php
y hace referencias dinámicas) todavía te encontrarías con el mismo problema.
Tu pregunta es sobre alcance de variables, no sobre WordPress. Chip tenía toda la razón al señalar esto antes. Lo explico aquí en lugar de en una pregunta para que entiendas por qué.
Cuando llamas $p = new Plans()
en tu archivo functions.php
, estás creando una instancia del objeto Plans
y almacenándola en una variable local llamada $p
. Si esa variable está definida dentro de una función (como debería estar), entonces esa variable es local para esa función. Si está definida dentro de una clase, es local para esa clase.
Ocasionalmente, puedes definir accidentalmente una variable en el alcance global... esto es un error común en desarrolladores nuevos en PHP o que están comenzando con programación orientada a objetos. No es algo malo per se, pero es un mal hábito.
Si necesitas acceso a tu variable fuera del alcance local inmediato, siempre siempre siempre usa la palabra clave global
para hacerla disponible. Dicho esto, asegúrate también de nombrar tu variable global de manera que se minimicen las colisiones de nombres.
$p
no es muy único. Es muy posible que un plugin (o el mismo WordPress) pueda redefinir $p
como algo diferente a una instancia de Plans()
más adelante. Eso rompería tu tema... ¡debe evitarse a toda costa!
Algo como $chifiliii_plans_p
sería una mejor opción porque es muy poco probable que otro sistema elija ese mismo nombre.
Lo estás haciendo mal
1 - Las tablas personalizadas son MALAS
Es mala práctica usar tablas personalizadas en WordPress. Hay muy pocos casos donde las tablas personalizadas están justificadas en el sistema, y en 6 años trabajando con la plataforma solo he encontrado 1 o 2 razones para tenerlas.
Si tu tema está destinado a distribuirse, recuerda que algunas personas no podrán usarlo. Varios consultores de seguridad recomiendan que el usuario a través del cual WordPress accede a la base de datos tenga funcionalidad limitada - en muchos sistemas compartidos, no puede crear tablas en primer lugar.
En sistemas multisitio, no solo estás agregando nuevas tablas para un sitio, estás agregando nuevas tablas para cada sitio que active tu tema. Esto aumenta drásticamente el tamaño de la base de datos, lo que podría ser un problema para algunos usuarios (aunque no para todos).
Si estás ejecutando consultas personalizadas directamente contra la base de datos, estás asumiendo muchas preocupaciones de seguridad. WordPress en sí es bastante seguro... a menos que hagas algo mal, es muy difícil exponerte a usuarios maliciosos que intenten inyección SQL y otros ataques contra tu sistema. Si estás ejecutando las consultas tú mismo (fuera de la API de WP_Query
), entonces necesitas sanitizar esas consultas para prevenir declaraciones maliciosas tú mismo.
Como está, WordPress ya tiene una fantástica API de Opciones.
WordPress también soporta Tipos de Entrada Personalizados para almacenar datos personalizados.
No reinventes la rueda... usa las herramientas que ya están disponibles para ayudarte.
2 - No incluyas funcionalidad en temas
Si tienes tanta funcionalidad avanzada integrada en tu tema, te estás preparando para el fracaso. ¿Qué pasa si un usuario desactiva tu tema? Simple... de repente todos sus datos personalizados desaparecen.
Se ha dicho muchas veces en este sitio: los temas están destinados a proporcionar estilo para WordPress. Los plugins están destinados a proporcionar funcionalidad. Si vas a almacenar datos personalizados, hazlo a través de un plugin. Usa el tema para dar estilo a la presentación de esos datos personalizados.

Gracias por explicar todo esto. El problema era una colisión de nombres como comenté en mi pregunta. Nunca uso tablas personalizadas pero para este proyecto no encontré una mejor manera de hacerlo. El tema se usa solo para un sitio que está construido en WordPress + BuddyPress. Tienes razón con el plugin, creo que cambiaré mi enfoque la próxima vez. Gracias por tomarte el tiempo de responder esto.
