Программное удаление (на PHP) мультимедиа в WordPress: вложения, неприкрепленные изображения, 404, потерянные
Кстати: я использую SpeedGuard для автоматического запуска тестов Google PageSpeed Insights.
!! Прежде всего: убедитесь, что вы сделали резервную копию!
Удалить неприкрепленные медиа (осиротевшие изображения, которые не прикреплены ни к какому сообщению WordPress, странице или пользовательскому сообщению)
Когда вы удаляете свои сообщения, вложения из них не удаляются автоматически. Они продолжают оставаться в Медиатеке WordPress и на вашем веб-сервере, занимая место на диске и все портя.
Следующая функция удалит их безвозвратно как из медиатеки, так и из wp-content/uploadsпапки.
Будьте осторожны, что вы делаете. Например, в одном из проектов мы добавили изображения и описания на страницы архива тегов в целях SEO, и эти изображения, как вы понимаете, не привязаны ни к какому посту, однако это не значит, что мы хотим от них избавиться.
Если вы все тщательно обдумали и уверены, что хотите избавиться от этого бесхозного носителя, то вот:
function delete_unattached_attachments(){
$attachments = get_posts( array(
'post_type' => 'attachment',
'numberposts' => -1,
'fields' => 'ids',
'post_parent' => 0,
));
if ($attachments) {
foreach ($attachments as $attachmentID){
$attachment_path = get_attached_file( $attachmentID);
//Delete attachment from database only, not file
$delete_attachment = wp_delete_attachment($attachmentID, true);
//Delete attachment file from disk
$delete_file = unlink($attachment_path);
}
}
}Удалить все вложения, относящиеся к определенному пользовательскому типу сообщений.
Эта функция полезна, когда вам нужно удалить все изображения, прикрепленные к указанному CPT. Не забудьте изменить «карту» на имя вашего пользовательского типа сообщения.
Это удалит как вложение из WordPress, так и фактический файл с вашего веб-сервера.
function delete_cpt_attachments(){
$attachments = get_posts( array(
'post_type' => 'attachment',
'numberposts' =>-1,
));
if ($attachments) {
foreach ($attachments as $attachment){
$parent_id = $attachment->post_parent;
if ('card' == get_post_type($parent_id)) {
$attachmentID = $attachment->ID;
$attachment_path = get_attached_file( $attachmentID);
//Delete attachment from database only, not file
$delete_attachment = wp_delete_attachment($attachmentID, true);
//Delete attachment file from disk
$delete_file = unlink($attachment_path);
}
}
}
}Очистите медиатеку WordPress: удалите все вложения, файлы которых больше не присутствуют на веб-сервере, и выдайте ошибку 404.
Ваша медиатека заполнена изображениями, которые не отображаются? Когда вы нажимаете на них, он говорит, что изображение больше не существует, и дает вам страницу 404?
Это проблема битой ссылки. На веб-сервере больше нет файла для этого вложения, поэтому вы видите эти пустые квадраты в библиотеке мультимедиа как призраки ранее существовавших изображений.
Эта функция очистит вашу медиатеку WordPress от несуществующих изображений. Он удалит все вложения, файлы которых больше не присутствуют на веб-сервере.
Осторожно: ресурсоемкий.
function delete_404_attachments(){
$attachments = get_posts( array(
'post_type' => 'attachment',
'numberposts' => -1,
'fields' => 'ids'
));
if ($attachments) {
foreach ($attachments as $attachmentID){
$file_url = wp_get_attachment_url( $attachmentID);
$file_headers = @get_headers($file_url);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
$deleted = wp_delete_attachment($attachmentID, true);
}
}
}
}* Имейте в виду, что если у вас есть ссылка на такой файл где-то в сообщениях, она останется там и по-прежнему будет выдавать пользователям ошибку 404. Чтобы изучить эту проблему и найти такие битые ссылки в постах, я использую Screaming Frog.
Вы всегда делаете резервную копию перед чем-то подобным. Верно?
Как удалить неиспользуемые изображения в WordPress:
Если вашему веб-сайту больше нескольких месяцев, вы знаете, насколько удивительно большим wp-content/uploadsон может стать в один прекрасный день. Вы не знаете, откуда все это берется и куда уходит, но оно просто занимает все свободное место на вашем веб-сервере.
Этот пост поможет вам правильно определить бесполезные носители и избавиться от них. Просто следите за тем, что вы делаете, поскольку удаление означает удаление.
Случай 1: все изображения на вашем сайте хранятся в виде вложений WP
Хорошие медиа: все вложения WordPress
Плохой носитель: все, что хранится в uploadsкаталоге, кроме вложения WP .
Эта функция освободит место на диске вашего хостинг-аккаунта. Он будет сканировать ваш wp-content/uploadsкаталог (рекурсивно) и проверять каждый найденный файл, является ли он вложением WP или нет.
Все файлы, не являющиеся вложениями WP, будут удалены. Если у вас есть довольно большая папка для загрузки (скажем, 5 ГБ), вы можете разделить процесс на части по папкам. У меня 1Gb проверил и почистил за 15 секунд (осталось всего 300 MB!).
//Delete orphaned files in wp-content/uploads that are not wordpress attachments
function clean_uploads_from_nonattachments(){
$uploads_dir = wp_upload_dir();
$search = $uploads_dir['basedir'];
$replace = $uploads_dir['baseurl'];
//You may want to take it by bites if your uploads is rather large (over 5 gb for example)
//$uploads_dir = ($uploads_dir['basedir']. '/2015/' );
$uploads_dir = ($uploads_dir['basedir']);
$root = $uploads_dir;
//Going through directiry recursevely
$iter = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
);
foreach ($iter as $fileinfo) {
//get files only
if ($fileinfo->isFile()) {
$image = $fileinfo->getPathname();
$image_url = str_replace($search, $replace, $image);
//Core WP function to retrieve attachment ID by URL
$attachment_id = attachment_url_to_postid($image_url);
//Not found - then delete file
if (!$attachment_id){
unlink($image);
}
else {
//List of found attachments
echo $attachment_id.': '.$image;
}
}
}
}Вот как мы находим и удаляем изображения, которые не являются вложениями.
Но что, если ваши изображения вообще не хранятся как вложения WP, но все еще используются на вашем веб-сайте?
Случай 2: изображения на вашем сайте загружаются через настраиваемые поля и не сохраняются в виде вложений WP
Хорошие медиа: все изображения сохранены в указанных настраиваемых полях .
Плохой носитель: все остальное в uploadsкаталоге
Шаг 1. Определите все хорошие изображения
Во-первых, нам нужно получить объединенный список всех «хороших» изображений, которые используются на сайте, чтобы позже мы могли удалить все файлы, которые не используются.
Я покажу один из случаев в качестве примера. Это книжный интернет-магазин. Нам удалось избавиться от 32 тысяч ненужных файлов и освободить до 75% дискового пространства на веб-сервере.
До: 42096 изображений 4767 МБ
После: 9202 изображения 1251 МБ
Очищено 32894 изображения и сохранено 3516 МБ места на диске.
Здесь у нас есть 3 типа постов: посты (используются для книг), автор книги и список книг. Изображение для каждого типа записи хранится в отдельном пользовательском поле (обложка книги, изображение автора и изображение списка книг). Мы получим список изображений, используемых для каждого CPT, и объединим их вместе, чтобы получить полный список хороших изображений. Это образы, которые мы сохраним.
$args = array( 'post_type' =>'post', 'posts_per_page' => -1, 'post_status' => 'any', 'fields' =>'ids');
$myposts = get_posts( $args );
$all_bookcovers_posts = array();
foreach ($myposts as $mypostid) {
$bookcover = get_field('bookcover', $mypostid);
$all_bookcovers_posts[] = $bookcover;
}
$args = array( 'post_type' =>'book_list', 'posts_per_page' => -1, 'post_status' => 'any', 'fields' =>'ids');
$myposts = get_posts( $args );
$all_bookcovers_book_lists = array();
foreach ($myposts as $mypostid) {
$book_list_pictrue = get_field('book_list_pictrue', $mypostid);
$all_bookcovers_book_lists[] = $book_list_pictrue;
}
$args = array( 'post_type' =>'bookauthor', 'posts_per_page' => -1, 'post_status' => 'any', 'fields' =>'ids');
$myposts = get_posts( $args );
$all_bookcovers_bookauthors = array();
foreach ($myposts as $mypostid) {
$bookauthor_picture = get_field('bookauthor_picture', $mypostid);
$all_bookcovers_bookauthors[] = $bookauthor_picture;
}
$all_good_pictures = array_merge($all_bookcovers_book_lists, $all_bookcovers_bookauthors, $all_bookcovers_posts);
$all_good_pictures = array_filter($all_good_pictures);Шаг 2: Удалите изображения, которые не используются в WordPress.
Итак, у нас есть полный список хороших изображений, которые используются на сайте в переменной $all_good_pictures. Теперь пройдемся по wp-content/uploadsкаталогу и проверим каждый файл, есть он в списке или нет. Если его нет в списке, мы просто удалим его.
//Look through wp-content/uploads directory
$uploads_dir = wp_upload_dir();
$search = $uploads_dir['basedir'];
$replace = $uploads_dir['baseurl'];
$uploads_dir = ($uploads_dir['basedir']);
$root = $uploads_dir;
//Going through directiry recursevely
$iter = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
);
foreach ($iter as $fileinfo) {
if ($fileinfo->isFile()) {
$image = $fileinfo->getPathname();
$image_url = str_replace($search, $replace, $image);
//Delete if file is not found in list of good images
if (!in_array($image_url, $all_good_pictures)) {
unlink($image);
}
}
} Заворачивать
Вот как мы можем сделать нашу установку WordPress чистой и хорошо организованной, уменьшить объем данных и нагрузку на процессор и даже перейти на более дешевый план хостинга, поскольку мы больше не будем хранить гигабайты мусора.
И на всякий случай вы сделали резервную копию, верно? 🙂
