[ 'type' => 'String', 'description' => static function () { return __( 'Limit results to those matching a string.', 'graphql-for-ecommerce' ); }, ], 'exclude' => [ 'type' => [ 'list_of' => 'Int' ], 'description' => static function () { return __( 'Ensure result set excludes specific IDs.', 'graphql-for-ecommerce' ); }, ], 'include' => [ 'type' => [ 'list_of' => 'Int' ], 'description' => static function () { return __( 'Limit result set to specific ids.', 'graphql-for-ecommerce' ); }, ], 'orderby' => [ 'type' => [ 'list_of' => 'PostTypeOrderbyInput' ], 'description' => static function () { return __( 'What paramater to use to order the objects by.', 'graphql-for-ecommerce' ); }, ], 'dateQuery' => [ 'type' => 'DateQueryInput', 'description' => static function () { return __( 'Filter the connection based on dates.', 'graphql-for-ecommerce' ); }, ], 'parent' => [ 'type' => 'Int', 'description' => static function () { return __( 'Use ID to return only children. Use 0 to return only top-level items.', 'graphql-for-ecommerce' ); }, ], 'parentIn' => [ 'type' => [ 'list_of' => 'Int' ], 'description' => static function () { return __( 'Specify objects whose parent is in an array.', 'graphql-for-ecommerce' ); }, ], 'parentNotIn' => [ 'type' => [ 'list_of' => 'Int' ], 'description' => static function () { return __( 'Specify objects whose parent is not in an array.', 'graphql-for-ecommerce' ); }, ], ]; } /** * Sanitizes common post-type connection query input. * * @param array $input Input to be sanitize. * @param array $ordering_meta Meta types used for ordering results. * * @return array */ function map_shared_input_fields_to_wp_query( array $input, $ordering_meta = [] ) { $args = []; if ( ! empty( $input['include'] ) ) { $args['post__in'] = $input['include']; } if ( ! empty( $input['exclude'] ) ) { $args['post__not_in'] = $input['exclude']; } if ( ! empty( $input['parent'] ) ) { $args['post_parent'] = $input['parent']; } if ( ! empty( $input['parentIn'] ) ) { $args['post_parent__in'] = $input['parentIn']; } if ( ! empty( $input['parentNotIn'] ) ) { $args['post_parent__not_in'] = $input['parentNotIn']; } if ( ! empty( $input['search'] ) ) { $args['s'] = $input['search']; } /** * Map the orderby inputArgs to the WP_Query */ if ( ! empty( $input['orderby'] ) && is_array( $input['orderby'] ) ) { $args['orderby'] = []; foreach ( $input['orderby'] as $orderby_input ) { /** * Stores orderby field * * @var null|string $orderby_field */ $orderby_field = isset( $orderby_input['field'] ) ? (string) $orderby_input['field'] : null; if ( null === $orderby_field ) { continue; } $default_order = 'ASC'; /** * Stores orderby direction * * @var string $orderby_order */ $orderby_order = isset( $orderby_input['order'] ) ? $orderby_input['order'] : $default_order; /** * These orderby options should not include the order parameter. */ $post_fields = [ 'post__in', 'post_name__in', 'post_parent__in' ]; if ( in_array( $orderby_field, $post_fields, true ) ) { $args['orderby'][ $orderby_field ] = $orderby_order; // Handle meta fields. } elseif ( in_array( $orderby_field, $ordering_meta, true ) ) { $args['orderby']['meta_value_num'] = $orderby_order; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key $args['meta_key'] = $orderby_field; } else { $args['orderby'][ $orderby_field ] = $orderby_order; } }//end foreach }//end if if ( ! empty( $input['dateQuery'] ) ) { $args['date_query'] = $input['dateQuery']; } return $args; }