jueves, 23 de agosto de 2012

¿Cómo desarrollar un plugin para WordPress con acceso a la Base de Datos?

Hace algunos días mostré un ejemplo sencillo de cómo crear un primer plugin para WordPress. Vimos que no era complejo si contamos con conocimientos de programación. En este segundo artículo, daremos un paso más y haremos que el plugin acceda a la Base de Datos para realizar algún tipo de consulta.

Espero les resulte útil!

Alcance de este plugin

Imaginemos que en nuestro sitio WordPress se registran usuarios. Esos usuarios, deben completar algunos datos sobre su perfil, cambiar su foto, así como también realizar algunas publicaciones.

Una vez que hayan completado esos pasos, diremos que su perfil está al 100%, pero mientras tanto, le indicaremos a través de una barra de estado, cuál es el grado de completitud de su perfil y cómo puede hacer para completarlo.

En la imagen se puede ver un ejemplo de cómo se ve visualmente este plugin a través de un widget en la barra lateral derecha:

Funcionamiento

Este plugin consulta ciertos datos de nuestra base de datos para ver el estado del perfil. Esto lo hace de dos formas:

  • Usando la API de WordPress y de BuddyPress siempre que exista alguna función para extraer un dato.
  • Accediendo directmanete a las tablas de MySQL, en los casos que la API no nos provee la información necesaria.
Cuando hablamos de la API de WordPress, hablamos por ejemplo de una función como la siguiente para obtener el correo del usuario:

wp_get_current_user()->user_email;

Cuando hablamos de la API de BuddyPress (el plugin de WordPress para redes sociales), hablamos por ejemplo de esta función para obtener la URL del perfil del usuario:

$usuario_url = $bp->loggedin_user->domain;

Cuando hablamos de SQL, ya estamos hablando de consultas directas a la base, por ejemplo la siguiente consulta para ver la cantidad de amigos del usuario activo:

global $wpdb;

$usuario_id = $bp->loggedin_user->id;

$valor_amigos = $wpdb->get_var('SELECT COUNT(*) FROM wp_bp_friends WHERE (initiator_user_id =  ' . $usuario_id . ' OR friend_user_id = ' . $usuario_id  . ') AND is_confirmed = 1');

El plugin no tiene mucha más ciencia. Seguramente verán que algunas de las consultas SQL también se pueden hacer vía API. Por supuesto, el tipo de consultas a realizar, dependerá de sus necesidades, pero el ejemplo es válido para entender cómo acceder a la base de datos de WordPress

El código


Aquí el código completo:

<?php

/*
Plugin Name: Autonautas Profile Status
Plugin URI: http://viviendoenlaeradelaweb20.blogspot.com/
Description: Indica el % de completitud del perfil de usuario y los pasos a seguir para aumentar el %.
Version: 1.0
Author: Juan Pablo Pussacq Laborde
Author URI: http://viviendoenlaeradelaweb20.blogspot.com/
License: GPL2
*/

function autonautas_profile_widget () {

    // Sólo para usuarios conectados
    if ( is_user_logged_in() ) {
    
        global $bp;   // Datos globales de BuddyPress
        global $wpdb; // Datos globales de la Base de Datos

        $usuario_id      = $bp->loggedin_user->id;
        $usuario_url     = $bp->loggedin_user->domain;
        $perfil          = 100; // % de completitud del perfil

        // Datos de perfil a evaluar
        $valor_correo    = wp_get_current_user()->user_email;
        $valor_foto      = bp_core_fetch_avatar( 'html=false&item_id=' . $usuario_id);
        $valor_foto_fb   = get_user_meta($usuario_id, 'facebook_avatar_full', true);
        $valor_biografia = $wpdb->get_var('SELECT value FROM wp_bp_xprofile_data WHERE field_id = 2 AND user_id = ' . $usuario_id);
        $valor_ubicacion = $wpdb->get_var('SELECT value FROM wp_bp_xprofile_data WHERE field_id = 3 AND user_id = ' . $usuario_id);
        $valor_actividad = $wpdb->get_var('SELECT COUNT(*) FROM wp_bp_activity WHERE type = "activity_update" AND user_id =  ' . $usuario_id);
        $valor_grupos    = $wpdb->get_var('SELECT COUNT(*) FROM wp_bp_groups_members WHERE user_id =  ' . $usuario_id);
        $valor_amigos    = $wpdb->get_var('SELECT COUNT(*) FROM wp_bp_friends WHERE (initiator_user_id =  ' . $usuario_id . ' OR friend_user_id = ' . $usuario_id  . ') AND is_confirmed = 1');
        $valor_acelerar  = $wpdb->get_var('SELECT COUNT(*) FROM wp_bp_activity WHERE type = "activity_liked" AND user_id =  ' . $usuario_id);

        // Control de estado de los valores
        $estado_correo = autonautas_mail ($valor_correo);
        $estado_foto   = autonautas_foto ($valor_foto, $valor_foto_fb);

        // Salida por pantalla - Acciones para mejorar el perfil
        if ( $estado_correo !== "OK" )  { echo autonautas_imprimir ( $usuario_url . "settings/"              , "Configura tu Correo"    , 20 )   ; $perfil = $perfil-20; }
        if ( $estado_foto !== "OK" )    { echo autonautas_imprimir ( $usuario_url . "profile/change-avatar/" , "Sube tu Foto"          , 20 )   ; $perfil = $perfil-20; } 
        if ( $valor_biografia == "" )   { echo autonautas_imprimir ( $usuario_url . "profile/edit/group/1/"  , "Completa tu Biografía"  ,  5 )   ; $perfil = $perfil-5;  }
        if ( $valor_ubicacion == "" )   { echo autonautas_imprimir ( $usuario_url . "profile/edit/group/1/"  , "Completa tu Ubicación"  ,  5 )   ; $perfil = $perfil-5;  }
        if ( $valor_grupos < 6 )        { echo autonautas_imprimir (                "/groups/"                , "Participa en 5 Garages" , 10 )   ; $perfil = $perfil-10; }
        if ( $valor_amigos < 10 )       { echo autonautas_imprimir ( $usuario_url . "friends/"               , "Agrega 10 Amigos"       , 20 )   ; $perfil = $perfil-20; }
        if ( $valor_actividad < 1 )     { echo autonautas_imprimir (                "/activity/"             , "Publica algo"           ,  5 )   ; $perfil = $perfil-5; }
        if ( $valor_acelerar < 1 )      { echo autonautas_imprimir (                "/activity/"             , "Presiona Acelerar"      ,  5 )   ; $perfil = $perfil-5; }

        // Salida por pantalla - Valor del perfil si no es 100
        if ( $perfil <> 100 ) {
            echo "</br ></br ><div style='background: white; border: 1px solid #666666;'><div style='width: " . $perfil . "%; height: 10px; background-color: #1B68AC; border: 1px solid #4987BD'></div></div>";
            echo "<center><p style='{ position: abosolute; top: 50px; left: 10px;}'><strong>" . $perfil . "%</strong> del perfil completo.</p></center>";
            }
        }
}

wp_register_sidebar_widget('autonautas_profile_status', 'autonautas_profile_status', 'autonautas_profile_widget');

function autonautas_mail ($correo) {
    $resultado = "OK";    
    $buscado_t = strpos($correo, "changeme");     // Caso Twitter
    $buscado_f = strpos($correo, "unknown.com");  // Caso Facebook
    if ( ($buscado_t !== FALSE) or ($buscado_f !== FALSE) ) {
        $resultado = "MAL";
        }
    return $resultado;
}

function autonautas_foto ($foto, $foto_fb) {

    // Si tiene foto de Facebook, está OK y termino
    $buscado_fb = strpos($foto_fb, "fbcdn");
    if ( $buscado_fb !== FALSE ) {
        return "OK";
        }

    // Si no tiene foto de Facebook y tiene un gravatar dibujado, entonces está mal
    $buscado = strpos($foto, "wavatar");
    if ( $buscado !== FALSE ) {
        return "MAL";
        }

    // No tiene Facebook, pero tampo avatar falso, entonces OK
    return "OK";

}

function autonautas_imprimir ($url_boton, $nombre_boton, $avance) {
    echo "</br ><a href='" . $url_boton . "'>" . $nombre_boton . "</a><span style='color: #666666;'> (" . $avance . "%)</span>";
}

?>

Conclusión

En este artículo vimos cómo crear un plugin en WordPress que acceda a la base de datos MySQL. En mi opinión, no es un tema realmente complejo, y nos brinda a cambio un enorme potencial para nuestros sitios.

Espero les haya resultado útil y los invito a opinar y consultar. Saludos!

0 comentarios:

Publicar un comentario en la entrada