diff --git a/vendor/magento/module-catalog-graph-ql/Plugin/ProductAttributeSortInput.php b/vendor/magento/module-catalog-graph-ql/Plugin/ProductAttributeSortInput.php
new file mode 100644
index 00000000000..d3458d6db15
--- /dev/null
+++ b/vendor/magento/module-catalog-graph-ql/Plugin/ProductAttributeSortInput.php
@@ -0,0 +1,156 @@
+request = $request;
+ $this->jsonSerializer = $jsonSerializer;
+ }
+ /**
+ * Plugin to preserve the original order of sort fields
+ *
+ * @param \Magento\Framework\GraphQl\Query\ResolverInterface $subject
+ * @param \Magento\Framework\GraphQl\Config\Element\Field $field
+ * @param ContextInterface $context
+ * @param ResolveInfo $info
+ * @param array|null $value
+ * @param array|null $args
+ * @return array
+ * @throws \Exception
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function beforeResolve(
+ \Magento\Framework\GraphQl\Query\ResolverInterface $subject,
+ \Magento\Framework\GraphQl\Config\Element\Field $field,
+ ContextInterface $context,
+ ResolveInfo $info,
+ array $value = null,
+ array $args = null
+ ): array {
+
+ $data = $this->getDataFromRequest($this->request);
+ if (isset($args['sort'])) {
+ $args['sort'] = $this->getSortFieldsOrder(
+ $info,
+ $args['sort'],
+ isset($data['variables']['sort']) ? array_keys($data['variables']['sort']) : null
+ );
+ }
+ return [$field, $context, $info, $value, $args];
+ }
+
+ /**
+ * Get data from request body or query string
+ *
+ * @param RequestInterface $request
+ * @return array
+ */
+ private function getDataFromRequest(RequestInterface $request): array
+ {
+ $data = [];
+ if ($request->isPost()) {
+ $data = $this->jsonSerializer->unserialize($request->getContent());
+ } elseif ($request->isGet()) {
+ $data = $request->getParams();
+ $data['variables'] = isset($data['variables']) ?
+ $this->jsonSerializer->unserialize($data['variables']) : null;
+ $data['variables'] = is_array($data['variables']) ?
+ $data['variables'] : null;
+ }
+ return $data;
+ }
+
+ /**
+ * Get sort fields in the original order
+ *
+ * @param ResolveInfo $info
+ * @param array $sortFields
+ * @param array|null $requestSortFields
+ * @return array
+ * @throws \Exception
+ */
+ private function getSortFieldsOrder(ResolveInfo $info, array $sortFields, ?array $requestSortFields): array
+ {
+ $sortFieldsOriginal = [];
+ Visitor::visit(
+ $info->operation,
+ [
+ 'enter' => [
+ NodeKind::ARGUMENT => function (Node $node) use (
+ &$sortFieldsOriginal,
+ $sortFields,
+ $requestSortFields
+ ) {
+ if ($node->name->value === 'sort') {
+ if (isset($requestSortFields)) {
+ foreach ($requestSortFields as $fieldName) {
+ if (isset($sortFields[$fieldName])) {
+ $sortFieldsOriginal[$fieldName] = $sortFields[$fieldName];
+ }
+ }
+ } else {
+ Visitor::visit(
+ $node->value,
+ [
+ 'enter' => [
+ NodeKind::OBJECT_FIELD =>
+ function (Node $node) use (&$sortFieldsOriginal, $sortFields) {
+ if (isset($sortFields[$node->name->value])) {
+ $sortFieldsOriginal[$node->name->value] =
+ $sortFields[$node->name->value];
+ }
+ }
+ ]
+ ]
+ );
+ }
+ return Visitor::stop();
+ }
+ }
+ ]
+ ]
+ );
+ return $sortFieldsOriginal;
+ }
+}
diff --git a/vendor/magento/module-catalog-graph-ql/etc/graphql/di.xml b/vendor/magento/module-catalog-graph-ql/etc/graphql/di.xml
index d66ee50ba03..a55ee59f4a0 100644
--- a/vendor/magento/module-catalog-graph-ql/etc/graphql/di.xml
+++ b/vendor/magento/module-catalog-graph-ql/etc/graphql/di.xml
@@ -208,4 +208,11 @@
+
+
+
+
+
+
+