Este post es continuación de Limpieza de links erróneos: codificando un PHP, Ejecutando consultas de MySQL desde PHP, Leyendo un archivo desde PHP y Escribiendo en archivos desde PHP
Ahora que ya sabemos con PHP leer y escribir en archivos, así como el método para ejecutar consultas de MySQL, tenemos todos los ingredientes para completar el programa que nos limpie la base de datos de links erróneos.
Volvamos al capítulo 1 de esta serie para recordar que lo que queremos es sustituir ciertas URLs (por ejemplo, del estilo «https://www.lanzatu.blog/archivo-extendido/?arch=posts0409&articulo=verpermalink&id=200405301») por el enlace a una página de error (por ejemplo «https://www.lanzatu.blog/pagina-error»).
[php]
<?php
$file = fopen(«entrada.txt», «r») or exit(«Es imposible abrir el archivo»);
$contador_registros=0;
$contador_actualizados=0;
$contador_noactualizados=0;
$contador_noencontrados=0;
$fp = fopen(«salida.txt»,»a»);
$con = mysql_connect(«localhost»,»XXX»,»YYY»);
if (!$con)
{
die(‘Error al conectarse a la base de datos’ . mysql_error());
}
else
{
echo «conexion ok<br />»;
mysql_select_db(«AAA», $con);
while(!feof($file))
{
$linea = fgets($file);
$linea = eregi_replace(«[\n|\r|\n\r]», «», $linea);
$contador_registros++;
$consulta=»SELECT * FROM wp_posts WHERE post_content LIKE ‘%».$linea.»%’»;
$result = mysql_query($consulta);
$encontrado= = 0;
while($row = mysql_fetch_array($result))
{
$encontrado = 1;
$la_id=$row[‘ID’];
$contenido=$row[‘post_content’];
$titulo=$row[‘post_title’];
$nuevo_contenido=str_replace($linea,»https://www.lanzatu.blog/pagnina-error»,$contenido);
$actualizacion = «UPDATE wp_posts SET post_content = ‘».$nuevo_contenido.»’ WHERE id = $la_id»;
mysql_query($actualizacion);
if (mysql_error())
{
$contador_noactualizados++;
}
else
{
$contador_actualizados++;
}
}
if ($encontrado==0)
{
fwrite($fp, $linea . PHP_EOL);
$contador_noencontrados++;
}
}
fclose($fp);
fclose($file);
echo «<br />Total registros tratados = «.$contador_registros;
echo «<br />Total registros actualizados correctamente = «.$contador_actualizados;
echo «<br />Registros no actualizados».$contador_noactualizados;
echo «<br />Registros no encontrados».$contador_noencontrados;
}
?>
[/php]
Lo nuevo de este programal respecto a los que hemos visto anteriormente, es la utilización de dos llamadas a la función mysql_query (que, como ya vimos, envía una consulta MySQL a la base de datos): una (línea 23), para buscar todos los posts en dónde se encuentra un determinado literal (en este caso, la URL que deseamos modificar); y otra (línea 33), para actualizar éste con la nueva URL.
Para sustituir una URL por otra se utiliza la función str_replace (línea 31) que reemplaza en la variable $contenido todas las apariciones del string buscado (alojado en la variable $linea) con el string de reemplazo.
La función mysql_error nos permite controlar el resultado de la consulta MySQL, ya que devuelve el texto del error de la llamada. En nuestro caso, simplemente aumentamos una unidad a las variables $contador_noactualizados o $contador_actualizados dependiendo de si ha habido error o no.
Y, finalmente, la variable $encontrado se emplea para saber si existen posts con la URL que buscamos. Si se sale del bucle while sin conseguir poner la variable $encontrado a 1 es que no hay posts con esa URL. Entonces, se graba el registro en el archivo de salida.
El archivo de entrada, claro está, contiene una línea por cada URL a buscar.
Te ruego encarecidamente que no ejecutes ningún programa de este estilo si no estás seguro de lo que haces y no tienes un backup de la base de datos de tu blog.
Con esta entrada finalizamos esta serie de cinco dedicados a codificar un programa básico para modificar la base de datos de WordPress. Hemos empleado las instrucciones y estructuras de programación más elementales con objeto de facilitar la comprensión del código. También se ha escrito el programa de la forma más visual y legible posible y se ha huido de instrucciones más complejas con ese mismo fín.
Deja una respuesta