三、增加可查询变量

前台输出地址和等下后台都要用到从url中获取参数,都使用了get_query_var这个函数,不过这个函数获取参数还需要将你要查询的变量加入到“公共可查询变量中”,这个我也不知道怎么翻译。
使用如下代码使得area和season两个参数可用(在functions.php文件中加入如下代码)。


function ashu_query_vars($public_query_vars) {
  $public_query_vars[] = 'area';
  $public_query_vars[] = 'season';
  return $public_query_vars;
}
add_action('query_vars', 'ashu_query_vars');

当然,你也可以使用$_GET方法来获取变量。

四、按条件输出文章

有了前面三步,至少在前台显示的url是可以正常工作。

第四步也就是最后一步,让前台的文章输出我们想要的。
要点:1. 使用pre_get_posts钩子来改变文章查询的参数 2. 如何使用自定义字段查询文章。
(在functions.php文件中加入如下代码)


add_action('pre_get_posts','ashuwp_custom_posts_per_page'); //使用pre_get_posts钩子来改变查询文章的参数
function ashuwp_custom_posts_per_page($query){
  //范例中的页面是destination的归档页面,所以使用is_post_type_archive来判断页面
  if(is_post_type_archive('destination') && $query->is_main_query() && !is_admin()){
    $relation = 0; //用来计数有几个参数
    $area_sort = get_query_var('area'); //获取地域参数
    $season_sort = get_query_var('season'); //获取季节参数
    $meta_query = array(
      'relation' => 'OR',
    );
    //判断季节是否合法,此处就不需要all了,因为all就是所有
    if(in_array($season_sort,array('spring','summer','autumn','winter'))){
      $meta_query[] = array(
            'key'=>'destination_season', //自定义字段的名称
        'value'=> $season_sort,
        'compare'=>'LIKE', //因为自定义字段值可能保存为数组,所以按字段查询文章时使用LIKE
          );
      $relation++;
    }
    //判断地域是否合法
    if(in_array($area_sort,array('center','east','west','south','center'))){
      $meta_query[] = array(
            'key'=>'destination_location',
        'value'=> $area_sort,
        'compare'=>'LIKE',
          );
      $relation++;
    }
    //如果有两个参数,relation要设置为AND,即两个条件都要满足
    if($relation){
      if($relation==2){
        $meta_query['relation'] = 'AND';
      }
      $query->set('meta_query',$meta_query);
    }
  }
}