#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');