¿Estoy usando el enfoque correcto para utilizar esta clase dentro de un tema de WordPress?

18 oct 2011, 15:51:33
Vistas: 474
Votos: -1

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.

7
Comentarios

Esta es una pregunta sobre PHP, no sobre WordPress.

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

No, no lo es. Es una pregunta sobre cómo usar php dentro de WordPress. ¿Acaso WordPress no usa JavaScript, php, etc.? Simplemente no sé cómo implementar la clase dentro de WordPress. Por favor, lee con atención antes de votar negativamente.

chifliiiii chifliiiii
18 oct 2011 15:57:34

Tu pregunta es sobre cómo llamar a una clase PHP y es completamente independiente de la plataforma. WordPress no afecta directa o indirectamente la respuesta a esta pregunta.

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

Lo siento Chip pero sigo sin estar de acuerdo contigo. Solo necesito saber cómo puedo ver mis variables en diferentes archivos de WordPress. Por favor, sé un poco más abierto de mente :D y ayúdame

chifliiiii chifliiiii
18 oct 2011 16:04:13

Aunque estoy un poco de acuerdo con Chip, diré que http://w3prodigy.com/web-production/behind-wordpress/php-classes-wordpress-plugin/ esto te dará una idea, esto http://codex.wordpress.org/Writing_a_Plugin, http://www.devlounge.net/code/structure-of-a-wordpress-plugin y http://striderweb.com/nerdaphernalia/2008/07/use-classes-in-your-wordpress-plugins/ y prácticamente todo lo demás en Google. Tener una instancia globalmente accesible es una práctica aceptable, pero no la llames $p, es demasiado corto y podría ser víctima de colisiones.

soulseekah soulseekah
18 oct 2011 16:09:18

También te sugiero que descargues algunos de los buenos plugins (especialmente los escritos por los mantenedores) y mires cómo lo hacen.

soulseekah soulseekah
18 oct 2011 16:14:42

¡Muchas gracias @Soulseekah! Era tan simple como una colisión de nombres, de alguna manera el $p no funcionó y en cuanto lo cambié a $plans comenzó a funcionar. ¡Gracias de nuevo!

chifliiiii chifliiiii
18 oct 2011 16:21:12
Mostrar los 2 comentarios restantes
Todas las respuestas a la pregunta 2
1

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.

18 oct 2011 17:22:50
Comentarios

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.

chifliiiii chifliiiii
18 oct 2011 17:48:32
0

Si necesitas que una variable esté disponible en todos los archivos de plantilla, globalízala, y llámala en header.php:

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

Solo asegúrate de globalizarla dondequiera que la llames:

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