Trong quá trình tối ưu hóa website thì việc làm sạch các postmeta, các thẻ metadata là điều mà bắt buộc ai cũng phải làm. Tuy nhiên việc này đòi hỏi bạn phải biết về kĩ thuật cũng như phải thực hiện backup trước khi làm các công việc này.
-
Cách làm
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
function isa_cleanup_attachment_metadata(){ if ( get_option( 'my_run_only_once_1' ) != 'completed' ) { $upload_dir = wp_upload_dir(); $upload_basedir = $upload_dir['basedir']; $attachment_post_ids = array(); // get all attachment ids for any _wp_attachment_metadata that exists in the wp_postmeta table // @todo edit database details: $mysqli = new mysqli('DB_HOST', 'DB_USER', 'DB_USER_PASSWORD', 'DATABASE_NAME'); if( ! $res = $mysqli->query( "SELECT * FROM wp_postmeta WHERE meta_key = '_wp_attachment_metadata'" ) ) { error_log($mysqli->error); } else { while ($row = $res->fetch_assoc()) { $attachment_post_ids[] = $row['post_id']; } $res->close(); } $mysqli->close(); foreach( $attachment_post_ids as $attachment_id ) { $data = wp_get_attachment_metadata( $attachment_id ); $original_file_name = $data['file'] ?? ''; $new_data = $data; // get all filenames from the data $all_sizes_filenames = wp_list_pluck( $data['sizes'], 'file' ); foreach( $all_sizes_filenames as $size => $filename ) { $delete_flag = true; $update_flag = false; // check that each one doesn't exist, if it does, then don't delete the whole attachment, just update it // get month/year for filename $p = strrpos($original_file_name, '/'); $path = ($p !== false) ? substr($original_file_name, 0, $p+1) : ''; if ( file_exists( $upload_basedir . '/' . $path . $filename ) ){ $delete_flag = false; } else { error_log($path . $filename .' DOES NOT EXIST'); unset( $new_data['sizes'][ $size ] );// remove that size from the array $update_flag = true; } } // if there's no original file, it is not an image, so don't delete the attachment, just update it to remove the sizes if ( $original_file_name && $delete_flag ) { // none of the sized images exist, now check if original file exists if ( ! file_exists( $upload_basedir . '/' . $original_file_name ) ) { error_log('DELETING attachment meta id ' . $attachment_id . ' :'); error_log(print_r($data, true)); wp_delete_attachment( $attachment_id ); } } if ($update_flag) { if ( count( $new_data ) === 1 && empty( $new_data['sizes'] ) ) { $new_data = array();// to make sure empty _wp_attachment_metadata is deleted } error_log('UPDATING attachment meta id ' . $attachment_id . ' :'); error_log(print_r($new_data, true)); wp_update_attachment_metadata( $attachment_id, $new_data ); } }// ends foreach attachment update_option( 'my_run_only_once_1', 'completed' ); }// end run only once } add_action('admin_init', 'isa_cleanup_attachment_metadata'); |
Dán code vào file functions.php

Các bạn chú ý điền các thông tin database của mình để function thực hiện lệnh xóa các thẻ này nhé.
Tìm và thay thế các đoạn sau
|
1 2 3 4 |
DB_HOST DB_USER DB_USER_PASSWORD DATABASE_NAME |
Hàm này chỉ chạy 1 lần thôi nên sau khi lưu và f5 tầm 10 lần thì bạn hoàn toàn có thể xóa code đi nhé.
Và lưu ý hãy backup website trước khi thực hiện để tránh xảy ra lỗi đáng tiếc nhé. Chúc các bạn thành công








