Problema de cache de widget da lista de produtos Magento2 - os preços não recarregam
-
29-09-2020 - |
Pergunta
Eu tenho um widget de lista de produtos inserido na área de conteúdo da página inicial de uma loja magento 2.O widget é inserido usando o seguinte código:
{{widget type="Magento\CatalogWidget\Block\Product\ProductsList" products_count="12" template="product/widget/content/grid.phtml" conditions_encoded="a:2:[i:1;a:4:[s:4:`type`;s:50:`Magento|CatalogWidget|Model|Rule|Condition|Combine`;s:10:`aggregator`;s:3:`all`;s:5:`value`;s:1:`1`;s:9:`new_child`;s:0:``;]s:4:`1--1`;a:4:[s:4:`type`;s:50:`Magento|CatalogWidget|Model|Rule|Condition|Product`;s:9:`attribute`;s:12:`category_ids`;s:8:`operator`;s:2:`==`;s:5:`value`;s:2:`19`;]]"}}
Ao mudar o site para modo de produção, os preços dos produtos não são recarregados ao mudar de moeda.A recarga de preço funciona no modo de desenvolvedor e também nas páginas de categoria normais.Os preços são recarregados após atualizar o cache BLOCK_HTML no back-end, mas armazenarão em cache a moeda escolhida na primeira visualização da página.definir o TTL do cache de widgets como nulo não tem efeito.
Também tentei adicionar o widget via layout xml usando este código:
<referenceContainer name="content.bottom">
<block class="Magento\CatalogWidget\Block\Product\ProductsList" template="product/widget/content/grid2.phtml" cacheable="false"><!-- -->
<arguments>
<argument name="products_count" xsi:type="number">12</argument>
<argument name="conditions_encoded" xsi:type="string">a:2:[i:1;a:4:[s:4:`type`;s:50:`Magento|CatalogWidget|Model|Rule|Condition|Combine`;s:10:`aggregator`;s:3:`all`;s:5:`value`;s:1:`1`;s:9:`new_child`;s:0:``;]s:4:`1--1`;a:4:[s:4:`type`;s:50:`Magento|CatalogWidget|Model|Rule|Condition|Product`;s:9:`attribute`;s:12:`category_ids`;s:8:`operator`;s:2:`==`;s:5:`value`;s:2:`19`;]]</argument>
</arguments>
</block>
</referenceContainer>
Eu também tentei adicionar $this->_isScopePrivate = true;
para Magento\CatalogWidget\Block\Product\ProductsList::__construct()
que deveria forçar o carregamento do Ajax, mas sem sucesso.
Sugestões de como contornar isso, alguém?
Solução
Descobri:Adicionar um argumento cache_lifetime de xsi:type null resolveu o problema.Portanto, se você quiser adicionar um widget via layout.xml e quiser que ele seja independente do cache, faça o seguinte:
<referenceContainer name="content.bottom">
<block class="Magento\CatalogWidget\Block\Product\ProductsList" template="product/widget/content/grid2.phtml">
<arguments>
<argument name="products_count" xsi:type="number">12</argument>
<argument name="conditions_encoded" xsi:type="string">a:2:[i:1;a:4:[s:4:`type`;s:50:`Magento|CatalogWidget|Model|Rule|Condition|Combine`;s:10:`aggregator`;s:3:`all`;s:5:`value`;s:1:`1`;s:9:`new_child`;s:0:``;]s:4:`1--1`;a:4:[s:4:`type`;s:50:`Magento|CatalogWidget|Model|Rule|Condition|Product`;s:9:`attribute`;s:12:`category_ids`;s:8:`operator`;s:2:`==`;s:5:`value`;s:2:`19`;]]</argument>
<argument name="cache_lifetime" xsi:nil="true" xsi:type="null">null</argument>
</arguments>
</block>
</referenceContainer>
Outras dicas
Não tenho certeza se é um recurso adicionado desde que esta pergunta foi feita, mas há um "Vida útil do cache (segundos)" nos parâmetros quando você cria o widget como administrador.
Se você tiver várias moedas, parece ser necessário definir como 0, pois dura um dia por padrão.
Parece idiota que o widget não contenha o código para decidir se um cache diário ou nenhum cache seria a configuração padrão sensata - bastaria contar as moedas que estão sendo usadas para descobrir.
Além disso, você pode tentar cache_lifetime="1" no seu bloco, onde o widget é chamado.Algo como abaixo,
{{widget type="Magento\Catalog\Block\Product\Widget\NewWidget" cache_lifetime="1" display_type="all_products" products_count="8" template="Magento_Catalog::product/widget/new/content/new_grid.phtml"}}