Je supprime en bloc les publications de mon site WordPress à l'aide de la fonction wp_delete_post
et les catégories à l'aide de wp_delete_category
. Cela fait environ 100.000 articles et 4.000 catégories, et après un moment, je reçois un PHP Error
PHP Fatal error: Allowed memory size of ... bytes exhausted
C'est ce que je fais dans mon code:
// get all IDs from the posts and categories
$delete_categories = $wpdb->get_col("SELECT DISTINCT(j.term_id)...");
$delete_posts = $wpdb->get_col("SELECT DISTINCT(j.post_id)...");
$delete_parent_categories = $wpdb->get_col("SELECT tt.parent FROM $tbl_term_taxonomy tt ...");
// I removed the SQL statements for a better reading
foreach ($delete_posts as $dp) {
echo "deleting post ".$dp."\n";
wp_delete_post($dp, true);
unset($dp);
}
unset($delete_posts);
foreach ($delete_categories as $dc) {
echo "deleting category ".$dc."\n";
wp_delete_category($dc);
unset($dc);
}
unset($delete_categories);
foreach ($delete_parent_categories as $dc) {
echo "deleting category ".$dc."\n";
wp_delete_category($dc);
unset($dc);
}
unset($delete_parent_categories);
Supprimer les publications fonctionne, supprimer certaines catégories fonctionne également - mais à un moment donné, la limite de mémoire est dépassée et le script est terminé. Définir la limite de mémoire à 1024 Mo ne me semble pas être la solution idéale.
Existe-t-il un moyen de libérer de la mémoire allouée par les fonctions WordPress?
Le code que vous utilisez utilise également des fonctions WordPress qui chargeront d’abord les publications (et autres données pertinentes) en mémoire et les mettront en cache à l’aide du cache d’objets. Donc, pour supprimer 100 000 articles, votre code essaiera de charger chaque article en mémoire, ce qui peut prendre beaucoup de mémoire. Je ne sais pas à quel niveau de mémoire PHP est défini dans votre cas, mais vous pouvez limiter la suppression à 1 000 ou 5 000 messages à la fois ou augmenter la mémoire PHP.
Avec autant de messages à supprimer, il est préférable d'échapper aux limitations du serveur Web et d'utiliser l'exemple pertinent wp-cli . L’autre alternative est de ne pas utiliser de serveur actif, mais de tout décharger sur votre serveur de développement local, d’exécuter votre code et de télécharger à nouveau des éléments.
Je recommande que votre première ligne de code soit
wp_suspend_cache_addition( true );
Cela empêchera les données d'être ajoutées à la mémoire cache et gonflera la mémoire de remplissage.