2016-11-18 2 views
1

WP_REST_Posts_Controller에서 상속하는 사용자 정의 게시 유형을 사용하고 있지만 acf 필드를 기반으로 날짜를 쿼리해야합니다. Yikes!WP-API 특정 날짜 이후에 게시물 받기

엔드 포인트에 Params

/wp-json/wp/v2/almanac_entry?per_page=3&filter[orderby]=acf_almanac_date&after=2016-12-23T00:00:00&filter[date_query[column]]=acf_almanac_date

답변서

응답은 세 가지 항목을 반환하지만 날짜 만 나열 후 두 사람은 두 가지를해야하고, 세 번째는 앞에있는 날짜가 나열됩니다.

  1. 2016-12-31T00 : 00 : 00 : 00
  2. 2016-12-24T00 : 00 : 00
  3. 2016-12-17T00 : 00 : 00 아래는 acf_almanac_date 필드의 세 가지 항목의 값은 (이 날짜는 날짜 이전입니다 2016-12-23T00 : 00 : 00 및 반환되어 있어야합니다)

코드

작업은 등록과 같은 :

add_action('init', 'register_custom_post_types'); 
function register_custom_post_types() { 
    global $wp_post_types; 

    $post_type_name = 'almanac_entry'; 
    if(isset($wp_post_types[ $post_type_name ])) { 
     $wp_post_types[$post_type_name]->show_in_rest = true; 
     $wp_post_types[$post_type_name]->rest_base = $post_type_name; 
     $wp_post_types[$post_type_name]->rest_controller_class = 'WP_REST_Posts_Controller'; 
    } 
} 

add_action('rest_api_init', 'wp_rest_add_custom_fields'); 
function wp_rest_add_custom_fields() { 
    register_rest_field('almanac_entry', 'acf_almanac_date', array (
    'get_callback' => function($object, $field_name, $request) { 
     return get_post_meta($object[ 'id' ], 'almanac_date', true) . "T00:00:00"; 
    }, 
    'update_callback' => null, 
    'schema'   => null, 
)); 
} 

도움을 주시면 감사하겠습니다. 1


계 아마도 상기 PARAM filter[date_query[column]]=acf_almanac_datewp_rest_add_custom_fields 함수에 동적으로 추가되는 필드를 쿼리 acf_almanac_date WP-API를 가지고 있는지 떠올랐다.

아마도 WP_REST_Posts_Controller를 확장하고 prepare_items_query 함수를 재정의해야 할 필요가 있습니까? 사실이라면 ACF 필드 acf_almanac_date에 어떻게 연관시킬 수 있습니까? 오우 vey!

답변

1

WordPress REST API는 사설 메타 데이터 값을 개인적으로 간주하기 때문에 상자 밖에서 메타 값으로 쿼리하는 것을 허용하지 않습니다. 게시 메타 값을 기준으로 쿼리를 사용하려면 다음을 수행해야합니다.

  1. 쿼리 매개 변수를 사후 컨트롤러에 등록합니다.
  2. WP_Query에 전달 된 쿼리 인수로 요청 인수를 변환합니다.

여기에 워드 프레스 4.7 작동 코드의 비트는 다음과 같습니다 도움, 다니엘에 대한

// Set the post type to modify. 
$post_type = 'almanac_entry'; 

/** 
* Register `almanac_date_before` and `almanac_date_after` 
* as collection query params. 
* 
* Also support ordering by the `almanac_date` meta value. 
*/ 
add_filter("rest_{$post_type}_collection_params", function($params){ 
    $params['almanac_date_before'] = array(
     'description'  => __('Limit response to posts published before a given ISO8601 compliant date.'), 
     'type'    => 'string', 
     'format'    => 'date-time', 
    ); 
    $params['almanac_date_after'] = array(
     'description'  => __('Limit response to posts published after a given ISO8601 compliant date.'), 
     'type'    => 'string', 
     'format'    => 'date-time', 
    ); 
    $params['orderby']['enum'][] = 'almanac_date'; 
    return $params; 
}); 

/** 
* Transform almanac_date_before` and `almanac_date_after` into a meta query. 
*/ 
add_filter("rest_{$post_type}_query", function($query_args, $request){ 
    if (isset($request['almanac_date_before'])) { 
     if (! is_array($query_args['meta_query'])) { 
      $query_args['meta_query'] = array(); 
     } 
     // We only want the 2016-11-23 from 2016-11-23T00:00:00 
     $bits = explode('T', $request['almanac_date_before']); 
     $query_args['meta_query'][] = array(
      'key'  => 'almanac_date', 
      'value' => $bits[0], 
      'compare' => '<=', 
      'type'  => 'DATE', 
     ); 
    } 
    if (isset($request['almanac_date_after'])) { 
     if (! is_array($query_args['meta_query'])) { 
      $query_args['meta_query'] = array(); 
     } 
     // We only want the 2016-11-23 from 2016-11-23T00:00:00 
     $bits = explode('T', $request['almanac_date_after']); 
     $query_args['meta_query'][] = array(
      'key'  => 'almanac_date', 
      'value' => $bits[0], 
      'compare' => '>=', 
      'type'  => 'DATE', 
     ); 
    } 
    return $query_args; 
}, 10, 2); 
+0

감사합니다. 빠른 질문. almanac_date가 '2016-12-31','2016-12-24', '2016-12-17','2016-12-10', '2016-12-03' 및 다음과 같은 5 개의 게시물이있는 경우 '/ wp-json/wp/v2/almanac_entry? almanac_date_after = 2016-12-20T00 : 00 : 00'을 끝낼 때'2016-12-31','2016-12-24' , 그러나 나는 모두 5를 얻는다. 나는 당신이 WP 4.7을 mentoined했다는 것을 안다. 어쩌면 나는 그것을 실행하지 않을 것이다 (나는보아야 할 것이다), 아니면 아마도 나는 param을 놓치고 있는가? :( –

+0

버전 4.6.1을 실행 중입니다. 업데이트해야 할 수도 있습니다. 명시 적으로 4를 호출 한 이후로 문제가 있다고 가정합니다.7, 그리고 WP REST API 버전 2.0-beta15 플러그인을 사용하고있는 것은 아닙니다. –

+1

WordPress 4.7은 12 월 6 일에 출시 될 예정입니다. 베타 테스터 플러그인을 사용하여 지금 출시 후보로 업데이트 할 수 있습니다. https://wordpress.org/plugins/wordpress-beta-tester/ –

관련 문제