2016-11-18 9 views
1

Я использую Version 2.0-beta15 с пользовательским типом сообщения, который наследуется от WP_REST_Posts_Controller, но ему нужно запросить дату на основе поля acf. Хлоп!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

Отклик

Ответ возвращает три элемента, но должны быть только два, где два после даты в списке, а третий перед указанная дата. Ниже приведено три значения элемента данных из acf_almanac_date полей:

  1. 2016-12-31T00: 00: 00
  2. 2016-12-24T00: 00: 00
  3. 2016-12-17T00: 00: 00 (эта дата до даты 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

Мне пришло в голову, что, может быть, парам filter[date_query[column]]=acf_almanac_date имеет WP-API для выполнения запросов поля acf_almanac_date, который добавляется динамически в функции wp_rest_add_custom_fields.

Возможно, мне нужно расширить WP_REST_Posts_Controller и переопределить функцию prepare_items_query? Если true, как я могу соотнести это с полем ACF acf_almanac_date? Oy vey!

ответ

1

API-интерфейс WordPress REST не позволяет запрашивать почтовые мета-значения из коробки, поскольку считает их закрытыми. Чтобы включить запрос по мета-значению сообщения, вам необходимо:

  1. Зарегистрируйте параметры запроса на контроллере Post.
  2. Преобразуйте аргументы запроса в аргументы запроса, переданные в WP_Query.

Вот немного кода, который работает на WordPress 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

Спасибо за помощь, Даниэль. Быстрый вопрос. Если у меня есть следующие 5 сообщений с almanac_date из '2016-12-31',' 2016-12-24', '2016-12-17',' 2016-12-10', '2016-12-03' и ударить по конечной точке: '/ wp-json/wp/v2/almanac_entry? almanac_date_after = 2016-12-20T00: 00: 00', я должен получить только 2 сообщения' 2016-12-31', '2016-12-24' , но я получаю все 5. Я знаю, что вы надумали WP 4.7. Может быть, я не запустил это (я должен буду смотреть), или, может быть, мне не хватает парам? :( –

+0

Я запускаю версию 4.6.1. Может быть, мне нужно обновить? Предполагая, что это проблема, так как вы явно вызываете 4.7, и это не значит, что я использую плагин WP REST API Version 2.0-beta15. –

+1

WordPress 4.7 выйдет 6 декабря. Вы можете использовать плагин Beta Tester для обновления к кандидату на выпуск сейчас https://wordpress.org/plugins/wordpress-beta-tester/ –

 Смежные вопросы

  • Нет связанных вопросов^_^