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>
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top