无法通过PHP向Shopify的product.json添加应用块问题求助
问题排查:通过PHP代码向Shopify产品模板添加应用块失败
问题背景
已推送并创建版本的Theme App Extension,手动编辑主题时可正常看到应用块,但通过PHP代码修改templates/product.json添加该块后,商品页面无效果,且模板文件中未出现新增块;但删除现有非自定义块的操作可成功执行。需求是在产品模板的价格块后添加该应用块。
Theme App Extension代码
<span style="color: {{ block.settings.color }}"> Hello world </span> {% schema %} { "name": "Hello World", "target": "section", "stylesheet": "app.css", "javascript": "app.js", "settings": [ { "label": "Color", "id": "color", "type": "color", "default": "#000000" } ] } {% endschema %}
执行的PHP代码
$user = User::where('store', $this->store)->first(); $headers = array('X-Shopify-Access-Token: ' . $user->access_token,'Content-Type: application/json', 'Accept: application/json'); $config = array( 'ShopUrl' => $this->store, 'AccessToken' => $user->access_token, ); PHPShopify\ShopifySDK::config($config); $shopify = new PHPShopify\ShopifySDK; // 获取店铺主题 $themes = $shopify->Theme->get(); foreach ($themes as $theme) { if ($theme['role'] === 'main') { $theme_id = $theme['id']; } } // 获取product.json模板 $assets = $shopify->Theme($theme_id)->Asset->get(["asset[key]" => "templates/product.json"]); $product_json = json_decode($assets['asset']['value']); // 添加应用块 $product_json->sections->main->blocks->{"d8a2f128-c540-411d-adb6-bb5e0ae9aea1"} = (object) [ 'type' => 'shopify://apps/product-reviews/blocks/product_reviews/7ef9607f-87c1-495e-b328-40a9baa6d672', 'settings' => (object) [ 'color' => 3 ] ]; // 在价格块后插入新块 foreach ($product_json->sections->main->block_order as $k => $v) { if ($v === 'price') { $output = array_splice( $product_json->sections->main->block_order, $k + 1, 0, (object) array("d8a2f128-c540-411d-adb6-bb5e0ae9aea1") ); } } // 提交修改 $replace = [ 'asset' => [ 'key' => 'templates/product.json', 'value' => json_encode($product_json) ]]; $ch = curl_init("https://$user->store/admin/api/2022-10/themes/$theme_id/assets.json"); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($replace)); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($ch);
收到的API成功响应
{"asset":{"key":"templates/product.json","public_url":null,"created_at":"2022-10-23T20:45:31+03:00","updated_at":"2022-11-10T23:11:48+02:00","content_type":"application/json","size":5486,"checksum":"49020edbf9140badaae714935705f800","theme_id":136707506477,"warnings":[]}}
问题排查与修复方案
核心错误点
- Block ID传递格式错误:
array_splice中传递了对象类型的ID,但block_order是字符串数组,需直接传入字符串ID。 - Settings参数格式不匹配:Theme App Extension中
color是颜色类型,需传入十六进制颜色值(如#ff0000),而非数字3。 - JSON编码缺失必要参数:默认
json_encode可能导致结构序列化异常,需添加格式化参数保证结构正确。
修正后的关键代码片段
$blockId = "d8a2f128-c540-411d-adb6-bb5e0ae9aea1"; // 修正应用块的settings格式 $product_json->sections->main->blocks->$blockId = (object) [ 'type' => 'shopify://apps/product-reviews/blocks/product_reviews/7ef9607f-87c1-495e-b328-40a9baa6d672', 'settings' => (object) [ 'color' => "#ff0000" // 改为符合要求的颜色格式 ] ]; // 修正block_order的插入逻辑,传入字符串ID并避免重复添加 foreach ($product_json->sections->main->block_order as $k => $v) { if ($v === 'price') { array_splice( $product_json->sections->main->block_order, $k + 1, 0, $blockId // 直接传入字符串ID ); break; // 找到price块后跳出循环,防止重复插入 } } // 修正JSON编码参数 $replace = [ 'asset' => [ 'key' => 'templates/product.json', 'value' => json_encode($product_json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) ]];
额外验证步骤
- 修改完成后重新获取
templates/product.json,检查blocks对象和block_order数组是否正确包含新增块。 - 确认使用的Shopify API版本(2022-10)支持该操作,建议使用较新的稳定版本。
- 检查主题的产品section schema,确认是否允许添加第三方应用块(手动可添加则大概率支持,但需确保type路径完全正确)。
内容的提问来源于stack exchange,提问作者Grigor Borisov
相关产品推荐
相关产品推荐

