Skip to content

Commit 36fd613

Browse files
Copilotswissspidy
andauthored
Refactor find_duplicate_attachment() to use WP_Query with meta_query instead of raw SQL
Agent-Logs-Url: https://github.com/wp-cli/media-command/sessions/0f126b51-1ee9-48c9-9031-92a31261b462 Co-authored-by: swissspidy <841956+swissspidy@users.noreply.github.com>
1 parent a61dc72 commit 36fd613

1 file changed

Lines changed: 25 additions & 34 deletions

File tree

src/Media_Command.php

Lines changed: 25 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)