Мета-запрос для пользовательского типа записи не работает

#wordpress

Вопрос:

Я пытаюсь использовать API REST WordPress для пользовательских сообщений и использовать параметры для фильтрации. Я создал параметры course_no , course_cycles и course_type . Это мета — поля записей курса.

Для этого я использую rest_course_query крючок фильтра. Таков код:

 // Add custom field filters for REST API function chld_thm_post_meta_request_params( $args, $request ) {   $hasFilterCourseNo = false;  $hasFilterCourseCycles = false;  $hasFilterCourseType = false;   // meta query for course number  if ($request['course_no'] != null) {  $hasFilterCourseNo = true;  $courseNoMetaQuery = array(  'key' =gt; 'course_no',  'value' =gt; $request['course_no'],  'compare' =gt; '='  );  }   // meta query for course cycles  if ($request['course_cycles'] != null) {  $hasFilterCourseCycles = true;  $courseCycleMetaQuery = array(  'relation' =gt; 'OR'  );  foreach (explode(",", $request['course_cycles']) as $course_cycle) {  $currentCycle = array(  'key' =gt; 'course_cycles',  'value' =gt; serialize($course_cycle),  'compare' =gt; 'LIKE'  );  array_push($courseCycleMetaQuery, $currentCycle);  }  }   // meta query for course type  if ($request['course_type'] != null) {  $hasFilterCourseType = true;  $courseTypeMetaQuery = array(  'key' =gt; 'course_type',  'value' =gt; $request['course_type'],  'compare' =gt; '='  );  }   $meta_query_args = array(  'relation' =gt; 'AND'  );   if ($hasFilterCourseNo == true) {  array_push( $meta_query_args, $courseNoMetaQuery);  }  if ($hasFilterCourseCycles == true) {  array_push( $meta_query_args, $courseCycleMetaQuery);  }  if ($hasFilterCourseType == true) {  array_push( $meta_query_args, $courseTypeMetaQuery);  }   $meta_query = array(  'meta_query' =gt; $meta_query_args  );   $args = $args   $meta_query; // TODO looks like meta_query is not working here   return $args; } add_filter( 'rest_course_query', 'chld_thm_post_meta_request_params', 99, 2 );  

Используя это, я могу использовать следующий запрос: wp-json/wp/v2/course?search=amp;per_page=100amp;course_type=non_subsidized

К сожалению, здесь нет фильтрации course_type для non_subsidized .

Это создает совершенно точный запрос WP с использованием meta_query .

 'meta_query' =gt;   array (size=2)  'relation' =gt; string 'AND' (length=3)  0 =gt;   array (size=3)  'key' =gt; string 'course_type' (length=11)  'value' =gt; string 'non_subsidized' (length=14)  'compare' =gt; string '=' (length=1)  

Но по какой-то причине API REST WordPress не подтверждает этот meta_query параметр.

Использование meta_key и meta_value вместо meta_query этого работает нормально. Но я не могу комбинировать разные параметры с помощью meta_key и meta_value , поэтому я должен использовать meta_query .

Кто-нибудь знает, почему это не работает в WordPress 5.7 и 5.8?

Ответ №1:

Я нашел проблему. Я добавил дополнительный meta_query для заказа сообщений с помощью pre_get_posts .

Там все meta_query было переписано. Вместо того, чтобы перезаписывать его, я объединил существующее meta_query , и теперь оно работает.

 $meta_query = $query-gt;get('meta_query'); $meta_query_order = array(  'order_course_date' =gt; array(  'key' =gt; 'course_date_start',  'value' =gt; date("Ymdhi"),  'compare' =gt; 'lt;='  ) ); if (is_array($meta_query)) {  $meta_query_new = array_merge($meta_query, $meta_query_order); } else {  $meta_query_new = $meta_query_order; }  $query-gt;set('meta_query', $meta_query_new); $query-gt;set('orderby', 'order_course_date'); $query-gt;set('order', 'ASC');