apply_filters_ref_array is a WordPress PHP filter that allows you to modify the WHERE clause of a WordPress query. It’s especially useful for caching plugins to adjust queries before they’re executed.
Usage
To use the apply_filters_ref_array
filter, you need to hook a custom function into it. Here’s a basic code example:
add_filter('posts_where_request', 'my_custom_where_filter', 10, 2); function my_custom_where_filter($where, $query) { // Your custom code to modify the $where variable return $where; }
Parameters
$where
(string)- The WHERE clause of the query.
$query
(WP_Query)- The WP_Query instance (passed by reference).
Examples
Filter Posts with Specific Tag
add_filter('posts_where_request', 'filter_posts_with_specific_tag', 10, 2); function filter_posts_with_specific_tag($where, $query) { global $wpdb; if ($query->is_main_query()) { $where .= " AND {$wpdb->prefix}terms.slug = 'my-tag'"; } return $where; }
This example modifies the WHERE clause to only include posts with the ‘my-tag’ tag.
Exclude Posts with Specific Category
add_filter('posts_where_request', 'exclude_posts_with_specific_category', 10, 2); function exclude_posts_with_specific_category($where, $query) { global $wpdb; if ($query->is_main_query()) { $where .= " AND {$wpdb->prefix}terms.slug != 'exclude-category'"; } return $where; }
This example modifies the WHERE clause to exclude posts with the ‘exclude-category’ category.
Filter Posts by Custom Field Value
add_filter('posts_where_request', 'filter_posts_by_custom_field', 10, 2); function filter_posts_by_custom_field($where, $query) { global $wpdb; if ($query->is_main_query()) { $where .= " AND {$wpdb->prefix}postmeta.meta_key = 'custom_field_key' AND {$wpdb->prefix}postmeta.meta_value = 'custom_value'"; } return $where; }
This example modifies the WHERE clause to include only posts with a specific custom field value.
Exclude Posts Older Than 30 Days
add_filter('posts_where_request', 'exclude_posts_older_than_30_days', 10, 2); function exclude_posts_older_than_30_days($where, $query) { global $wpdb; if ($query->is_main_query()) { $where .= " AND {$wpdb->prefix}posts.post_date > DATE_SUB(NOW(), INTERVAL 30 DAY)"; } return $where; }
This example modifies the WHERE clause to exclude posts older than 30 days.
Filter Posts with Specific Post Status
add_filter('posts_where_request', 'filter_posts_with_specific_status', 10, 2); function filter_posts_with_specific_status($where, $query) { global $wpdb; if ($query->is_main_query()) { $where .= " AND {$wpdb->prefix}posts.post_status = 'draft'"; } return $where; }
This example modifies the WHERE clause to include only posts with the ‘draft’ status.