Cómo eliminar artículos a través de listado de URLs

En este artículo te mostramos un Script en PHP para eliminar fácilmente multitud de entradas en WordPress. ¡Aquí encontrarás la solución!

desarrollo, WordPress

A raíz de ver el artículo «Eliminar todas las entradas del Blog por código» de Carlos y charlar con él en la plaza de el_arroyo, me he animado a publicar un script que hice hace un par de semanas y añade un caso de uso al artículo.

Hace un par de semanas tuve que hacer bastantes tareas para mejorar el posicionamiento de una web. Una de esas tareas era eliminar aproximadamente 4.000 artículos para que el equipo de contenidos no tuviera que hacerlo manualmente y, pensando que posiblemente tuviéramos que eliminar más en un futuro, decidí hacer un script de «andar por casa» para solucionar el problema.

Lo único de lo que disponía era de un excel que convertí en CSV con las url de todas las entradas. Me fui a la documentación de WordPress y encontré una función que me venía como anillo al dedo. La función es url_to_postid, a la que le pasas una url y te devuelve el ID del artículo. Luego utilizas la función wp_delete_post() la cual explica muy bien Carlos en su artículo, y ya lo tienes!!!

El script es el siguiente.

$pathBase='../';
require_once($pathBase.'/wp-config.php');
require_once($pathBase.'/wp-includes/wp-db.php');


$file = '20210817-eliminar-410.csv';
    
$index_ok = 0;        
$index_ko = 0;
$ok = '';
$ko = '';
$row = 1;

if (($handle = fopen($file, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
	    $row++;
		$url_page = $data[0];
        $post_id = url_to_postid( $url_page );

        if ($post_id) {
	       // true para que no lo deje en la papelera.
		   wp_delete_post( $post_id, false );
		   $ok .= '<p>'. $post_id .','. $url_page .'</p>';
		   ++$index_ok;
	    } else {
           $ko .= '<p>'. $url_page .'</p>';
           ++$index_ko;
        }
    }
}

fclose($handle);

echo '<p>Total Ok: '. $index_ok .'</p>';
echo $ok;

echo '<p>Total Ko: '. $index_ko .'</p>';
echo $ko;

Con fgetcsv leo el CSV, le puse un límite de 5.000 líneas para que no afectar al rendimiento del servidor si el CSV era extenso, ya que tiene que buscar el ID, eliminar la entrada, etc.

Utilicé los index, ok y ko para luego ver el resultado de lo que había realizado. Otra opción es guardarlo en un CSV para dárselo a las personas que llevan la parte de SEO por si necesitaran estar al tanto.

Conclusión

El código puede ser mejorable, pero es algo que se ha hecho para «andar por casa» y solucionar un problema puntual. Con esas líneas se dejó de invertir mucho tiempo del equipo de contenido que lo dedicó a otros asuntos de mayor importancia.