An advanced WordPress query that filters by meta_key and orders the results by another meta_key.
Here’s a PHP code example demonstrating how to achieve this using WP_Query. This will be provided in an immersive code document.
/**
* Advanced WordPress Query: Filtering by meta_key and Ordering by another meta_key.
*
* This example demonstrates how to use WP_Query to fetch posts that have a specific
* custom field (meta_key) and then order those results based on the value of a
* different custom field.
*/
// Define the arguments for our WP_Query.
$args = array(
'post_type' => 'post', // Or 'product', 'book', 'custom_post_type', etc.
'posts_per_page' => 10, // Number of posts to retrieve. Use -1 for all posts.
'post_status' => 'publish', // Only published posts.
// 1. Filtering by meta_key (e.g., only posts with 'featured_item' set to 'yes')
'meta_query' => array(
array(
'key' => 'featured_item', // The meta_key to filter by.
'value' => 'yes', // The meta_value to match.
'compare' => '=', // Comparison operator (e.g., '=', '!=', '>', 'LIKE').
'type' => 'CHAR', // Data type of the meta_value (e.g., 'CHAR', 'NUMERIC', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'UNSIGNED').
// Important for correct comparison.
),
// You can add more meta_query arrays here for complex filtering (AND/OR relationships).
// For example, to also ensure 'product_price' exists:
// array(
// 'key' => 'product_price',
// 'compare' => 'EXISTS',
// ),
),
// 2. Ordering by a custom meta_key (e.g., order by 'display_order')
'orderby' => 'meta_value_num', // Use 'meta_value' for string sorting, 'meta_value_num' for numeric sorting.
'meta_key' => 'display_order', // The meta_key to order the results by.
// This meta_key must be present in the posts you want to order by it.
'order' => 'ASC', // Order direction: 'ASC' for ascending, 'DESC' for descending.
);
// Create a new WP_Query instance.
$custom_query = new WP_Query( $args );
// Check if there are any posts found.
if ( $custom_query->have_posts() ) {
echo '<h2>Featured Items (Ordered by Display Order):</h2>';
echo '<ul>';
// Loop through the posts.
while ( $custom_query->have_posts() ) {
$custom_query->the_post(); // Set up post data.
// Retrieve custom field values for display.
$featured_status = get_post_meta( get_the_ID(), 'featured_item', true );
$display_order = get_post_meta( get_the_ID(), 'display_order', true );
echo '<li>';
echo '<a href="' . get_permalink() . '">' . get_the_title() . '</a>';
echo ' (Featured: ' . esc_html( $featured_status ) . ', Display Order: ' . esc_html( $display_order ) . ')';
echo '</li>';
}
echo '</ul>';
} else {
// No posts found matching the criteria.
echo '<p>No featured items found.</p>';
}
// Restore original post data. This is crucial if you are running this query
// within the WordPress loop (e.g., in a theme template file).
wp_reset_postdata();
This code snippet provides a robust example of how to construct an advanced WP_Query. It first filters posts to include only those marked as ‘featured_item’ with a value of ‘yes’, and then orders these filtered posts based on the numeric value of another custom field named ‘display_order’.
Remember to replace 'post' with your desired post type and adjust the meta_key and meta_value parameters to match your specific custom fields and requirements.