You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Magento 2开启Full Page Cache时,如何获取商品页面的商品ID?

解决FPC开启后无法获取当前商品ID的问题

以下是几种适配FPC环境的可行方案:

1. 从请求参数直接提取

商品页面URL通常会携带商品ID参数(如product_id或id),可直接从请求对象获取,不受FPC缓存影响:

// Magento 2示例
$productId = $this->getRequest()->getParam('product_id');
// 兼容不同参数名的情况
$productId = $this->getRequest()->getParam('id') ?? $this->getRequest()->getParam('product_id');

2. 从全局注册表获取当前商品实例

Magento在商品页面会将当前商品注册到全局注册表中,若在非缓存区块或动态渲染区域使用,可直接调用:

// Magento 2示例
$product = \Magento\Framework\App\ObjectManager::getInstance()
    ->get(\Magento\Framework\Registry::class)
    ->registry('current_product');
if ($product) {
    $productId = $product->getId();
}

注意:若在完全缓存的静态区块中使用,需将该区块设置为非缓存或通过**ESI(Edge Side Includes)**实现动态渲染。

3. 异步Ajax请求获取(彻底兼容FPC)

如果上述方法受限于缓存区域,可通过前端Ajax请求后端接口获取商品ID,完全避开FPC缓存影响:

  • 前端代码示例:
fetch('/get-current-product-id')
    .then(response => response.json())
    .then(data => {
        const productId = data.product_id;
        // 后续业务逻辑处理
    });
  • 后端接口(Magento 2控制器示例):
namespace Vendor\Module\Controller\Index;

use Magento\Framework\App\Action\HttpGetActionInterface;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Framework\Registry;

class GetCurrentProductId implements HttpGetActionInterface
{
    protected $resultJsonFactory;
    protected $registry;

    public function __construct(
        JsonFactory $resultJsonFactory,
        Registry $registry
    ) {
        $this->resultJsonFactory = $resultJsonFactory;
        $this->registry = $registry;
    }

    public function execute()
    {
        $productId = null;
        $product = $this->registry->registry('current_product');
        if ($product) {
            $productId = $product->getId();
        }
        return $this->resultJsonFactory->create()->setData(['product_id' => $productId]);
    }
}

内容的提问来源于stack exchange,提问作者Maxime G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:30:57