2015-07-22 33 views
1

我正在使用自定义帖子类型在我的wordpress网站中创建用户。我正在整合用户列表的高级搜索。在这种情况下,我需要按年龄范围搜索用户,例如21 - 3031 - 40,但我只有用户在数据库中出生的日期。正如你在wordpress文章中所知道的那样,它在wp_postmeta表中被存储为meta_keymeta_value查看我的年龄段是否与存储在数据库中的'出生日期'匹配

我在写我自己的自定义查询检索部:

$queryStr = "SELECT DISTINCT ID, wposts.* FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta WHERE wposts.ID = wpostmeta.post_id"; 

//if nationality is not empty check it in the DB 
if($sltNationality != '' && $sltNationality != 'Any') : 
    $queryStr .= " AND wpostmeta.meta_key = 'nationality' AND wpostmeta.meta_value = '$sltNationality'"; 
endif; 

//if age range is not empty check it 
if($age != '' && $age != 'Any') : 
    $queryStr .= " check age between condition "; 
endif; 

//execute 
$pageposts = $wpdb->get_results($queryStr, OBJECT); 

现在我的年龄段stucked。作为从互联网搜索,很高兴我发现了一个来自stackoverflow的代码。 get age from DOB

但不知道如何在我的自定义查询中使用这个。请帮助我们。谢谢

+0

数据库中出生日期的格式是什么? 'YYYY-MM-DD'? – vard

+0

'dd-mm-yy'这是格式 – nanbatman

回答

1

你应该让Wordpress为你构建这个元查询 - 你可以使用get_posts来实现这一点。

这里有一个建议:

$meta_query = array(); 
if($sltNationality != '' && $sltNationality != 'Any') { // nationality query 
    array_push($meta_query, array(
     'key'  => 'nationality', 
     'value'  => $sltNationality 
    )); 
} 
if($age != '' && $age != 'Any') { // age query 
    // assuming your select values are always in this format : 21 - 30, 31 -40 etc. 
    $age = explode(' - ', $age); 
    $min_year = (int)date('Y') - (int)$age[1]; 
    $max_year = (int)date('Y') - (int)$age[0]; 
    // build a regex to get all the birth date in the year range 
    $year_regex = array(); 
    for($y = $min_year; $y < $max_year; $y++) { 
     array_push($year_regex, strval($y)); 
    } 
    array_push($meta_query, array(
     'key'  => 'age', 
     'value'  => '^[0-9]{2}-[0-9]{2}-('.implode('|', $year_regex).')$', 
     'compare' => 'REGEXP' 
    )); 
} 
$args = array(
    'posts_per_page' => -1, 
    'post_type' => 'user', 
    'meta_query' => $meta_query 
); 
$users = get_posts($args); 

您应该检查post_type名称是确定的,那选择的值总是相匹配的“YY - YY”格式 - 如果不是你将不得不做一些特殊情况。

+0

我认为你的'foreach'应该是一个'for循环'的权利?好的,让我先试一试。 – nanbatman

+0

是的,这是'for' - 更新我的回答 – vard

+0

我删除了substr(),因为它只返回一年中的最后两位数。现在它的工作。真棒!谢了,兄弟。 – nanbatman

相关问题