我尝试创建一个扩展程序,在shopify的管理产品页面中添加2个字段,以便添加元数据。
我知道那里有一些扩展,比如ShopifyFD和CustomFields,但我的确非常非常简单,我绝不会试图复制它,这对我的shopify商店来说非常习惯。
我想要的只是向页面添加2个特定的元字段,并在单击按钮保存时保存。
那就是说,一切都已经有效了,但我在POST / PUT期间遇到了问题。它保持返回状态' 303 See Other' 并将我重定向到登录,这是我在开头引用的两个扩展中都没有遇到的行为。我想知道我使用的方法是问题还是其他问题,所以我可以为您提供帮助。
这里的标题如何:
Request URL:https://mywebsite.myshopify.com/admin/products/461395295/metafields/9911129091.json
Request Method:PUT
Status Code:303 See Other
Remote Address:23.227.38.70:443
就像我提到的那样,我使用了不同的方法ShopifyFD或CustomFields,而不是加载脚本,我使用内容脚本。
这里我的清单如何:
"content_scripts": [
{
"all_frames": true,
"matches": [
"https://*.myshopify.com/admin/products/*"
],
"run_at": "document_end",
"js": [
"scripts/vendors/jquery.js",
"scripts/vendors/handlebars-v3.0.0.js",
"scripts/vendors/handlebars-helpers.js",
"scripts/utils.js",
"scripts/shopify-product-addon.js"
]
}
]
1 - 我用新的替换当前的Save按钮,这样我就可以在提交本机表单之前保存元字段 2 - 我将POST / PUT方法附加到我已替换的新保存按钮
这里我的帖子/看起来如何:
注意:记录是我保存的值。
var metaJSON;
if (record.update) {
metaJSON = {
'metafield': {
'id': record.metafield_id,
'value': record.value,
'value_type': record.value_type
}
}
method = 'PUT';
url = '/admin/' + route_url + '/metafields/' + record.metafield_id + '.json';
} else {
metaJSON = {
'metafield': {
'namespace': record.namespace,
'key': record.key,
'value': record.value,
'value_type': record.value_type
}
};
url = '/admin/' + route_url + '/metafields.json';
method = 'POST';
}
$.ajax({
type: method,
url: url,
data: metaJSON,
dataType: 'json',
success: function(d) {
console.log('SUCCESS');
},
error: function(d) {
console.log('ERROR');
}
});
问题在于它每次都失败了。我想知道出了什么问题。我正在使用的方法是什么?
我正在做ShopifyFD,就像发布/放入ajax api一样,只是不确定缺少什么。我发现的唯一区别是ShopifyFD上有一个cookie设置为 request_method = PUT 或 request_method = POST 。我不知道这个cookie是如何设置的,因为它不在脚本上。我甚至尝试手动设置它,但它不起作用。
正如你所看到的,我已经尝试了很多东西。
还有其他人有其他建议吗?! :P
由于
答案 0 :(得分:0)
我没有弄清楚为什么ShopifyFD会起作用,我真的很想了解你,但我找到了另一种让它工作的方法。
您需要在请求标头之前设置CSRF令牌。
像魅力一样!
$.ajax({
type: method,
url: url,
data: metaJSON,
beforeSend: function (request) {
var token = $("meta[name=csrf-token]").attr('content');
request.setRequestHeader("X-CSRF-Token", token);
},
.
.
.