Introduction to pre_get_posts
The pre_get_posts
hook is one of the most powerful and versatile hooks in WordPress. It allows developers to modify the query parameters before WordPress fetches posts from the database. By leveraging this hook, you can customize search results, filter posts based on custom criteria, exclude or include specific post types, and much more.
In this guide, CodeFusionOnline will walk you through everything you need to know about the pre_get_posts
hook, including how to use it effectively with real-world examples.
Why Use pre_get_posts
in WordPress?
- Modify main queries before WordPress retrieves posts
- Customize search results to include or exclude specific post types
- Modify archive pages to show only specific categories or tags
- Exclude posts from specific categories in the homepage feed
- Improve website SEO by optimizing query results
How the pre_get_posts
Hook Works
The pre_get_posts
hook is triggered just before the WP_Query object executes the SQL query to retrieve posts. This hook allows developers to modify query parameters using the query
object.
Syntax
function custom_modify_query( $query ) {
if ( !is_admin() && $query->is_main_query() ) {
// Modify the query parameters here
}
}
add_action( 'pre_get_posts', 'custom_modify_query' );
Practical Use Cases of pre_get_posts
1. Exclude a Category from the Homepage
If you want to exclude a specific category (e.g., ID 5) from the homepage posts list, use the following code:
function codefusiononline_exclude_category_homepage( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-5' );
}
}
add_action( 'pre_get_posts', 'codefusiononline_exclude_category_homepage' );
2. Modify Search Results to Include Custom Post Types
By default, WordPress search only includes posts and pages. To include custom post types (e.g., product
), use:
function codefusiononline_customize_search( $query ) {
if ( $query->is_search() && $query->is_main_query() ) {
$query->set( 'post_type', array( 'post', 'page', 'product' ) );
}
}
add_action( 'pre_get_posts', 'codefusiononline_customize_search' );
3. Show Only Posts from a Specific Author
If you want to display only posts from a specific author (e.g., ID 2) in the blog archive, use:
function codefusiononline_filter_author_posts( $query ) {
if ( $query->is_archive() && $query->is_main_query() ) {
$query->set( 'author', '2' );
}
}
add_action( 'pre_get_posts', 'codefusiononline_filter_author_posts' );
4. Limit the Number of Posts on a Category Page
To display only five posts per page on a category archive, use:
function codefusiononline_limit_category_posts( $query ) {
if ( $query->is_category() && $query->is_main_query() ) {
$query->set( 'posts_per_page', 5 );
}
}
add_action( 'pre_get_posts', 'codefusiononline_limit_category_posts' );
5. Exclude Pages from Search Results
To ensure only blog posts appear in search results, excluding pages:
function codefusiononline_exclude_pages_search( $query ) {
if ( $query->is_search() && $query->is_main_query() ) {
$query->set( 'post_type', 'post' );
}
}
add_action( 'pre_get_posts', 'codefusiononline_exclude_pages_search' );
Best Practices for Using pre_get_posts
- Always check
is_main_query()
to avoid modifying unintended queries. - Use
!is_admin()
to prevent modifying queries in the admin panel. - Be specific with conditionals like
is_home()
,is_search()
, oris_category()
. - Avoid modifying queries of third-party plugins unless necessary.
- Test thoroughly to ensure changes do not conflict with other plugins or themes.
Conclusion
The pre_get_posts
hook is an essential tool for WordPress developers looking to customize how content is queried and displayed. By understanding its use cases and best practices, you can tailor your WordPress site’s content display to better suit your needs and improve SEO performance.
Start implementing these examples on your WordPress site today and see how the pre_get_posts
hook enhances your site’s functionality!