martes, 26 de enero de 2016




dic112013

Artículo PHP
La funcionalidad base del sistema de gestión de contenidos (CMS) WordPress puede ser ampliada desarrollando temas y plugins que se integran en el código mediante puntos de anclaje.
Para implementar uno de estos componentes añadidos, el desarrollador puede encontrar necesario añadir tablas a la base de datos, o realizar consultas contra las tablas existentes en un modo que no está previsto por las funciones disponibles en la distribución base de WordPress.
Para permitir este tipo de acceso a la base de datos, WordPress ofrece una clase “wpdb” que permite consultar y actualizar cualquier información existente en la misma.
En este artículo presentamos la manera de trabajar con el objeto $wpdb.


1. Realizar una consulta sencilla

El método get_results() del objeto $wpdb es la manera más sencilla de obtener información de una tabla. Por ejemplo, para leer los registros de una tabla ‘mitabla’ en la base de datos de wordpress:
global $wpdb;
$registros = $wpdb->get_results( "SELECT id, nombre FROM mitabla" );
echo "Registro #1. ID: " . $registros[0]->id . ", Nombre: " . $registros[0]->nombre . "<br/>";
Por defecto, get_results() devuelve un array con índice numérico de objetos cuyos atributos son los campos seleccionados. Opcionalmente, se le puede pasar un segundo argumento indicando el formato en el que se desea obtener el resultado. Las constantes predefinidas que se pueden utilizar para este segundo argumento son:
  • OBJECT – es el formato por defecto. El resultado se entrega en forma de un array de objetos con índice numérico. Cada una de las entradas del array corresponde a una fila.
  • OBJECT_K – el resultado se entrega en forma de un array asociativo, en donde las claves son los valores de la primera columna (descartando duplicados)
  • ARRAY_A – El resultado es un array con índice numérico de arrays asociativos. Cada uno de los arrays asociativos utiliza los nombres de columna como claves.
  • ARRAY_N – El resultado es un array con índice numérico de arrays con índice numérico
Ejemplo:
global $wpdb;
$registros = $wpdb->get_results( "SELECT id, nombre FROM mitabla", ARRAY_A );
echo "El nombre que aparece en el primer registro es: " . $registros[0]["nombre"] . "\n";

2. Insertar un nuevo registro en una tabla

El método insert() del objeto $wpdb permite insertar un nuevo registro en una tabla, con una llamada de la forma:
$wpdb->insert( $tabla, $datos, $formato );
En donde los argumentos son:
  • $tabla (string) – El nombre de la tabla en donde se va a insertar el registro
  • datos (array) – Array asociativo que contiene los datos a insertar (en forma de pares columna => valor).
  • formato (array|string) (opcional) – Un array de formatos para cada uno de los valores en el array $datos. Si en lugar de un array se pasa un único string, su valor se utilizará para todos los valores del array $datos. Si se omite, todos los valores serán tratados como strings a menos que se haya especificado algo distinto en wpdb::$field_types.
Los valores posibles que pueden aparecer en el array $formato son: %s (string); %d (integer); %f (float).
Si la tabla contiene una columna de tipo AUTO_INCREMENT, es posible acceder al valor asignado a dicha columna con la expresión:
$wpdb->insert_id
El método insert() devuelve “false” si el registro no ha podido ser insertado.
Ejemplo:
Insertar un registro de dos columnas, en donde el primer valor es un número y el segundo una cadena de texto.
$wpdb->insert(
    'tabla',
    array(
        'columna1' => 123,
        'columna2' => 'valor 1'
    ),
    array(
        '%d',
        '%s'
    )
);

3. Método replace()

El método replace() del objeto $wpdb es similar al método insert(). La principal diferencia es que si ya existe algún registro en la tabla que coincida con el registro a insertar para alguno de los índices únicos definidos para la tabla, dicho registro (o registros) es eliminado antes de insertar el nuevo registro.
el método replace() devuelve el número de registros afectados, o bien el valor “false” si el registro no ha podido ser insertado.
Así, si el valor devuelto es 1, significa que el nuevo registro ha sido insertado y no existía ningún registro coincidente.

4. Método update()

El objeto $wpdb también tiene un método update() para realizar la actualización de los registros de una tabla. La llamada es de la forma:
$wpdb->update( $tabla, $datos, $condicion, $formato = null, $formato_condicion = null );
Los argumentos que se le pasan al método update() son:
  • tabla (string) – El nombre de la tabla a actualizar
  • datos (array) array asociativo de la forma (columna => valor) con los datos a insertar. Tanto los nombres de las columnas como los valores deben estar tal cual, sin añadir caracteres de escape (“\”) mysql. Esto significa que si se van a insertar datos recibidos mediante GET o POST, puede ser necesario utilizar la función stripslashes() para evitar que los caracteres de escape se inserten en la base de datos.
  • condicion (array) –  Un array asociativo de cláusulas WHERE (en forma de pares columna => valor). Las cláusulas se unen con el operador AND.
  • formato (array|string) (opcional) Un array de formatos para cada uno de los valores del array $datos. Si en lugar de un array se pasa un único string, su valor se utilizará para todos los valores del array $datos.
  • formato_condicion (array|string) (optional) Un array de formatos para cada uno de los valores del array $condicion.Si en lugar de un array se pasa un único string, su valor se utilizará para todos los valores del array $condicion.
Ejemplo:
Actualizar un registro de la tabla “tabla”, en donde el campo ID es 1. El valor de la primera columna es un número, y el de la segunda columna es una cadena de texto:
$wpdb->update(
    'tabla',
    array(
        'columna1' => 123,     // número
        'columna2' => 'valor2' // string
    ),
    array( 'ID' => 1 ),
    array(
        '%d', // valor1 (número)
        '%s'  // valor2 (string)
    ),
    array( '%d' ) //valor del campo en la condición (número)
);

5. Eliminar registros de una tabla

El método delete() permite eliminar registros de una tabla. La llamada al método delete() es muy similar a la del método update():
$wpdb->delete( $tabla, $condicion, $formato_condicion = null );
Ejemplos:
// Uso por defecto
$wpdb->delete( 'tabla', array( 'ID' => 1 ) );
// Uso especificando formato de condicion
$wpdb->delete( 'tabla', array( 'ID' => 1 ), array( '%d' ) );

6. Ejecutar otro tipo de sentencias SQL

Para ejecutar cualquier otro tipo de sentencia, se utiliza el método genérico query():
$wpdb->query('sentencia-a-ejecutar');

7. Proteger las consultas contra los ataques de inyección SQL con el método prepare()

El objeto $wpdb ofrece también un método prepare() para preprocesar las sentencias SQL a ejecutar, de tal manera que se añaden caracteres de escape en todos los valores a insertar en donde aparecen caracteres especiales como la comilla simple o el guión bajo.
El valor devuelto por prepare() es un string que contiene una sentencia SQL que puede ser utilizada por cualquiera de los otros métodos.
NOTA: No se debe confundir la funcionalidad que ofrece este método con el concepto de “prepared statements” que existe en muchas de las librerías de acceso a base de datos para distintos lenguajes (incluyendo mysqli para PHP)

Utilizando prepare(), se blinda a la aplicación contra los ataques del tipo “inyección SQL”, en donde los valores que se pasan a la sentencia la modifican, permitiendo accesos no autorizados, etc.
La llamada a prepare() se realiza pasándole una “plantilla” de sentencia, en donde los valores son sustituidos por especificadores de formato al estilo sprintf: “%s”, %d” y “%f”. A continuación, se le pasan las variables cuyos valores se utilizarán al ejecutar la sentencia:
$wpdb->prepare( 'plantilla-de-consulta-sql' , value_parameter[, value_parameter ... ] );
Ejemplo:
$metakey    = "Harriet's Adages";
$metavalue  = "WordPress' database interface is like Sunday Morning: Easy.";
$wpdb->query( $wpdb->prepare(
    "
        INSERT INTO $wpdb->postmeta
        ( post_id, meta_key, meta_value )
        VALUES ( %d, %s, %s )
    ",
        10,
    $metakey,
    $metavalue
) );
fuente: http://blog.openalfa.com/como-acceder-a-la-base-de-datos-de-wordpress



/Creating_Tables_with_Plugins
/Class_Reference/wpdb

.....................

Trucos para controlar WordPress con SQL

WordPress almacena todos los datos en un único sitio, la base de datos de WordPress. Si no sabes lo que es, ya hemos hablado anteriormente sobre su importancia y cómo monitorizarla. Incluso hicimos una petición a los desarrolladores de plugins para que no modifiquen las tablas de la base de datos.
Habitualmente, WordPress usa un sistema gestor de base de datos llamado MySQL(quizás esto te suene), donde define una serie de tablas estándar para guardar los datos de entradas, comentarios, usuarios y demás. Si quieres una descripción detallada de estas tablas, puedes ir al Codex y ahí encontrarás todo lo que necesites.
La mayoría de bases de datos relacionales, como MySQL, soportan un lenguaje específico(también estándar) para realizar consultas a los datos e incluso modificarlos. Este lenguaje se llama SQL y es bastante fácil de entender.
En esta entrada os voy a explicar algunos trucos que he ido recopilando de varios sitios, incluyendo la experiencia propia realizando migraciones de otras plataformas (Drupal, Joomla! y demás) a WordPress.

Cómo acceder a la base de datos

Pero antes de ir a los trucos, veamos cómo podemos acceder a nuestra base de datos y poder aplicar las sentencias SQL que vas a ver a continuación.
La forma más habitual, si utilizas un alojamiento web típico, es que el proveedor te de acceso a un panel de administración. Comúnmente se trata de cPanel, aunque existen otros muchas variantes similares.
Una vez dentro de cPanel, encontrarás un lugar donde aparece el icono de phpMyAdmin, el administrador de bases de datos MySQL que vamos a utilizar. Puedes verlo en la siguiente captura:
cPanel con la sección de bases de datos y el icono de phpMyAdmin
cPanel con la sección de bases de datos y el icono de phpMyAdmin
Tan solo has de hacer clic en phpMyAdmin y se abrirá el administrador. En el panel de la izquierda deberías ver un listado con las bases de datos disponibles (si es que hay más de una) y tendrás que seleccionar aquella que estés usando para WordPress.
Si no sabes cuál es, lo mejor que puedes hacer es consultarlo con tu proveedor de hosting, o bien mirarlo en el archivo wp-config.php del que os hablamos hace unos días.
Captura de phpMyAdmin
Captura de phpMyAdmin donde puedes ver las tablas WordPress y la pestaña SQL.
Una vez seleccionada la base de datos, en el panel de la izquierda vemos las tablas queWordPress crea durante la instalación. Sólo nos queda hacer clic en la pestaña SQL para abrir el editor que nos permitirá escribir las sentencias y ejecutarlas. Puedes ver a lo que me refiero en la siguiente captura:
Editor de sentencias SQL dentro de phpMyAdmin
Editor de sentencias SQL dentro de phpMyAdmin.
Ten en cuenta lo siguiente antes de continuar leyendo:
  • En todas las sentencias SQL que te voy a enseñar usamos el prefijo wp_ para las tablas WordPress (wp_postswp_userswp_comments). Puede ser que en tu caso tu proveedor de alojamiento use un prefijo diferente (otro_pref_postsotro_pref_users,otro_pref_comments). Si esto es así, tan solo sustituye wp_ por el valor que tu tengas en los nombres de tus tablas y listo.
  • Ejecutar sentencias SQL a lo loco puede ser peligroso. Haz una copia de seguridad de tu base de datos antes de hacer nada. Si la lías y corrompes tus datos, agradecerás poder recuperarlos.

Desactivar todos los plugins

Uno de los trucos más útiles es el de poder desactivar todos los plugins de una vez. Sí, ya se que lo puedes hacer desde el panel de Administrador de WordPress, seleccionándolos todos y desactivándolos. No obstante, si por lo que sea no puedes entrar a este panel (has instalado un plugin que lo ha roto todo, por ejemplo), con la siguiente sentencia los podrás desactivar todos usando SQL:
UPDATE wp_options 
SET option_value = '' 
WHERE option_name = 'active_plugins';

Modificar contenidos

Veamos ahora unos trucos sencillos para modificar todos los contenidos de entradas o cualquier tipo personalizado del tirón, sin tener que ir uno a uno.

Cambiar palabras o enlaces

Si quieres cambiar una palabra o una URL de todas tus entradas y páginas, tan sólo has de usar la siguiente sentencia SQL.
UPDATE wp_posts 
SET post_content = replace(post_content, 'güorpré', 'WordPress');
En este caso lo que hacemos es cambiar toda aparición de la palabra «guorpré» por la palabra (ahora sí, bien escrita) «WordPress». Puedes modificar esto para cambiar los contenidos que quieras. Es especialmente útil para URLs si, por ejemplo, cambias de nombre de dominio.
Si el cambio sólo lo quieres hacer en páginas pero no en entradas, es tan fácil como añadir una siguiente condición a tu sentencia SQL. Puedes cambiar 'page' por 'post' o por cualquier otro tipo personalizado que tengas definido en tu WordPress:
UPDATE wp_posts 
SET post_content = replace(post_content, 'güorpré', 'WordPress')
WHERE post_type = 'page';

Eliminar Shortcodes

Si tenías shortcodes básicos en tu contenido que ya no se usan, del mismo modo que cambiábamos palabras, puedes eliminar estos siguiendo la misma idea:
UPDATE wp_posts 
SET post_content = replace(post_content, '[hola]', '');
El problema surge cuando el shortcode no es tan simple como [hola], sino que incluye atributos o texto, como por ejemplo en [hola nombre='Toni']Que tal estás?[/hola]. Para casos más complejos como este tendrás que usar una función cómo REGEXP_REPLACE, la cual puedes instalar en tu servidor (si tienes el control de éste) y que puedes obtener desde este proyecto de GitHub. Aunque tengo que reconocer que hacer esto es algo ya más completo… yo lo recomiendo sólo a WProfesionales con experiencia 😉

Limpiar Spam

Veamos ahora algunos trucos para deshacernos del contenido no deseado.

Borrar comentarios marcados como spam

Si tienes un montón de comentarios que has marcado como spam pero no has ido borrando, no te preocupes. Con la siguiente instrucción los eliminarás completamente de tu base de datos:
DELETE FROM wp_comments 
WHERE comment_approved = 'spam';

Borrar comentarios no aprobados

Del mismo modo, podemos eliminar todos aquellos comentarios que no estén aprobados:
DELETE FROM wp_comments 
WHERE comment_approved = '0';

Borrar comentarios que contengan una URL específica

Seguro que a veces te han llegado comentarios que son spam porque contienen cierta dirección URL, o porque el autor indica que la URL de su web es la URL de una página de spam. Para el primer caso, podemos usar una sentencia que busque todos los comentarios que incluyan la URL spam.com (cámbialo por lo que quieras) y los borre:
DELETE FROM wp_comments 
WHERE comment_content LIKE "%spam.com%";
Para el segundo caso, tenemos esta otra instrucción que funciona de forma muy parecida:
DELETE FROM wp_comments 
WHERE comment_author_url LIKE "%spam.com%";

Eliminar los pingbacks y trackbacks

Cuando alguien enlaza desde WordPress tus contenidos, aparecerá un pingback o trackbackcomo si de un comentario adicional se tratase. Esto es algo que tampoco tiene demasiado interés y, de hecho, yo prefiero no mostrarlos.
DELETE FROM wp_comments 
WHERE comment_type='trackback' OR comment_type='pingback';
Para ello, con la anterior sentencia nos cargamos todos los pingbacks y trackbacks de WordPress.

Cerrar los comentarios y pingbacks

Otra opción más radical aún es la de hacer que todas las entradas no permitan incluir comentarios. Para no tener que ir una a una, con la siguiente instrucción puedes cerrar los comentarios de todo de una vez:
UPDATE wp_posts 
SET ping_status = 'closed', comment_status = 'closed';
Y si sólo quieres cerrar los comentarios para un tipo específico, has de añadir la condición (WHERE) que ya habíamos visto anteriormente con el tipo concreto que te interese (en este caso, por ejemplo, 'post'):
UPDATE wp_posts 
SET ping_status = 'closed', comment_status = 'closed'
WHERE post_type = 'post';

Añadir un campo personalizado a tus entradas

Esto es un poquito más complejo, pero de gran utilidad. Imagina que a partir de ahora quieres guardar en un campo personalizado el número de visitas de las entradas. Para ello necesitas crear el campo visitas con un valor inicial de cero. La siguiente instrucción te indica cómo hacerlo:
INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT p.ID AS post_id, 
       'visitas' AS meta_key,
       '0' AS meta_value
FROM wp_posts p
WHERE ID NOT IN
  (SELECT pm.post_id 
   FROM wp_postmeta pm
   WHERE pm.meta_key = 'visitas' AND p.post_type = 'post');
Hay que hacer una inserción en la tabla wp_postmeta con los valores extraídos de la tablawp_posts donde se guardan las entradas (post_type = 'post').

Actualizar la contraseña de un usuario

Esto es muy sencillo y, de hecho, ya lo discutimos en una entrada anterior. Sólo has de usar la siguiente instrucción indicando cuál es la nueva contraseña y cuál es el nombre de usuario del usuario que quieras modificar:
UPDATE wp_users 
SET user_pass = MD5( 'nueva-contraseña' ) 
WHERE user_login = 'mi-usuario';

Cambiar el autor de tus entradas

Si has creado un nuevo usuario y quieres asignarle las entradas de otro usuario que ya no vas a utilizar, sólo necesitas saber cuales son los identificadores de estos usuarios (cada usuario se identifica con un número único, que encontrarás en la tabla wp_users).
Con esta información puedes rellenar la siguiente instrucción SQL y traspasar las entradas del usuario viejo al usuario nuevo.
UPDATE wp_posts 
SET post_author = 'id-autor-nuevo' 
WHERE post_author = 'id-autor-viejo';

Cambiar el nombre de usuario

Esto es algo que ya os explicamos recientemente en este artículo. Una de las formas que vimos para hacerlo era, evidentemente, usando SQL:
UPDATE wp_users
SET user_login = 'nuevo-nombre',
    user_nicename = 'nuevo-nombre' 
WHERE user_login = 'viejo-nombre';
Sólo hemos de cambiar viejo-nombre por el nombre del usuario al que queremos cambiarle el nombre, y en nuevo-nombre poner el nuevo nombre de usuario que hayamos elegido.

Obtener un listado con toda la gente que puso un comentario

Esto es muy útil si quieres hacer una campaña a través de email para promocionarte. Seguramente todo aquel que puso un comentario en tu web y dejó su correo puede estar interesado. Esta consulta te devolverá una lista con todos los correos de estos usuarios comentadores, que podrás copiar y pegar en tu sistema de gestión de campañas de correo:
SELECT DISTINCT comment_author_email 
FROM wp_comments;

Reducir el tamaño de la base de datos

Os hemos hablado ya anteriormente de lo importante que es el mantenimiento de tu web WordPress. Y la base de datos es uno de los puntos centrales. Veamos una serie de trucos para limpiarla de basura inútil.

Eliminar Transients

Los transients son información temporal que se guarda en la tabla wp_options y se va borrando sola. No obstante, si algo falla es posible que tengamos esta tabla llena detransients que no sirven para nada. Si los queremos borrar tan solo hemos de ejecutar la siguiente instrucción SQL:
DELETE FROM wp_options
WHERE option_name LIKE "%\_transient\_%";

Eliminar etiquetas que no usemos

Muchas veces nos volvemos locos creando etiquetas, pero resulta que no las añadimos en ninguna entrada, por lo que no nos sirven para nada. Para evitarlo, podemos ejecutar esta instrucción, que las elimina si no se usan:
DELETE FROM wp_terms t
INNER JOIN wp_term_taxonomy tt
ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'post_tag'
AND tt.count = 0;

Eliminar revisiones y datos asociados

Vimos en el artículo donde os hablé del archivo wp-config.php que las revisiones son versiones anteriores de nuestras entradas que se guardan en la base de datos a medida que vamos escribiendo esas entradas. También vimos la manera de desactivarlas. Pues ahora vamos a ver la instrucción SQL que nos permite borrar las revisiones de la base de datos y todo aquello asociado a estas (básicamente enlaces con etiquetas o categorías).
DELETE a,b,c 
FROM wp_posts a 
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) 
WHERE a.post_type = 'revision';
Tan solo cópiala y ejecútala en tu editor SQL de phpMyAdmin para borrar todas las revisiones de tu base de datos.

Borrar entradas antiguas

Y, por último, algo también bastante radical, pero que puede ser útil si nos quedamos sin espacio y no hay otra alternativa posible (lo sé, es un caso extremo…):
DELETE FROM wp_posts 
WHERE post_date < '1990-01-01 00:00:00' 
AND post_status = 'publish'
Con la instrucción anterior podemos borrar todas las entradas más viejas que una cierta fecha (en el ejemplo, el 1 de enero de 1990).

Resumen Final

En este artículo, hemos visto diferentes trucos SQL para poder ser más productivos y realizar tareas pesadas de forma casi instantánea. Puedes probarlas y ver si así consiguesadelgazar tu base de datos o realizar cambios rápidamente.
Si tienes problemas, no dudes en contactarnos mediante la sección de comentarios, y si tienes más trucos guardados, compártelos con nosotros. Estaremos encantados de recibir tus sugerencias.

fuente: http://wprincipiante.es/trucos-controlar-wordpress-sql/

No hay comentarios.:

Publicar un comentario