Использование meta_query и настраиваемых полей в pre_get_posts для возврата сообщений в числовом диапазоне

Я пытаюсь создать страницу поиска для музыкальных треков, которая позволяет посетителям:

  • Выберите тип сообщения
  • Выберите жанр
  • Выберите настроение
  • Укажите диапазон бит в минуту (уд ​​/ мин)

wp_dropdown_categories() работает для жанров и настроений (например, мне не нужно изменять pre_get_posts ), но я не могу ограничивать сообщения только теми, кто находится в пределах определенного диапазона «bpm».

Код, который я написал ниже, либо не возвращает никаких результатов, если я выбираю определенные диапазоны, например 20 для «bpm_start» и 180 для «bpm_finish», или я получаю странные результаты для таких запросов:

http://www.domain.com/?s=&post_type=ibm_tracks&ibm_genres=ambient-music&ibm_moods=0&bpm_start=20&bpm_finish=180

Это должно вернуть кучу сообщений ibm_tracks из жанра ambient-music и в пользовательском поле bpm которое находится между 10 и 180, но по какой-то причине оно не возвращает никаких сообщений … в качестве примечания стороны, в примере не было настроено настроение выше, но выбор настроения не влияет на результат в любом случае, никакие сообщения не возвращаются в любом случае.

Может ли кто-нибудь увидеть, что я делаю неправильно?

Благодаря,

Осу

форма

 <?php function osu_list_terms_dd($taxonomy_type, $taxonomy, $showalltext) { $args = array( 'taxonomy' => $taxonomy_type, 'hide_empty' => true, 'name' => $taxonomy_type, 'value_field' => 'slug', 'show_option_all' => $showalltext, 'echo' => 0, //'show_count' => 1, // Useful for checking how many tracks are in a taxonomy term 'id' => 'taxonomy-filter__select-' . $taxonomy, 'orderby' => 'name', 'order' => 'ASC' ); return wp_dropdown_categories($args); } ?> <form role="search" method="get" class="search-form" action="<?php echo esc_url( home_url( '/' ) ); ?>"> <p>Search keywords:</p> <input type="search" value="<?php echo get_search_query(); ?>" name="s" /> <p>Choose post type</p> <select name="post_type"> <option value="ibm_tracks">TRACKS</option> <option value="ibm_logos">LOGOS</option> </select> <p>Choose genre</p> <?php echo osu_list_terms_dd('genres', 'ibm_genres', '- choose a genre -'); ?> <p>Choose Mood</p> <?php echo osu_list_terms_dd('moods', 'ibm_moods', '- choose a mood -'); ?> <p><em>BPM start</em></p> <select name="bpm_start"> <option value="0">0</option> <option value="10">10</option> <option value="20">20</option> ... etc... <option value="220">220</option> <option value="230">230</option> <option value="240">240</option> </select> <p><em>BPM end</em></p> <select name="bpm_finish"> <option value="0">0</option> <option value="10">10</option> <option value="20">20</option> ... etc... <option value="220">220</option> <option value="230">230</option> <option value="240">240</option> </select> </form> 

functions.php

 // ADD CUSTOM QUERY VAR'S SO BPM WORKS BELOW function osu_add_query_vars_filter( $vars ){ $vars[] = "bpm_start"; $vars[] = "bpm_finish"; return $vars; } add_filter( 'query_vars', 'osu_add_query_vars_filter' ); // MODIFY THE MAIN QUERY OBJECT FOR TRACKS AND LOGOS CUSTOM POST TYPES function osu_search_filter( $query ) { // POST ARCHIVE PAGE : Only for IBM tracks and Logos on search page if ( !is_admin() && isset($query->query_vars['post_type']) && is_search() ) { // Set vars $post_type = $_GET['post_type']; $ibm_tracks = 'ibm_tracks'; $ibm_logos = 'ibm_logos'; if(isset($post_type)) { // Only retrieve ibm_tracks // ------------------------------------------------------------------ if($post_type == $ibm_tracks) { // Set post type to ibm_tracks $query->query_vars['post_type'] = $ibm_tracks; // Allow url to alter the query $bpm_start = $_GET['bpm_start']; $bpm_finish = $_GET['bpm_finish']; // Filter posts by BPM range if(isset($bpm_start) && isset($bpm_finish)) { // Alter query with meta_query for BPM $meta_query = array( array( 'key' => 'bpm', 'value' => array($bpm_start, $bpm_finish), 'type' => 'NUMERICAL', 'compare' => 'BETWEEN' ) ); $query->set( 'meta_query', $meta_query ); } } // end if($post_type == ibm_tracks) // Only retrieve ibm_logos // ------------------------------------------------------------------ if($post_type == $ibm_logos) { // Set post type to ibm_logos $query->query_vars['post_type'] = $ibm_logos; } } // end if(isset($post_type)) } // end if ( !is_admin() etc. ) return $query; } // Hook my above function to the pre_get_posts action add_action( 'pre_get_posts', 'osu_search_filter' ); 

Solutions Collecting From Web of "Использование meta_query и настраиваемых полей в pre_get_posts для возврата сообщений в числовом диапазоне"