WordPress Version: 6.5
/**
* Handles querying attachments via AJAX.
*
* @since 3.5.0
*/
function wp_ajax_query_attachments()
{
if (!current_user_can('upload_files')) {
wp_send_json_error();
}
$query = isset($_REQUEST['query']) ? (array) $_REQUEST['query'] : array();
$keys = array('s', 'order', 'orderby', 'posts_per_page', 'paged', 'post_mime_type', 'post_parent', 'author', 'post__in', 'post__not_in', 'year', 'monthnum');
foreach (get_taxonomies_for_attachments('objects') as $t) {
if ($t->query_var && isset($query[$t->query_var])) {
$keys[] = $t->query_var;
}
}
$query = array_intersect_key($query, array_flip($keys));
$query['post_type'] = 'attachment';
if (MEDIA_TRASH && !empty($_REQUEST['query']['post_status']) && 'trash' === $_REQUEST['query']['post_status']) {
$query['post_status'] = 'trash';
} else {
$query['post_status'] = 'inherit';
}
if (current_user_can(get_post_type_object('attachment')->cap->read_private_posts)) {
$query['post_status'] .= ',private';
}
// Filter query clauses to include filenames.
if (isset($query['s'])) {
add_filter('wp_allow_query_attachment_by_filename', '__return_true');
}
/**
* Filters the arguments passed to WP_Query during an Ajax
* call for querying attachments.
*
* @since 3.7.0
*
* @see WP_Query::parse_query()
*
* @param array $query An array of query variables.
*/
$query = apply_filters('ajax_query_attachments_args', $query);
$attachments_query = new WP_Query($query);
update_post_parent_caches($attachments_query->posts);
$posts = array_map('wp_prepare_attachment_for_js', $attachments_query->posts);
$posts = array_filter($posts);
$total_posts = $attachments_query->found_posts;
if ($total_posts < 1) {
// Out-of-bounds, run the query again without LIMIT for total count.
unset($query['paged']);
$count_query = new WP_Query();
$count_query->query($query);
$total_posts = $count_query->found_posts;
}
$posts_per_page = (int) $attachments_query->get('posts_per_page');
$max_pages = $posts_per_page ? (int) ceil($total_posts / $posts_per_page) : 0;
header('X-WP-Total: ' . (int) $total_posts);
header('X-WP-TotalPages: ' . $max_pages);
wp_send_json_success($posts);
}