Проблема с открытым графом в Magento
-
12-12-2019 - |
Вопрос
При создании расширения Open Graph в Magento я столкнулся с проблемой: хотя мой метатег верен, Facebook не может уловить мой тег og, потому что перед моим мета/ог-тегом слишком много кода.
Кто-нибудь еще сталкивался с этим и есть ли у вас какие-либо предложения?
<reference name="head">
<block type="catalog/product_view" name="product.opengraph">
<action method="setTemplate">
<template>socialtag/opengraph_product.phtml</template>
</action>
</block>
</reference>
Решение
Вот альтернативное решение.Это не приятно и должно считаться взлом.Это также происходит против целей системы макета Magento.Тем не менее, если ваша требование не переопределить шаблон базовой головки, затем попробуйте:
В вашем модуле Config XML добавьте следующее событие:
.
...
<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>
...
, а затем вы бы создали класс наблюдателя, чтобы соответствовать:
.
<?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);
}
}
До сих пор, насколько я вижу, это только способ решить вашу проблему.Ни стоковые головки, ни его базовый шаблон не приносят положения для добавления тегов meta
выше его вызова для ребенка HTML.
Другие советы
Я не уверен, что именно рендеринг в голове толкает ваши метатеги так далеко вниз, и я не видел в этом проблемы (за исключением «эмпирического правила», которое гласит, что метатеги следует размещать как можно выше в HEAD
).
В любом случае вы можете попробовать следующее:
<reference name="head">
<block type="catalog/product_view" name="product.opengraph" before="-">
<action method="setTemplate">
<template>socialtag/opengraph_product.phtml</template>
</action>
</block>
</reference>
Обратите внимание на before="-"
атрибут.Это будет обнаружено во время генерации блока (см. Mage_Core_Model_Layout::_generateBlock
) и вставлен наверх стека родительского блока (см. Mage_Core_Block_Abstract::insert
).
К сожалению, это само по себе не решит вашу проблему, поскольку стандартный шаблон головы Magento не отображает дочерние элементы в отсортированном порядке.Поэтому вам придется самостоятельно переопределить этот шаблон и принудительно установить флаг сортировки.
Для этого измените шаблон головы через XML-макет:
<reference name="head">
<action method="setTemplate">
<template>your/module/head.phtml</template>
</action>
</reference>
И в этом шаблоне визуализируйте дочерний HTML следующим образом:
<?php echo $this->getChildHtml('', true, true) ?>
Где третий аргумент — это флаг сортировки, который сообщает блоку отображать дочерние элементы в соответствии с вашим управляемым порядком.Это поднимет ваш блок наверх.
Кстати, поскольку вам в любом случае придется пройти через все эти проблемы, чтобы расширить шаблон головы, вы также можете захотеть увеличить рендеринг дочернего элемента в верхней части шаблона (над CSS/JS).
БОНУС:
Почему вы используете catalog/product_view
блокировать?См. это расширение для хорошего шаблона для сравнения вашего кода: https://github.com/thaddeusmt/magento-fb-opengraph/ -- их реализация охватывает теги OG, а не только продукты.