TechBlogSD - Все для WordPress и WEB разработки
WEB и WordPress инструкции, новости, обзоры тем и плагинов

Программное удаление (на PHP) мультимедиа в WordPress: вложения, неприкрепленные изображения, 404, потерянные

14

Кстати: я использую 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 чистой и хорошо организованной, уменьшить объем данных и нагрузку на процессор и даже перейти на более дешевый план хостинга, поскольку мы больше не будем хранить гигабайты мусора.

И на всякий случай вы сделали резервную копию, верно? 🙂

Программное удаление (на PHP) мультимедиа в WordPress: вложения, неприкрепленные изображения, 404, потерянные

Источник записи: sabrinazeidan.com
Leave A Reply

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее