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.
Table of contents
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;
}