按 acf 字段对 graphql 查询进行排序 - React Native / Wordpress
Sorting graphql query by acf field - React Native / Wordpress
致力于 graphQl、React Native、Wordpress 后端项目并努力寻找答案。
我收到一个查询,我想按 ACF 字段排序(或排序)。
我对 graphQl 很陌生,所以我不知道去哪里寻找或搜索什么(如果具体的话)
这是我的查询:
const queryAllEvent = <Query query={gql`
{posts(where: {categoryNotIn: "12"}) {
edges {
node {
id
featuredImage {
node {
sourceUrl
}
}
title
prix {
prix
}
content
date_event {
time
dateEvent
}
}
}
}
}
`}
我喜欢按 dateEvent 对其进行排序(或按我所说的排序)。
有线索吗?
不是专门找合适的答案,而是去哪里找。
对不起我的英语。
谢谢
好的,找了半天终于找到了!
答案在这里,谁愿意看呢!
首先,由于javascript和php日期是以毫秒和秒计算的,需要将日期选择器acf转换为正确的值。
/**
* Convert values of ACF core date time pickers from Y-m-d H:i:s to timestamp
* @param string $value unmodified value
* @param int $post_id post ID
* @param object $field field object
* @return string modified value
*/
function acf_save_as_timestamp( $value, $post_id, $field ) {
if( $value ) {
$value = strtotime( $value*1000 );
}
return $value;
}
add_filter( 'acf/update_value/type=date_time_picker', 'acf_save_as_timestamp', 10, 3 );
/**
* Convert values of ACF core date time pickers from timestamp to Y-m-d H:i:s
* @param string $value unmodified value
* @param int $post_id post ID
* @param object $field field object
* @return string modified value
*/
function acf_load_as_timestamp( $value, $post_id, $field ) {
if( $value ) {
$value = date( 'Y-m-d H:i:s', $value*1000 );
}
return $value;
}
add_filter( 'acf/load_value/type=date_time_picker', 'acf_load_as_timestamp', 10, 3 );
之后需要将您的字段添加到 graphql_PostObjectsConnectionOrderbyEnum_values & graphql_post_object_connection_query_args:
add_filter( 'graphql_PostObjectsConnectionOrderbyEnum_values', function( $values ) {
$values['STARTEVENT'] = [
'value' => 'startevent',
'description' => __( 'The date of startevent on the post', 'wp-graphql' ),
];
return $values;
} );
add_filter( 'graphql_post_object_connection_query_args', function( $query_args, $source, $input ) {
if ( isset( $input['where']['orderby'] ) && is_array( $input['where']['orderby'] ) ) {
foreach( $input['where']['orderby'] as $orderby ) {
if ( ! isset( $orderby['field'] ) || 'startevent' !== $orderby['field'] ) {
continue;
}
$query_args['meta_key'] = 'startevent';
$query_args['orderby'] = 'meta_value_num';
$query_args['order'] = $orderby['order'];
}
}
return $query_args;
}, 10, 3);
最后你的字段会出现在orderby上(我的字段是startevent)
Capture of result
致力于 graphQl、React Native、Wordpress 后端项目并努力寻找答案。 我收到一个查询,我想按 ACF 字段排序(或排序)。
我对 graphQl 很陌生,所以我不知道去哪里寻找或搜索什么(如果具体的话)
这是我的查询:
const queryAllEvent = <Query query={gql`
{posts(where: {categoryNotIn: "12"}) {
edges {
node {
id
featuredImage {
node {
sourceUrl
}
}
title
prix {
prix
}
content
date_event {
time
dateEvent
}
}
}
}
}
`}
我喜欢按 dateEvent 对其进行排序(或按我所说的排序)。
有线索吗?
不是专门找合适的答案,而是去哪里找。 对不起我的英语。
谢谢
好的,找了半天终于找到了! 答案在这里,谁愿意看呢!
首先,由于javascript和php日期是以毫秒和秒计算的,需要将日期选择器acf转换为正确的值。
/**
* Convert values of ACF core date time pickers from Y-m-d H:i:s to timestamp
* @param string $value unmodified value
* @param int $post_id post ID
* @param object $field field object
* @return string modified value
*/
function acf_save_as_timestamp( $value, $post_id, $field ) {
if( $value ) {
$value = strtotime( $value*1000 );
}
return $value;
}
add_filter( 'acf/update_value/type=date_time_picker', 'acf_save_as_timestamp', 10, 3 );
/**
* Convert values of ACF core date time pickers from timestamp to Y-m-d H:i:s
* @param string $value unmodified value
* @param int $post_id post ID
* @param object $field field object
* @return string modified value
*/
function acf_load_as_timestamp( $value, $post_id, $field ) {
if( $value ) {
$value = date( 'Y-m-d H:i:s', $value*1000 );
}
return $value;
}
add_filter( 'acf/load_value/type=date_time_picker', 'acf_load_as_timestamp', 10, 3 );
之后需要将您的字段添加到 graphql_PostObjectsConnectionOrderbyEnum_values & graphql_post_object_connection_query_args:
add_filter( 'graphql_PostObjectsConnectionOrderbyEnum_values', function( $values ) {
$values['STARTEVENT'] = [
'value' => 'startevent',
'description' => __( 'The date of startevent on the post', 'wp-graphql' ),
];
return $values;
} );
add_filter( 'graphql_post_object_connection_query_args', function( $query_args, $source, $input ) {
if ( isset( $input['where']['orderby'] ) && is_array( $input['where']['orderby'] ) ) {
foreach( $input['where']['orderby'] as $orderby ) {
if ( ! isset( $orderby['field'] ) || 'startevent' !== $orderby['field'] ) {
continue;
}
$query_args['meta_key'] = 'startevent';
$query_args['orderby'] = 'meta_value_num';
$query_args['order'] = $orderby['order'];
}
}
return $query_args;
}, 10, 3);
最后你的字段会出现在orderby上(我的字段是startevent)
Capture of result