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 mysql. Mostrar todas las entradas
Mostrando entradas con la etiqueta mysql. Mostrar todas las entradas

sábado, 27 de julio de 2013

Cpanel::TailWatch::Eximstats appears to have unprocessed SQL in /var/cpanel/sql/eximstats.sql.

Qué hacer ante el siguiente error?

!!
ATTENTION ATTENTION ATTENTION ATTENTION 

Cpanel::TailWatch::Eximstats appears to have unprocessed SQL in /var/cpanel/sql/eximstats.sql.

When mysql is unable to execute a query they are logged for processing later.

Eventually these SQL files may be handled automatically and this message will not appear.

In the meantime you can execute the queries as root with something like this:

  mv /var/cpanel/sql/eximstats.sql /var/cpanel/sql/eximstats.sql.tmp_working_copy
  /scripts/restartsrv_tailwatchd
  mysql eximstats < /var/cpanel/sql/eximstats.sql.tmp_working_copy

Once you are sure all is well you can remove /var/cpanel/sql/eximstats.sql.tmp_working_copy


ATTENTION ATTENTION ATTENTION ATTENTION 
!!



Distintas alternativas a seguir:
  1. Seguir los pasos indicados en el mensaje de error
  2. Reparar la base Exmistats
  3. Limpiar las 4 tablas de esa base (truncate)
  4. Evitar que los scripts PHP envíen correos electrónicos
Más info en:

viernes, 26 de julio de 2013

¿Cómo editar la configuración de MYSQL?

¿Cómo editar la configuración de MYSQL? Ingresar a la consola:

Para ver el contenido

cat /etc/my.cnf

Para hacer un backup

cp /etc/my.cnf /etc/my.cnf.old

Para editar

nano /etc/my.cnf

Para reiniciar MYSQL

/etc/init.d/mysql restart

martes, 19 de febrero de 2013

Automatización avanzada para Community Managers - Caso 2

Los community managers necesitan automatizar tareas, para poder así ocupar su valioso tiempo en actividades estratégicas y de relacionamiento personalizado con clientes. La automatización se encara muchas veces con herramientas gratuitas o no. Pero no debe ser la única forma. Con un poco de programación, se pueden obtener resultados mucho más contundentes y complementarios. En esta serie de artículos publicaremos ejemplos de casos reales que esperamos les sirvan de inspiración, para estar un paso adelante de la competencia!

Ver toda la serie de Automatización.

Requerimiento

Se requiere crear un artículo en WordPress que tenga la forma de un resumen fotográfico de los últimos 16 artículos. Este artículo debe ser enviado en una newsletter de forma automática. La intervención del usuario debe ser nula.

¿Por qué? Para aumentar las lecturas, con un formato más amigable a través del uso de una galería de fotos, creando además la costumbre en el usuario de recibir esta información con cierta frecuencia.

En la siguiente imagen se puede ver un ejemplo:




Herramientas involucradas

  • WordPress
  • WordPress API
  • PHP
  • MySQL
  • Cron
  • RSS
  • MailChimp

Enfoque de solución

1. Un proceso PHP controla frecuentemente si se ha alcanzado la cantidad de 16 nuevos artículos con fotos, luego de la publicación del último resumen fotográfico  Para ello programamos el Cron de nuestro server para que ejecute el proceso por lo menos una vez al día. Además hemos creado una tabla en MySQL para guardar el ID de último artículo procesado.

2. Utilizando la API de WordPress, creamos un artículo en nuestro sitio con el HTML y estilo que nos guste, agrupando las fotos según nuestro criterio. Cada foto tendrá un link al artículo al que haga referencia.

3. El RSS de nuestro sitio publicará el resumen fotográfico como una artículo nuevo. Aquí no hay que hacer nada, es una funcionalidad estándar.

4. Dentro de MailChimp, creamos una campaña basada en nuestro RSS y seleccionamos en que días y horarios puede ser enviada. Esto cierra el circuito. Sólo hay que sentarse a esperar que el sistema genere los resúmenes por nuestra cuenta. Y que MailChimp los tome de nuestro RSS y así lo envíe a nuestros lectores.

Quizá parezca complicado, pero está hecho con pocas líneas de código. La imagen lo resume:




Los puntos más importantes son:
  1. Crear una consulta SQL para detectar las novedades que contengan fotos.
  2. Crear una tabla para almacenar el id de la última novedad procesada.
  3. Aprender a usar la API de WordPress para crear el post.
  4. Crear una campaña RSS en MailChimp.

Beneficios:

Los resúmenes sirven para recuperar lecturas perdidas. Si el resumen es vistoso y frecuente, más interés generará. Luego de implementar la acción, el tráfico aumentará con nada de esfuerzo.

Enlaces de interés:


Quedo a la espera de preguntas, comentarios e ideas. Saludos!

miércoles, 6 de febrero de 2013

Automatización avanzada para Community Managers - Caso 1

Los community managers necesitan automatizar tareas, para poder así ocupar su valioso tiempo en actividades estratégicas y de relacionamiento personalizado con clientes. La automatización se encara muchas veces con herramientas gratuitas o no. Pero no debe ser la única forma. Con un poco de programación, se pueden obtener resultados mucho más contundentes y complementarios. En esta serie de artículos publicaremos ejemplos de casos reales que esperamos les sirvan de inspiración, para estar un paso adelante de la competencia!

Ver toda la serie de Automatización.

Requerimiento

Se requiere que cuando el administrador de un sitio en WordPress vote positivamente un contenido, ese contenido sea publicado 5 veces en Twitter y en una página de Facebook, en diferentes días y horarios.

¿Por qué? Para aumentar el tráfico hacia el sitio, ya que la mayoría de los seguidores, no leen todos los tweets de las cuentas que siguen.

Herramientas involucradas

  • WordPress
  • PHP
  • MySQL
  • Cron
  • IFTTT
  • Twitter
  • Facebook


Enfoque de solución

1. En WordPress, el administrador marcará las publicaciones importantes desde la interfaz web. Esto puede realizarse de distintas formas e incluso puede depender de los plugins que utilices. Lo que nos importa es que deje un rastro en la base de datos. Está será la única intervención manual del usuario.

2. Un programa PHP se ejecutará con cierta frecuencia y detectará las publicaciones que han sido marcadas por la cuentas del administrador únicamente. ¿Cómo lo detecta? Simplemente haciendo una consulta a la base de datos.

3. Cuando detecte esas entradas, las programará cargándolas en una tabla SQL con la fecha en que deberán ser enviadas a las redes sociales. Se trata de una programación automática de tareas e inteligente. El sueño de muchos community managers :-)

4. Otro programa PHP se ejecutará cada 15 minutos buscando en la tabla SQL las publicaciones a enviar. Cuando las detecte, las enviará vía correo electrónico a una cuenta de IFTTT. Este simple envío de correo, nos comunica con el mundo exterior.

5. Cuando IFTTT reciba los mails, publicará en forma automática en Twitter y Facebook a través de dos recetas. Esto es lo que IFTTT sabe hacer y se configura en 5 minutos.

Y así termina el ciclo. Quizá parezca complicado, pero está hecho con pocas líneas de código. La imagen lo resume:



Los puntos más importantes de la programación:
  1. Crear una consulta SQL para detectar las novedades marcadas por el administrador.
  2. Crear una tabla para almacenar el id de la última novedad procesada.
  3. Enviar un mail a IFTTT.
Si lo piensan, nos es complejo para un desarrollador de software. Y la programación del proceso en el Cron de nuestro server que es muy sencilla.

Beneficios:

Luego de esta implementación, el community manager, sólo marca en WordPress lo que quiere enviar a las redes en diferentes días y horarios. Incluso esto podría automatizarse, si encontráramos un buen criterio para detectar lo importante. Y así quedaría 100% automatizado.

En la práctica, esto puede aumentar el tráfico a tu sitio en forma importante y con poco esfuerzo.

Enlaces de interés:


Quedo a la espera de preguntas, comentarios e ideas. Saludos!

sábado, 8 de septiembre de 2012

Error al realizar una publicación en BuddyPress


Supongan que encuentran un error en BuddyPress al tratar de insertar una nueva publicación o comentar una actividad existente como el siguiente:

Error Duplicate entry '23518' for key 'PRIMARY' de la base de datos de WordPress para la consulta INSERT INTO wp_bp_activity ( user_id, component, type, action, content, primary_link, date_recorded, item_id, secondary_item_id, hide_sitewide ) VALUES ( 2, 'activity', 'activity_update', ..

Se trata de un error de clave duplicada. Es fatal porque impide realizar prácticamente cualquier actividad en BuddyPress.

La solución es más que sencilla. Reparar la tabla wp_bp_activity en MySQL.

Espero les sea útil. Hasta la próxima.

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!

viernes, 19 de agosto de 2011

Instalar WordPress localmente en Windows con Xampp

Instalar WordPress en Windows es una tarea realmente sencilla y rápida. Aquí les dejo un enlace con un excelente paso a paso: http://wpmu.org/install-wordpress-locally-on-windows-with-xampp/

Espero que les sea útil!

image

lunes, 11 de abril de 2011

¿Cómo instalar #WordPress en Windows?

1) Instalá XAMPP y asegurate que Apache y MySQL estén levantados:

image

2) Descomprimí WordPress en una carpeta cualquiera dentro de “C:\xampp\htdocs”.

Podés descargarlo desde: http://es.wordpress.org/

3) Creá una base de datos desde la administración de MySql

4) Configurá los parámetros de base de datos en el archivo “wp-config.php.”:

define('DB_NAME', 'nombre de la base');

define('DB_USER', 'root');

define('DB_PASSWORD', '');

5) Ejecutá “http://localhost/{carpeta en donde instalaste}/wp-admin/install.php”

y…

image

Nota: en caso que obtengas un error como el siguiente:

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\wp-config.php:1) in C:\xampp\htdocs\autos\wp-login.php on line 354
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\wp-config.php:1) in C:\xampp\htdocs\autos\wp-login.php on line 366

Es porque has usado el bloc de notas de windows y no has grabado con formato ANSI. Graba en ANSI y todo resuelto:

image