Consultas a la base de datos en WordPress

Categoría: WordPress , 04/12/2011, 10 comentarios

Vuelvo a retomar la costumbre de escribir artículos aquí, con uno sobre WordPress, en este caso, con algo que más de uno nos hemos visto en la necesidad de hacer, acceder a una tabla de la base de datos desde el código de nuestra web hecha en WordPress.

Lo típico sería realizar la conexión usando las funciones de PHP pensadas para esa labor, como mysql_query, mysql_fetch_row … Pero ya que estamos en WordPress, hagamos uso del motor de conexión que tiene implementado internamente para realizar esta tarea.

Lo primero es hacer global la variable $wpdb, instancia de la clase preparada para hacer conexiones con la base de datos, una vez hecho, usamos las funciones de esta variable para realizar consultas, veamos un ejemplo:

<?php

global $wpdb;

$consulta = "SELECT * FROM tabla WHERE 1";
$resultado = $wpdb->get_results( $consulta );
foreach ( $resultado as $fila ):
 echo $fila->columna;
endforeach;

?>

Con este ejemplo hemos buscado todos los elementos de una tabla en concreto y hecho un recorrido por ellos mostrando el contenido de una de sus columnas. Es importante notar que la tabla a la que accedemos está en la misma base de datos con la que trabaja nuestro WordPress, en caso contrario, se puede hacer uso del plugin hyperdb.

Otros métodos que pueden resultarnos interesantes de la variable $wpdb son:

$wpdb->query('query'); // Hace una consulta sin devolver resultado.
$wpdb->get_var('query',column_offset,row_offset); // Obtiene el valor de un campo concreto, devuelve un valor.
$wpdb->get_row('query', output_type, row_offset); // Devuelve una fila concreta.
$wpdb->num_rows; // Devuelve el número de filas afectadas por la consulta realizada anteriormente.

El parámetro column_offset y row_offset nos indica la fila y columna deseada, empezando desde 0. El parámetro output_type indica cómo queremos que devuelva las filas obtenidas, puede tener tres valores:

  • OBJECT: Devuelve objetos, cada fila es accesible con los operadores -> ($fila->columna).
  • ARRAY_A: Devuelve arrays asociativos ($fila['columna']).
  • ARRAY_N: Devuelve arrays numerados ($fila[0]).

Y con esto tendríamos un ejemplo básico de cómo hacer accesos a la base de datos fuera de los típicos recorridos sobre los posts de nuestro WordPress.

  • Duarth

    Mu rico tú. Me estoy agenciando el Nakeme, NuaPorn viene de camino jejejejeje…

  • Novato

    Hola gracias por tu post. Tengo una duda de novato… es que mi wordpress me muestra los resultados a las consultas que hago con $wpdb sin declararla primero como global… ¿Por qué es necesario hacerla global?

    • http://www.franmoreno.com Fran Moreno

      Es necesario declararla como global en el caso de que este código lo escribas en una función, ya que las variables globales no están disponibles directamente en el ámbito de una función en php. Si haces la llamada desde el loop de wordpress por ejemplo, la variable estará declarada internamente y no es necesario volver a hacerlo. 

  • Valentin

    gracias por el tutorial, me fue muy util, pero solo me muestra los resultados si el usuario esta logeado, como hacer para que cualquiera que visite la web pueda observar los resultados.

    • http://www.franmoreno.com Fran Moreno

      Hmm, es raro, donde has puesto el código? puede que esté en algún trozo de código con restricción de usuarios?

  • Javier

    Hola Fran,

    Gracias por tus apuntes. Son muy interesantes.

    Mi problema es que quiero acceder a una base de datos de WordPress, fuera de wordpress.

    Es decir que quiero mostrar los datos de una tabla de wordpress pero mediante programación php clásica… y no lo consigo.

    Concretamente lo que quiero hacer es mostrar todos los titulares de los posts que he escrito en WordPress.

    He intentado hacerlo estableciendo una conexión como si fuera una base de datos clásica (no de wordpress) e indicando mi nombre de la base de datos, usuario y contraseña pero no me funciona. Aquí el ejemplo que no funciona:

    <?
    //conectamos con y seleccionamos la base de datos
    $connect=mysql_connect("localhost","usuario","contraseña");
    //Seleccionamos la base
    mysql_select_db("nombredelabasededatos",$connect);
    //hacemos las consultas
    $result=mysql_query("select * from c order by fecha DESC limit 0,20", $connect);
    $totalregistros=mysql_num_rows($result);
    //Recogemos las consultas en un array y las mostramos
    while($row=mysql_fetch_array($result))
    {
    echo $row[post_title];
    echo "”;
    echo $row[post_date];
    }
    mysql_free_result($result)
    ?>

    Como verás concretamente quiero acceder a la tabla wp_posts y mostrar el campo post_title y post_date pero no lo consigo, cuando si fuera una base de datos clásica funcionaría perfectamente.

    ¿Me puedes ayudar?

    He intentado con tu ejemplo y con la variable $wpdb sustituyendo el nombre de la tabla y las variables pero tampoco me funciona y me extraña que no me pida los datos de la base de datos (nombre de la base de datos, usuario y contraseña).

    Disculpa pero no soy experto y a veces me cuesta entender todo esto.

    Gracias anticipadas por tu ayuda,

    Javier

  • Javier

    Perdona Fran,

    Creo que el código del ejemplo que te mando no se ha publicado correctamente a pesar de que he puesto las etiquetas, a ver si ahora funciona:

    //conectamos con y seleccionamos la base de datos
    $connect=mysql_connect(“localhost”,”usuario”,”contraseña”);
    //Seleccionamos la base
    mysql_select_db(“nombredelabasededatos”,$connect);
    //hacemos las consultas
    $result=mysql_query(“select * from c order by fecha DESC limit 0,20″, $connect);
    $totalregistros=mysql_num_rows($result);
    //Recogemos las consultas en un array y las mostramos
    while($row=mysql_fetch_array($result))
    {
    echo $row[post_title];
    echo “”;
    echo $row[post_date];
    }
    mysql_free_result($result)

    A ver si hay suerte y puedes ver el ejemplo que no me funciona.

    • http://www.franmoreno.com Fran Moreno

      Hola @f66532b088a51d25b583813c3f63a7f9:disqus te comento, si en tu fichero php, que está en el mismo servidor que la instalación de WordPress, incluyes el fichero wp-load.php puedes acceder a las funciones de WordPress, carga automáticamente los datos de la base de datos, etc… creo que esto simplificaría bastante el trabajo.

  • Morfil

    Hola estoy empenzando a incursionar en el desarrollo de cosas propias con wordpress y paar empezar necesito hacer consultas, pero se me presentó un problema.

    Deseo hacer consultas y me tope con tu blog y quise probar y en el archivo categories.php puse esto:
    global $wpdb;
    $variable = $wpdb->get_row(“SELECT post_title FROM $wpdb->posts WHERE id = 78”);
    echo $variable->id;
    ?>

    pero no sale nada, no muestra nada, sabes que estoy haciendo mal..

    Ante cualquier respuesta, gracias.
    Saludos.