Can be found on an Evo blog post with more explanation at the link below.
UPDATE: with PHP8.* this throws an error I haven’t figured out how to satisfactorily resolve.
<form method="post" action=""> <select name="trngregion" id="region" class="postform" onchange="submit();"> <!--establish 'sort value'--> <option <?php echo ($_POST['trngregion'] == '') ? ' selected="selected"' : ''; ?> value="">All Regions (default)</option> <option <?php echo ($_POST['trngregion'] == 'Albuquerque') ? ' selected="selected"' : ''; ?> value="Albuquerque">Albuquerque</option> <option <?php echo ($_POST['trngregion'] == 'Farmington') ? ' selected="selected"' : ''; ?> value="Farmington">Farmington</option> <option <?php echo ($_POST['trngregion'] == 'Las Cruces') ? ' selected="selected"' : ''; ?> value="Las Cruces">Las Cruces</option> <option <?php echo ($_POST['trngregion'] == 'Rio Rancho') ? ' selected="selected"' : ''; ?> value="Rio Rancho">Rio Rancho</option> <option <?php echo ($_POST['trngregion'] == 'Roswell') ? ' selected="selected"' : ''; ?> value="Roswell">Roswell</option> <option <?php echo ($_POST['trngregion'] == 'Santa Fe') ? ' selected="selected"' : ''; ?> value="Santa Fe">Santa Fe</option> </select> </form> <?php $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; $today = date('Ymd', strtotime('-6 hours')); if( !isset($_POST['trngregion']) || '' == $_POST['trngregion']) { //if 'sort value' not selected $traininglist= new WP_Query( array( //this is the basic query without region selected (the easy part) 'post_type' => 'training', 'posts_per_page' => 6, 'paged' => $paged, 'meta_key' => 'trng_startdate', 'orderby' => 'meta_value', 'order' => 'ASC', 'meta_query' => array( array( 'key' => 'trng_endate', 'meta-value' => $value, 'value' => $today, 'compare' => '>=', 'type' => 'CHAR' ) ) ) ); } else { <strong>//if sort value exists, the query that compares sort value and custom field value</strong> $trainingregion = $_POST['trngregion']; //get 'sort value' $traininglist= new WP_Query( array( 'post_type' => 'training', 'posts_per_page' => -1, //unlimited posts keeps paging from resetting sort 'paged' => $paged, 'meta_key' => 'trng_startdate', 'orderby' => 'meta_value', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'AND', //add query that compares 'sort value' with 'custom field value' array( 'key' => 'trng_endate', 'meta-value' => $value, 'value' => $today, 'compare' => '>=', 'type' => 'CHAR' ), array( //add query that compares 'sort value' with 'custom field value' 'key' => 'trng_region', //custom field 'value' => $trainingregion, //sort value 'type' => 'CHAR', 'compare' => '=' ) ) ) ); } if ($traininglist->have_posts()) : if ($trainingregion) { echo '<div class="trngfilter"><h2>'.$trainingregion.' Training Events</h2></div>'; //heading for sorted results } while ( $traininglist->have_posts() ) : $traininglist->the_post(); ?>
Display results here
<?php endwhile; else : echo '<p>There are no upcoming '.$trainingregion.' trainings listed.</p>'; //message for no result endif; wp_pagenavi( array( 'query' => $traininglist ) ); wp_reset_query(); ?>
Reference Links
https://evowebdev.com/2015/02/filtering-custom-post-types-with-dropdown-menu/