Hace unas semanas uno de nuestros seguidores planteaba un problema con una base de datos en un grupo de Google+.

En su publicación José Costa Ros nos planteaba un serio problema que le había surgido a un cliente suyo, concretamente a la tienda online TuBabyShop, con el campo ID de la tabla wp_posts, que había adquirido un total de 13 dígitos de longitud, lo que le provocaba la imposibilidad de cobrar pedidos a través de Redsýs.

El problema viene provocado por las estrictas normas de Redsýs a la hora de tramitar los pedidos, ya que hace imprescindible el uso de 4 dígitos y 8 caracteres, y al tener el campo ID un código de 13 dígitos de longitud se hacía materialmente imposible poder finalizar los pedidos en WooCommerce ya que el código recibido, los 4 primeros dígitos de los 13 del número de pedido, hacía imposible saber a qué pedido hacía referencia el pago y, por lo tanto, siempre se quedaban esperando el cobro.

La mejor solución que se puede dar a un problema como el que nos planteaba nuestro amigo José, es renumerar el campo ID de la tabla wp_posts de la base de datos, pero ¿cómo?

Solución

Para ello lo primero que hicimos fue ver qué había pasado en la tabla wp_posts y descubrimos que el problema había surgido casi un año antes en el que, de repente, se saltó del código 1302 a un número totalmente disparatado de 13 dígitos de longitud. Lo más probable es que el problema surgiera a raíz de alguna consulta SQL mal ejecutada o de algún tipo de fallo puntual en el servidor MySQL, aunque tampoco profundizamos mucho más allá ya que no encontramos más problemas relacionados.

Una vez localizado el problema procedimos a crear un pequeño script PHP con algunas consultas SQL que alojamos en el directorio raíz de WordPress y que automatizaría la tarea de renumerar el campo ID a partir del número 1303, pero no sólo de la tabla wp_posts, si no de todas las demás tablas de la base de datos que están relacionadas con ella. Concretamente el código PHP que utilizamos fue este:

if ( file_exists( "./wp-load.php" ) ) {
	require_once( "./wp-load.php" );
} else {
	exit( '<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD><BODY>


<H1>Not Found</H1>


Please ensure that basededatos.php is in the root directory</BODY></HTML>' );
}

$contador = 1303;
$consulta = $wpdb->get_results( "SELECT * FROM `{$wpdb->prefix}posts` where ID > 1302" );

foreach ( $consulta as $fila ) {
	$ID = $fila->ID;
	//wp_posts
	$nueva_consulta = $wpdb->query( "UPDATE `{$wpdb->prefix}posts` SET ID = $contador WHERE ID = $ID" );
	$nueva_consulta = $wpdb->query( "UPDATE `{$wpdb->prefix}posts` SET post_parent = $contador WHERE post_parent = $ID" );
	//wp_postmeta
	$nueva_consulta = $wpdb->query( "UPDATE `{$wpdb->prefix}postmeta` SET post_id = $contador WHERE post_id = $ID" );
	//wp_comments
	$nueva_consulta = $wpdb->query( "UPDATE `{$wpdb->prefix}comments` SET comment_post_ID = $contador WHERE comment_post_ID = $ID" );
	//wp_term_relationships
	$nueva_consulta = $wpdb->query( "UPDATE `{$wpdb->prefix}term_relationships` SET object_id = $contador WHERE object_id = $ID" );
	//wp_options
	$nueva_consulta = $wpdb->query( "UPDATE `{$wpdb->prefix}options` SET `option_value` = replace(option_value, '$ID', '$contador' WHERE option_value LIKE '%$ID%'");
	//wp_woocommerce_order_items
	$nueva_consulta = $wpdb->query( "UPDATE `{$wpdb->prefix}woocommerce_order_items` SET `order_id` = $contador WHERE order_id = $ID" );
	$contador++;
}
$contador--;
$nueva_consulta = $wpdb->query( "ALTER TABLE `{$wpdb->prefix}posts` AUTO_INCREMENT = $contador;" );

echo "Proceso terminado en " . DB_NAME;

Gracias a él pudimos reordenar el campo ID de la tabla wp_posts y de todas las demás tablas relacionadas con este mismo campo. Además modificamos el valor de autoincremento de la tabla para evitar que siguieran apareciendo esos códigos de 13 dígitos de longitud.

La verdad es que ahora mismo esta situación ya no supone ningún problema si usas el plugin WooCommerce Sermepa payment gateway y su nueva funcionalidad, solicitada por nosotros mismos. Otro día os publicaremos un par de funciones para saltarnos este mismo problema utilizando los nuevos filtros wc_myredsys_merchant_order_encode y wc_myredsys_merchant_order_decode.

Esperamos que os resulte útil este pequeño script PHP y que os saque de más de un apuro.