wp media regenerate thumbnails για μεγάλο όγκο δεδομένων
Δημοσιεύθηκε 20/12/2022
Το πρόβλημα
Σε ιστοσελίδα με έτοιμο theme, που περιείχε πάνω από 12.000 εικόνες, και 20 thumbnails για την κάθε μία! ο όγκος του φακέλου των uploads ήταν πάνω από 15GB. Ανέλαβα να υλοποιήσω custom theme, όπου για τις ανάγκες του desgin χρειαζόντουσαν πλέον μόνο 2 thumbnails για την κάθε εικόνα. Επομένως ήταν αναγκαίο να προβώ σε regenaration των εικόνων ώστε να μειωθεί δραστικά ο όγκος και το πλήθως τον αχρησιμοποίητων thumbnails.
Η “λύση” των plugins
Υπάρχουν πολλά plugins με την βοήθεια των οποίων μπορείς να κάνεις regenarate thumbnails, όπως το reGenerate Thumbnails Advanced. Λόγω των πολλών εικόνων όμως ο server δεν θα μπορούσε να σηκώσει όλη αυτή την διαδιακασία. Χρειαζόταν να γίνει το regenarate τμηματικά.
Το Force Regenerate Thumbnails, δίνει την δυνατότητα για batches αλλά δεν είναι τόσο χρηστικός καθώς πρέπει να επιλέγονται οι εικόνες από το media σε list view, και η διαδικασία είναι επίσης χρονοβόρα
Η λύση του wp cli – wp media regenerate
Μέσω της εντολής του wp cli, wp media regenerate μπορείς να κάνεις regenerate thumbnails μέσω εντολών, όπου η διαδικασία είναι πολύ γρηγορότερη από οποιοδήποτε plugin.
Δυστυχώς το wp media regenerate, δεν μας δίνει την δυνατότητα να το σπάσουμε στους διάφορους φακέλους που έχει το /uploads, ώστε να κάνουμε τμηματικά το regenerate. Αυτό όμως που μας δίνει είναι να κάνουμε regenerate για συγκεκριμένες εικόνες μέσω του id, ώστε να λύσουμε το θέμα της τμηματοποίησης.
Επεξήγηση κώδικα
Με τον παρακάτω κώδικα, με την βοήθεια του get_posts, αποθηκεύω στο array $images_ids όλα τα id όλων των εικόνων της ιστοσελίδας.
Στη συνέχεια ορίζω το $chunkSize πχ στις 10 εικόνες, ώστε να σπάσουμε την εντολή σε ορισμένο πλήθος εικόνων κάθε φορά, για να μην την τρέξουμε μία φορά για όλες τις εικόνες ταυτόχρονα και υπερφορτώσουμε τον σέρβερ.
Στο τέλος δημιουργώ και εμφανίζω μέσω του $text, σε μορφή κειμένου την εντολή wp media regenerate συνοδευόμενο από τα αντίστοιχα ids τόσα σε πλήθος όσα το chunkSize.
Αυτόν τον κώδικα τον τρέχουμε μία φορά μέσα στο theme μας για να πάρουμε ως εμφάνιση όλες τις εντολές wp media regenerate, να τις αποθηκεύσουμε ξεχωριστά και να τις τρέχουμε μία μία μέσω του wp cli.
$images_ids = get_posts(
array(
'post_type' => 'attachment',
'post_mime_type' => 'image',
'post_status' => 'inherit',
'posts_per_page' => -1,
'fields' => 'ids',
)
);
$chunkSize = 10;
for ($i = 0; $i < count($images_ids); $i += $chunkSize) {
$chunk = array_slice($images_ids, $i, $chunkSize);
$text = 'wp media regenerate ';
foreach ($chunk as $img_id) {
$text .= $img_id . ' ';
}
echo $text . '<br>';
}
Παράδειγμα αποτελέσματος
wp media regenerate 265 264 115 114 113 101 100 99 98 94
wp media regenerate 91 90 89 88 87 86 83 80 79 76
........
Πλέον έχουμε έτοιμες τις εντολές, με όλες τις εικόνες της ιστοσελίδας, προκειμένου να τις τρέχουμε μία μία και να μη προκαλέσουμε πρόβλημα να κρασάρει ο σέρβερ.