使用shopify插入产品

问题描述 投票:0回答:1

我正在尝试使用node js和graphql在shopify中添加带有rest api的curl产品。存在与产品描述部分相关的问题。

我以这种格式发送描述,它还包含 html 元素。 enter image description here

Graphql 查询 const { 解码 } = require('html-entities'); 静态create_simple_product(数据){

  let decoded_desc = decode(data.body_html);
 
  const prodQuery = `
    mutation {
      productCreate(
        input: {
          title: "${data.title}", 
          productType: "${data.product_type}", 
          vendor: "${data.vendor}",
          status:${statusData},
          bodyHtml: "${decoded_desc.replace(/"/g, '\\"')}",
          tags:"${typeof data.tags !== 'object' ? "" :  data.tags}",
          handle:"${data.handle}",
          seo: {description: "${data.seo_description}", title: "${data.seo_title}"},
          published:true
        }
        media: {originalSource: "${data.images[0]}", mediaContentType: IMAGE, alt: "${data.title}"}
      ) {
        product {
          id
          title
          bodyHtml
          description
          vendor
          productType
          createdAt
          updatedAt
          handle
          status
          totalInventory
          totalVariants
          tracksInventory
          variants(first: 50) {
            nodes {
              id
              inventoryItem {
                id
              }
              title
              price
              compareAtPrice
              createdAt
              updatedAt
              sku
              barcode
              weight
              weightUnit
              inventoryQuantity
              inventoryManagement
              position
              image {
                src
                id
                altText
              }
            }
          }
          options(first: 50) {
            id
            name
            position
            optionValues {
              name
              hasVariants
              id
            }
          }
          images(first: 100, sortKey: POSITION) {
            edges {
              node {
                id
                src
                altText
                height
                width
              }
            }
          }
          media(first: 100) {
            edges {
              node {
                id
                ... on MediaImage {
                  id
                  image {
                    src
                  }
                }
              }
            }
          }
        }
        userErrors {
          field
          message
        }
      }
    }
  `;
  return prodQuery;
}

我从 php 发送的 api 主体。

 $output_desc_prod = preg_replace('/<([^>]+)(\sstyle=(?P<stq>["\'])(.*)\k<stq>)([^<]*)>/iUs', '<$1$5>', $get_product_data->descriere_produs);
     
        $product_description = htmlentities($output_desc_prod); 
       

        $data_sf_prod = array(
            "api_key" => $site_data->api_key,
            "server_key" =>  $site_data->server_key,
            "title" =>  $get_product_data->nume_produs,
            "body_html" => $product_description,
            "vendor" => strtolower($site_data->den_site),
            "status" => "draft",
            "product_type" => "",
            "tags" => "",
            "images" => $array_images_final,
            "seo_description" => $getMetaData->md,
            "seo_title" => $getMetaData->mt,
            "price" => $priceSelector,
            "sku" => $get_product_data->cod_produs,
            "handle"=> $get_product_data->slug_produs,
            "barcode" =>  $get_product_data->ean === "" ? null : $get_product_data->ean,
            "weight" => 1,
            "weight_unit" => "",
            "compare_at_price" => $priceCompareSelector
        );

我使用htmlentities来消除任何问题,大多数情况下它可以工作,但是有些产品一旦插入就无法工作并显示以下错误。 创建简单的 ProductError:语法错误,[9, 25] 处出现意外的无效标记 (""")

php node.js graphql shopify codeigniter-3
1个回答
0
投票

这不一定是您所问问题的答案,但它可能会解决您的问题。请不要对 GraphQL 操作进行字符串插值。您应该将

query
variables
传递到后端。
query
将使用 GraphQL 变量引用,并且
variables
将是包含内容的 JSON 对象。

这有几个好处,包括:

  1. 持久查询:在构建时,您可以注册查询主体并获取哈希值。然后,当您发出 GraphQL 请求时,您只需发送哈希和变量。这减少了线上字节数,通常提高了应用程序的速度。
  2. 您不必担心字符串插值和引号(听起来您遇到的问题)。只要您可以正确地对您的部件进行 JSON 字符串化,您就不必担心最终结果也必须经过 JSON 字符串化。

您的

query

mutation CreateAProduct($productInput: ProductCreateInput!, $mediaInput: MediaCreateInput!) {
  productCreate(
    input: $productInput
    media: $mediaInput
  ) {
    # Whatever you want, or
    # ...thisCouldBeAFragment
}

你的

variables

const variables = {
  productInput: {
    title: data.title,
    productType: data.product_type,
    vendor: data.vendor,
    status: statusData,
    bodyHtml: data.description,
    tags: typeof data.tags !== 'object' ? "" :  data.tags,
    handle: data.handle,
    seo: {description: data.seo_description, title: data.seo_title},
    published: true
  },
  mediaInput: {
    originalSource: data.images[0],
    mediaContentType: "IMAGE",
    alt: data.title
  }
};

请注意,我刚刚使用了

data.description
。由于
variables
将贯穿
JSON.stringify
,因此您不必“手动弄清楚自己”如何使其作为请求正文的一部分工作。

© www.soinside.com 2019 - 2024. All rights reserved.