Problema de Open Graph no Magento
-
12-12-2019 - |
Pergunta
Ao criar a extensão Open Graph no Magento, me deparei com um problema: embora minha metatag esteja correta, o Facebook não consegue capturar minha tag og porque há muito código antes da minha tag meta/og.
Alguém mais encontrou isso e você tem alguma sugestão?
<reference name="head">
<block type="catalog/product_view" name="product.opengraph">
<action method="setTemplate">
<template>socialtag/opengraph_product.phtml</template>
</action>
</block>
</reference>
Solução
Aqui está uma solução alternativa.Não é legal e deve ser considerado um hack.Também vai contra os propósitos do sistema de layout do Magento.No entanto, se o seu requerimento não é substituir o modelo de cabeçalho base, então tente isto:
Injetar conteúdo via Event Observer
No XML de configuração do seu módulo, adicione o seguinte evento:
...
<global>
...
<events>
<http_response_send_before>
<observers>
<head_modify>
<type>singleton</type>
<class>Namespace_Module_Model_Observer</class>
<method>injectOgTags</method>
</head_modify>
</observers>
</http_response_send_before>
</events>
...
</global>
...
E então você criaria uma classe observadora para corresponder:
<?php
class Namespace_Module_Model_Observer
extends Varien_Event_Observer
{
public function injectOgTags(Varien_Object $object)
{
$response = $object->getResponse();
$html = $response->getBody();
// Some logic for building up the appropriate meta tags
// based on URL or product or layout handles
$html = str_replace('<head>', '<head><meta property="og:title" content="Page title" />', $html);
$response->setBody($html);
}
}
Pelo que posso ver, esta é a única maneira de resolver o seu problema.Nem o bloco de estoque nem seu modelo base prevêem a adição meta
tags acima de sua chamada para HTML filho.
Outras dicas
Não tenho certeza do que exatamente está sendo renderizado na cabeça que empurra suas meta tags tão para baixo, nem vi isso ser um problema (exceto a "regra prática" que diz para colocar meta tags o mais alto possível no HEAD
).
Em qualquer caso, você pode tentar isto:
<reference name="head">
<block type="catalog/product_view" name="product.opengraph" before="-">
<action method="setTemplate">
<template>socialtag/opengraph_product.phtml</template>
</action>
</block>
</reference>
Observe o before="-"
atributo.Isso será detectado durante a geração do bloco (veja Mage_Core_Model_Layout::_generateBlock
) e inserido no topo da pilha do bloco pai (veja Mage_Core_Block_Abstract::insert
).
Infelizmente, isso por si só não resolverá o seu problema, já que o modelo de cabeçalho padrão do Magento não renderiza seus filhos em uma ordem de classificação.Portanto, você mesmo terá que substituir esse modelo e forçar o sinalizador de classificação.
Para fazer isso, altere o modelo de cabeçalho via XML de layout:
<reference name="head">
<action method="setTemplate">
<template>your/module/head.phtml</template>
</action>
</reference>
E nesse modelo renderize o HTML do seu filho assim:
<?php echo $this->getChildHtml('', true, true) ?>
Onde o terceiro argumento é o sinalizador de classificação que informa ao bloco para renderizar seus filhos de acordo com sua ordem gerenciada.Isso colocará seu bloco no topo.
Por outro lado, como você terá que passar por todo esse problema de qualquer maneira para estender o modelo head, você também pode querer aumentar a renderização filha perto do topo do modelo (acima do seu CSS/JS).
BÔNUS:
Por que você está aproveitando o catalog/product_view
bloquear?Veja esta extensão para obter um bom padrão para comparar seu código com: https://github.com/thaddeusmt/magento-fb-opengraph/ - sua implementação abrange tags OG além de apenas produtos.