Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I need to filter posts by a custom field value.

My specific example:

  • User browse to products > category 1 > subcategory A.
  • ALL "subcategory A" items (products custom post type) are displayed as default by date.
  • Each item in subcategory A has a custom field "size". User can select the size with a dropdown menu and posts are filtered displaying only items with "custom field:size" = "selected size". Filter is kept also in pagination, because products are on more pages.

I've checked a lot of answers, but no case was simple as that. I was thinking about doing it using a custom search or a plugin, but I really don't know where to start. thanks for your help.

EDIT: the custom field values are fixed, not auto-populated. The select can be built in plain html without extra queries.

share|improve this question

1 Answer 1

up vote 2 down vote accepted

Edited according to first comments and Pastebin code:

<?php /* You can also leave 'action' blank: action="" */ ?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<select name="my_size" id="size" class="postform" onchange="submit();">
        <option selected="selected">Choose a size</option>
        <option value="10">10</option>
        <option value="20">20</option>
</select>
</form>
<?php /* Reset filter */ ?>
<p><a href="<?php the_permalink(); ?>">Clear filter</a></p>

<?php
if( !isset($_POST['my_size']) || '' == $_POST['my_size']) {

    // unfiltered product list here

}
else {

    // Get dropdown value
    // Don't forget to sanitize this!
    $size = $_POST['my_size'];

    // Create new query
    $query = new WP_Query( array(
        'post_type'=> 'product', // your CPT
        'post_status' => 'publish',
        'meta_key' => 'size',
        'meta_value' => $size, // Dropdown value
    ) );

    // Loop
    if($query->have_posts()):
        while( $query->have_posts() ): $query->the_post();
            // Product content
        endwhile;
    endif;

    // reset query to default
    wp_reset_postdata();

}

See Codex for WP_Query reference.

share|improve this answer
    
Thanks Max. I tried your solution but I'm stuck with the submit of the select, this is the code I used pastebin.com/t36UWQsP I don't know which "action" is correct for the form submitting on "self". If I understood it should append "&my_size=xx" at the end of url as a parameter, right? Your solution looks right, but my php knowledge is pretty basic, sorry. –  Andycap Feb 1 '13 at 15:09
    
Andycap, please see amended code above. –  Max Yudin Feb 1 '13 at 15:34
    
Thanks Max, I got it working! –  Andycap Feb 1 '13 at 17:02
    
Andycap, you are welcome. I forgot to answer your question about URL parameters. When you use method="get", parameters are appended, when method="post" you don't see them in URL. –  Max Yudin Feb 1 '13 at 17:12
    
Max, thanks for that instructive detail, I had already figured it out reading a tutorial on php GET and POST. –  Andycap Feb 2 '13 at 12:40

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.