WordPress

Compartiendo experiencias sobre la plataforma CMS más importante del mundo

BuddyPress

El increíble y fabuloso plugin de WordPress para crear redes sociales verticales

¿Cómo crear una RED SOCIAL?

Experiencias, ideas y materiales para llevar adelante tu próximo proyecto de creación de una red social

Mostrando entradas con la etiqueta Desarrollo. Mostrar todas las entradas
Mostrando entradas con la etiqueta Desarrollo. Mostrar todas las entradas

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!

domingo, 5 de agosto de 2012

¿Cómo desarrollar un plugin para WordPress?

Si trabajas con WordPress sabrás que una de las formas más utilizadas de extender la plataforma es a través de los Plugins. Quizá muchas veces te has encontrado utilizando plugins construidos por terceros, pero nunca te has embarcado en la tarea de desarrollar un plugin. Aunque no lo creas, no es una tarea compleja, si ya posees conocimientos de programación.

En este breve artículo, explicaremos cómo construir uno sencillo. Espero te resulte útil!

imageAlcance de este pequeño plugin

Trabajo en algunos proyectos en WordPress en donde además de permitir el registro de usuarios por el método estándar, también permito que los usuarios ingresen al sistema con sus cuentas de Twitter o Facebook, para lo cual utilizo plugins existentes.

Sin embargo, en algunos casos, estos plugins permiten a los usuarios ingresar al sistema sin especificar su correo electrónico (en realidad eso depende de como los configures).

Lo que vamos a hacer en este breve ejemplo, es construir un plugin que le recomiende a los usuarios que no tengan configurado bien su correo, que lo hagan. Para ello agregaremos un widget en la SideBar con un cartel de advertencia, como el que puede verse la imagen de la derecha

Funcionamiento

Parte 1: verificación del correo del usuario

Nuestro plugin tendrá un funcionamiento sencillo.
Primero crearemos una función para consultar el correo electrónico del usuario. Trabajaremos con dos funciones de WordPress:
  • is_user_logged_in: para verificar si hay un usuario conectado.
  • wp_get_current_user: para obtener la cuenta de correo del usuario conectado.
En nuestro caso, a los usuarios que ingresan usando la autenticación de Twitter o Facebook, se les crea un correo electrónico obligatorio ficticio:
  • Los de Facebook contienen el dominio “unknown.com”
  • Los de Twitter comienzan con el nombre “changeme”
Nuestro algoritmo determinará si el correo posee esas cadenas para decidir si tiene que advertir o no al usuario.


Parte 2: widget

La segunda parte se encargará de mostrar una advertencia al usuario en un widget que podrá agregarse en el SideBar:
image

Además agregará un link que lleve al usuario a la página de configuración de su correo. En nuestro caso, como se trata de una red social vertical creada con el plugin BuddyPress, utilizaremos datos globales de BuddyPress que podemos obtener con la instrucción:

global $bp;

Y en particular la URL del perfil con:

$bp->loggedin_user->domain

¿Cómo se construye el plugin?

Simplemente se crea el código PHP respetando el encabezado especificado por WordPress (el código lo pueden ver en la próxima sección). El archivo puede grabarse como main.php y almacenarse en una carpeta dentro de la carpeta: /wp-content/plugins/. También será necesario almacenar un archivo readme.txt.

Una vez que hayamos almacenado el plugin en la carpeta correspondiente aparecerá en la lista de nuestros plugins inactivos listo para activarlo:

image

Una vez activado, sólo nos queda agregar el widget en la SideBar y ya podemos comenzar a utilizarlo.

image

El código

A continuación les pego el código completo:

<?php

/*
Plugin Name: Autonautas Mail Verification
Plugin URI: http://viviendoenlaeradelaweb20.blogspot.com/
Description: Verifica que el usuario tenga bien configurado su correo. Caso contrario emite una alerta en el SideBar.
Version: 1.0
Author: Juan Pablo Pussacq Laborde
Author URI: http://viviendoenlaeradelaweb20.blogspot.com/
License: GPL2
*/

function autonautas_mail_read () {

    $resultado = "OK";

    // Sólo se controla al usuario conectado
    if ( is_user_logged_in() ) {

        $usuario_actual = wp_get_current_user();
        $correo_actual = $usuario_actual->user_email;

        // Sufijo que tienen los mails de los usuarios registrados con Twitter
        $buscado_t = strpos($correo_actual, "changeme");

        // Sufijo que tienen los mails de los usuarios registrados con Facebook
        $buscado_f = strpos($correo_actual, "unknown.com");

        if ( ($buscado_t !== FALSE) or ($buscado_f !== FALSE) ) {
            $resultado = "MAL";
            }
        }

    return $resultado;
}

add_action('wp_head','autonautas_mail_read');

function autonautas_mail_widget () {

    $estado_correo = autonautas_mail_read ();
  
    if ( $estado_correo !== "OK" ) {

        global $bp; // Datos globales de BuddyPress

        echo "<p></p>";
        echo "<div style='padding: 15px; color: black; border-radius: 3px; background-color: white; border: 7px solid red;' id='autonautas_mail_verification'>";
        echo "<p></p>";
        echo "<center>";
        echo "<h3>Advertencia!!</h3>";
        echo "</center>";
        echo "<p></p>";
        echo "<p>Tu correo electrónico no está configurado. Ante cualquier problema con tu cuenta no podremos contactarte <a href='/2011/11/configura-tu-correo/'>[...]</a></p>";
        echo "<p></p>";
        echo "<p></p>";
        echo "<center>";
        echo "<img src='/wp-content/uploads/2011/08/mensajes.png'></img>";
        echo "<div id='autoayuda' class='activity-list'><div class='activity-header'><a width: 120px ; display: block; ' href='" . $bp->loggedin_user->domain . "settings/'>Configura tu correo</a></div></div>";
        echo "</center>";
        echo "<p></p>";
        echo "<p></p>";
        echo "</div>";
        }
}

wp_register_sidebar_widget('autonautas_mail_verification', 'autonautas_mail_verification', 'autonautas_mail_widget');

?>

Conclusión

Como pueden ver, crear un plugin no es complicado y muchas veces puede ayudarnos con ciertas actividades que no podemos resolver con otros plugins. Espero que les haya servido.

Hasta la próxima!

Enlaces de interés: