WP_Query中的meta_Query数组,使用高级自定义字段(动态地针对多个过滤器字段)wordpress-php

时间:2019-04-14 16:44:55

标签: php wordpress

我将尽我所能尽力解释这一点,但我发现它相当复杂且超出了我的舒适范围。我花了一个星期的时间尝试在线查找答案,但遇到了麻烦。

背景故事:我正在构建一个工具,该工具可以通过附加到该自定义帖子类型的所有自定义字段过滤自定义帖子类型,还可以通过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/

只要我使用一个字段,这一切都可以。似乎第二个我尝试做多个字段,或者第二个我尝试使用不使用“ LIKE”的“ meta_compare”的字段(例如,在过滤器上,您将看到我有两个滑块选择栏表示“ THC%”和“ CBD%”),则一切都会失败。 滑块不使用“ LIKE”比较,而是使用“> =”或“ <=”代替。

我在functions.php中的$ _GET重写了“ 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版本中的所有字段来实现的(我们将“感情_ $”重写为“感情_%”

对于输出示例,如果我们使用以下网址:

https://roottiedev.wpengine.com/strains?thc_min=5&thc_max=20&cbd_min=5&cbd_max=20&feelings_ $ _ feeling =已提升

这是wp_query的转储

  

SELECT SQL_CALC_FOUND_ROWS wp_roottie_posts.ID FROM wp_roottie_posts INNER JOIN wp_roottie_postmeta ON(wp_roottie_posts.ID = wp_roottie_postmeta.post_id)WHERE 1 = 1 AND((wp_tietie_post_meta_value'meta_meta_meta_meta_key '))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

0 个答案:

没有答案