Массив Meta_Query в WP_Query с использованием расширенных настраиваемых полей (динамически для нескольких полей фильтра) wordpress - php - PullRequest
0 голосов
/ 14 апреля 2019

Я постараюсь объяснить это как можно лучше, но я нахожу это довольно сложным и вне моей зоны комфорта.Я потратил неделю, пытаясь найти ответы в Интернете, и столкнулся с проблемой.

Предыстория: я создаю инструмент, который может фильтровать настраиваемые типы записей по всем настраиваемым полям, прикрепленным к этому настраиваемому типу записей, а также настраиваемые поля, прикрепленные к другим настраиваемым типам записей через поле «Отношения» в ACF.(расширенные настраиваемые поля).Вы можете увидеть это здесь: roottiedev.wpengine.com/strains

У меня почти все работает до сих пор.Пользователь может использовать боковую панель фильтра для выбора любых полей и значений, по которым он хочет фильтровать.Javascript применяет эти поля к строке URL.пример) https://roottiedev.wpengine.com/strains?feelings_$_feeling=Happy

Поскольку некоторые настраиваемые поля являются двухмерными (поля повторителя или группы в ACF), я должен использовать приведенный выше пример с $ между родительским ключом и дочерним ключом.,

Со времени WordPress 4.8.3 существует переписывание, в котором ACF сообщает вам, что вы должны изменить _ $ на _%.Вы можете увидеть документацию здесь: (прокрутите вниз до пункта 4.) https://www.advancedcustomfields.com/resources/query-posts-custom-fields/

Это все работает, пока я использую одно поле.Похоже, что второе я пытаюсь сделать несколько полей, или второе я пытаюсь использовать поле, которое не использует «meta_compare» из «LIKE» (например, на фильтрах вы увидите, у меня есть две панели выбора ползункачто говорят "THC%" и "CBD%"), что все терпит неудачу.Ползунки не используют сравнение «LIKE», вместо этого они используют «> =» или «<=».</p>

Мой $ _GET в моем functions.php, чтобы переписать "add_action ('pre_get_posts', 'my_pre_get_posts');"Кажется, что работает нормально, используя операторы IF, но опять же, это может быть причиной того, что он не работает на нескольких полях.

Хорошо, надеюсь, это объясняет, что я пытаюсь сделать.Вот фрагменты кода, которые я считаю актуальными.


    // START THE CUSTOM LOOP
remove_action( 'genesis_loop', 'genesis_do_loop' );
add_action('genesis_loop', 'roottie_strains', 10);
function roottie_strains () {

// grab the meta query relation. Will all fields be 'and' or 'or'
$meta_query = array( 'relation' => 'AND' );

// loop through $meta_query to grab key and values
foreach ( wp_parse_args( $query_string ) as $key => $value ) {
$meta_query[] = array( 'key' => $key, 'value' => $value );
}


$args = array(
'posts_per_page' => 18,
'post_type' => 'strains',
'post_status' => 'publish',
'order' => ASC,
'paged' => get_query_var( 'paged' ),
'meta_query' => $meta_query,
);




// https://www.advancedcustomfields.com/resources/query-posts-custom-fields/
// THIS IS APPARENTLY NEEDED DUE TO CHANGES IN ESC_SQL() FOR WORDPRESS 4.8.3. WE CHANGE _$_ TO _%_ INSTEAD
add_filter('posts_where', 'my_posts_where');
function my_posts_where( $where ) {
/* if( isset($_GET['feelings_$_feeling']) ) {
$where = str_replace("meta_key = 'feelings_$", "meta_key LIKE 'feelings_%", $where);
return $where;
} */

$rootkeys[] = $_GET;
global $wpdb; //TESTING
foreach($rootkeys as $rootkey) {
foreach($rootkey as $key => $value) {
$partialkey = explode("$",$key);
$keya = $partialkey[0];
$keyb = 'meta_key = \''.$keya.'$';
$keyc = 'meta_key LIKE \''.$keya.'%'; //this = was LIKE, should it be?
// $where = str_replace($keyb, $keyc, $where);
$where = str_replace($keyb, $keyc, $wpdb->remove_placeholder_escape($where));
}
}
return $where;


}

Тогда, для файла functions.php, вот мое переписывание:

// GET URL STRING FOR FILTERING ON ANY POST. FILTER WP_QUERY BY URL STRING EX roottie.com/brands?field=blue
add_action('pre_get_posts', 'my_pre_get_posts');
function my_pre_get_posts( $query ) {

// do not modify queries in the admin
// 
if( is_admin() ) {
return $query;  
}



// only modify queries for 'strains' post type
// 
if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'strains' ) {
// allow the url to alter the query
if( isset($_GET['strain_type']) ) {
$query->set('meta_key', 'strain_type');
$query->set('meta_value', $_GET['strain_type']);
}
if( isset($_GET['feelings_$_feeling']) ) {
$query->set('meta_key', 'feelings_$_feeling');
$query->set('meta_value', $_GET['feelings_$_feeling']);
} 
if( isset($_GET['medical_use_$_medical']) ) {
$query->set('meta_key', 'medical_use_$_medical');
$query->set('meta_value', $_GET['medical_use_$_medical']);
}
if( isset($_GET['sflavours_$_sflavour']) ) {
$query->set('meta_key', 'sflavours_$_sflavour');
$query->set('meta_value', $_GET['sflavours_$_sflavour']);
} 
if( isset($_GET['thc_min']) ) {
$query->set('meta_key', 'thc_min');
$query->set('meta_value', $_GET['thc_min']);
$query->set('meta_compare', '>=');
$query->set('meta_type', 'NUMERIC');
}
if( isset($_GET['thc_max']) ) {
$query->set('meta_key', 'thc_max');
$query->set('meta_value', $_GET['thc_max']);
$query->set('meta_compare', '<=');
$query->set('meta_type', 'NUMERIC');
} 
if( isset($_GET['cbd_min']) ) {
$query->set('meta_key', 'cbd_min');
$query->set('meta_value', $_GET['cbd_min']);
$query->set('meta_compare', '>=');
$query->set('meta_type', 'NUMERIC');
}
if( isset($_GET['cbd_max']) ) {
$query->set('meta_key', 'cbd_max');
$query->set('meta_value', $_GET['cbd_max']);
$query->set('meta_compare', '<=');
$query->set('meta_type', 'NUMERIC');
}
}




// return
return $query;
}

Любая помощь или точка в правильном направлении будет огромной!Я не могу понять, связана ли проблема с «сравнением» или проблема заключается в цикле перебора всех полей в meta_query переписать для версии 4.8.3 (где мы берем чувство_ $ и переписываем его в чувство_%

Для примера вывода, если мы используем этот URL:

https://roottiedev.wpengine.com/strains?thc_min=5&thc_max=20&cbd_min=5&cbd_max=20&feelings_$_feeling=Uplifted

Это дамп wp_query

ВЫБЕРИТЕ SQL_CALC_FOUND_ROWS wp_roottie_posts.ID ОТ wp_roottie_posts ВНУТРЕННЕЕ ВСТУПЛЕНИЕAND wp_roottie_posts.post_type = 'strains' AND ((wp_roottie_posts.post_status = 'publish')) GROUP BY wp_roottie_posts.ID ORDER BY wp_roottie_posts.post_date ASC LIMIT 0, 18

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...