@@ -1119,51 +1119,42 @@ private function make_copy( $path ) {
11191119 * @return int|false Attachment ID if found, false otherwise.
11201120 */
11211121 private function find_duplicate_attachment ( $ basename ) {
1122- global $ wpdb ;
1123-
11241122 // WP 5.3+ big-image scaling renames 'image.jpg' → 'image-scaled.jpg' and
11251123 // stores the scaled name in _wp_attached_file, so search for both variants.
11261124 $ ext = pathinfo ( $ basename , PATHINFO_EXTENSION );
11271125 $ name = pathinfo ( $ basename , PATHINFO_FILENAME );
11281126 $ scaled_basename = $ name . '-scaled ' . ( $ ext ? '. ' . $ ext : '' );
11291127
1130- $ slash_basename = '/ ' . $ basename ;
1131- $ slash_scaled_basename = '/ ' . $ scaled_basename ;
1132-
1133- if ( function_exists ( 'mb_strlen ' ) ) {
1134- $ slash_basename_length = mb_strlen ( $ slash_basename , 'UTF-8 ' );
1135- $ slash_scaled_basename_length = mb_strlen ( $ slash_scaled_basename , 'UTF-8 ' );
1136- } else {
1137- $ slash_basename_length = strlen ( $ slash_basename );
1138- $ slash_scaled_basename_length = strlen ( $ slash_scaled_basename );
1128+ // Build OR meta query clauses matching exact basename or year/month-prefixed paths.
1129+ $ meta_clauses = array ( 'relation ' => 'OR ' );
1130+ foreach ( array ( $ basename , $ scaled_basename ) as $ variant ) {
1131+ $ meta_clauses [] = array (
1132+ 'key ' => '_wp_attached_file ' ,
1133+ 'value ' => $ variant ,
1134+ 'compare ' => '= ' ,
1135+ );
1136+ $ meta_clauses [] = array (
1137+ 'key ' => '_wp_attached_file ' ,
1138+ 'value ' => '/ ' . $ variant ,
1139+ 'compare ' => 'LIKE ' ,
1140+ );
11391141 }
11401142
1141- $ result = $ wpdb ->get_var (
1142- $ wpdb ->prepare (
1143- "SELECT p.ID
1144- FROM {$ wpdb ->posts } p
1145- INNER JOIN {$ wpdb ->postmeta } pm
1146- ON p.ID = pm.post_id
1147- WHERE p.post_type = 'attachment'
1148- AND p.post_status != 'trash'
1149- AND pm.meta_key = '_wp_attached_file'
1150- AND (
1151- pm.meta_value = %s
1152- OR RIGHT(pm.meta_value, %d) = %s
1153- OR pm.meta_value = %s
1154- OR RIGHT(pm.meta_value, %d) = %s
1155- )
1156- LIMIT 1 " ,
1157- $ basename ,
1158- $ slash_basename_length ,
1159- $ slash_basename ,
1160- $ scaled_basename ,
1161- $ slash_scaled_basename_length ,
1162- $ slash_scaled_basename
1143+ $ query = new \WP_Query (
1144+ array (
1145+ 'post_type ' => 'attachment ' ,
1146+ 'post_status ' => 'any ' ,
1147+ 'posts_per_page ' => 1 ,
1148+ 'meta_query ' => $ meta_clauses , // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
1149+ 'fields ' => 'ids ' ,
1150+ 'no_found_rows ' => true ,
1151+ 'update_post_meta_cache ' => false ,
1152+ 'update_post_term_cache ' => false ,
11631153 )
11641154 );
11651155
1166- return $ result ? (int ) $ result : false ;
1156+ $ posts = $ query ->posts ;
1157+ return ! empty ( $ posts ) ? (int ) $ posts [0 ] : false ;
11671158 }
11681159
11691160 /**
0 commit comments