The posts_request_ids filter allows you to modify the Post IDs SQL request before it’s sent to the database. This can be useful for customizing query results in various ways.
Usage
add_filter('posts_request_ids', 'my_custom_posts_request_ids', 10, 2); function my_custom_posts_request_ids($request, $query) { // your custom code here return $request; }
Parameters
$request
(string): The post ID request that will be sent to the database.$query
(WP_Query): The WP_Query instance related to the current request.
More information
See WordPress Developer Resources: posts_request_ids
Examples
Exclude Specific Post IDs
Exclude specific post IDs from the query by modifying the SQL request.
add_filter('posts_request_ids', 'exclude_specific_post_ids', 10, 2); function exclude_specific_post_ids($request, $query) { global $wpdb; $exclude_ids = array(1, 2, 3); // Set the post IDs you want to exclude $exclude_ids = implode(',', $exclude_ids); $request = str_replace("FROM {$wpdb->posts}", "FROM {$wpdb->posts} WHERE {$wpdb->posts}.ID NOT IN ({$exclude_ids})", $request); return $request; }
Limit Number of Post IDs
Limit the number of post IDs returned by the SQL request.
add_filter('posts_request_ids', 'limit_number_of_post_ids', 10, 2); function limit_number_of_post_ids($request, $query) { $request .= " LIMIT 5"; // Limit the number of post IDs to 5 return $request; }
Order Post IDs by Custom Field
Order post IDs based on a custom field value.
add_filter('posts_request_ids', 'order_post_ids_by_custom_field', 10, 2); function order_post_ids_by_custom_field($request, $query) { global $wpdb; $meta_key = 'custom_field_name'; // Replace with your custom field name $request = str_replace("FROM {$wpdb->posts}", "FROM {$wpdb->posts} INNER JOIN {$wpdb->postmeta} ON ( {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '{$meta_key}' )", $request); $request .= " ORDER BY {$wpdb->postmeta}.meta_value ASC"; // Sort by the custom field value (ASC or DESC) return $request; }
Filter Post IDs by Custom Taxonomy
Filter post IDs based on a custom taxonomy term.
add_filter('posts_request_ids', 'filter_post_ids_by_custom_taxonomy', 10, 2); function filter_post_ids_by_custom_taxonomy($request, $query) { global $wpdb; $taxonomy = 'custom_taxonomy'; // Replace with your custom taxonomy name $term_id = 10; // Replace with your desired term ID $request = str_replace("FROM {$wpdb->posts}", "FROM {$wpdb->posts} INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id) INNER JOIN {$wpdb->term_taxonomy} ON ({$wpdb->term_relationships}.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id AND {$wpdb->term_taxonomy}.taxonomy = '{$taxonomy}' AND {$wpdb->term_taxonomy}.term_id = {$term_id})", $request); return $request; }
Exclude Post IDs in a Date Range
Exclude post IDs that fall within a specific date range.
add_filter('posts_request_ids', 'exclude_post_ids_in_date_range', 10, 2); function exclude_post_ids_in_date_range($request, $query) { global $wpdb; $start_date = '2023-01-01'; // Set the start date $end_date = '2023-01-31'; // Set the end date $request = str_replace("FROM {$wpdb->posts}", "FROM {$wpdb->posts} WHERE ({$wpdb->posts}.post_date NOT BETWEEN '{$start_date}' AND '{$end_date}')", $request); return $request; }