Extender wpdb en otra clase: cuando uso get_results para seleccionar me da nulo

2 minutos de lectura

Agregué un complemento personalizado (creado por mí) en WP en ese complemento que tengo Class llamado BaseModel, que extiende wpdb.

El problema aquí es que cada vez que intento ejecutar una consulta obtengo como resultado una matriz falsa, nula o vacía.

class BaseModel extends wpdb{

public function __construct(){
    parent::__construct(DB_HOST, DB_USER, DB_PASS, DB_NAME);
}

function get_destinations($limit, $order){
    $query = "SELECT * FROM wp_relations";

    $result = $this->get_results($query, ARRAY_A);
    var_dump($result); 
}

function get_total_destinations(){
}}

¿Puede alguien decirme qué está mal?

Gracias.

  • ¿Está seguro de que las constantes de credenciales de db están definidas?

    –Edson Medina

    18/03/2014 a las 15:40

En realidad, no es una solución OOP completa, pero lo soluciono agregando $wpdb global a mis funciones.

class BaseModel {


function get_destinations($limit, $order){
    global $wpdb;
    $query = "SELECT * FROM wp_relations";

    $result = $wpdb->get_results($query, ARRAY_A);
    var_dump($result); 
}

function get_total_destinations(){
}}

Espero que encuentre esto útil.

Más info Pruebas de WordPress con wpdb

<?php
class testWPDB extends wpdb {
function prepare( $query, $arguments ){
        return vsprintf( $query, $arguments );
    }
}

class UTCW_Test_Data extends WP_UnitTestCase {
protected $utcw;
function setUp(){
    $this->utcw = UTCW_Plugin::get_instance();
}

function getWPDBMock(){
    return $this->getMock( 'testWPDB', array( 'get_results' ), array(), '', false );
}

function test_author(){
    $instance[ 'authors' ] = array( 1, 2, 3 );
    $config = new UTCW_Config( $instance, $this->utcw );
    $db = $this->getWPDBMock( 'get_results' );

    $db->expects( $this->once() )
    ->method( 'get_results' )
    ->with( $this->stringContains( 'post_author IN (1,2,3)' ) );

    $data = new UTCW_Data( $config, $db );
    $data->get_terms();
    }
}

No creo que quieras extenderte de eso? Si esta clase siempre se cargará dentro de los archivos de WordPress, tendrá acceso al $wpdb global.

class RandomClass {

    private $wpdb = false;

    public function __construct() {
        global $wpdb;

        if (is_object($wpdb)) {
            $this->wpdb = $wpdb;
        }
    }

    public function get_results($data) {
         return $this->wpdb->get_results($data);
    }
}    

¿Ha sido útil esta solución?