Как я могу динамически устанавливать метатеги facebook?

У меня есть сайт opencart, и я пытаюсь настроить параметры обмена Facebook для своих продуктов.

Поскольку все загружается как отдельный модуль, я не могу установить метатеги facebook следующим образом (header.tpl):

<meta property="og:description" content="<?php echo $description; ?>" />

Поскольку $description не существует, пока загружается модуль header. Он создается в контроллере модуля product. Поэтому я попытался динамически изменить значение содержимого (product.tpl):

$("meta[property='og:description']").attr('content','<?php echo $description; ?>');

И это сработало, я вижу, что значение изменилось (в исходном коде страницы), затем я отладил моя страница, но я не смог получить значение. Думаю, я знаю причину, я должен установить значение перед загрузкой страницы, но я не уверен, как я могу это сделать. У вас есть идеи?


person Selman Genç    schedule 04.08.2014    source источник
comment
Наш сканер не запускает Javascript. Поэтому вы не можете изменить их с помощью Javascript   -  person WizKid    schedule 04.08.2014
comment
К сожалению, вам нужно будет проверить в контроллере заголовка, является ли отображаемая страница категорией, продуктом, информационной страницей или производителем, и в этих случаях загрузить соответствующие данные, которые затем будут заполнены в шаблоне. В шаблоне снова прослушайте переменную, представляющую такое состояние, чтобы соответствующим образом отобразить метатеги FB. К сожалению, нужно немного поработать.   -  person shadyyx    schedule 05.08.2014
comment
@shadyyx Я думал то же самое, но я надеялся, что есть другой способ ... кажется, его нет.   -  person Selman Genç    schedule 05.08.2014
comment
Ну, прямо сейчас я проверяю метод controller::render() и думаю, что вы могли бы преуспеть в передаче $this->data из render() в вызов getChild() - таким образом, с небольшими усилиями все данные из основного содержимого могут быть разделены между дочерними элементами (верхний и нижний колонтитулы, столбцы, ...). Затем вы сможете просто использовать эти переменные из основного контента, например. в вашем заголовке, чтобы проверить, присутствуют ли они, и если да, то визуализируйте метатеги FB... Это должно потребовать меньше усилий при программировании, но может привести к ненужному и нежелательному увеличению потребления памяти (возможно, лишь немного).   -  person shadyyx    schedule 05.08.2014
comment
@shadyyx У меня есть более простое решение, возможно, вы захотите взглянуть :)   -  person Selman Genç    schedule 21.09.2014


Ответы (1)


Вы можете использовать класс Document для добавления этих теги facebook (сколько хотите). Просто добавьте два дополнительных метода setFacebookDescription и getFacebookDescription, поэтому вам нужно добавить следующее:

<?php
class Document {
    private $facebook_description;

    public function getFacebookDescription() {
        return $this->facebook_description;
    }

    public function setFacebookDescription($facebook_description) {
        $this->facebook_description = $facebook_description;
    }
}

На каждом контроллере вы найдете в конце каждого метода вызов, который загружает заголовок Opencart, что-то вроде этого $data['header'] = $this->load->controller('common/header'); (пример). Обратите внимание, что он может отличаться от вашего, это зависит от версии Opencart.

Теперь в контроллере header.php вы добавляете:

<?php
class ControllerCommonHeader extends Controller {

    public function index() {
        $data['facebook_description'] = $this->document->getFacebookDescription();
    }
}

это получит переменную facebook_description и передаст ее в представление header.tpl. Затем добавьте теги facebook между тегами <head> в файле header.tpl:

<!DOCTYPE html>
<head>
    <?php if ($facebook_description != '') { ?><meta property="og:description" content="<?php echo $facebook_description; ?>" /><?php } ?>
</head>

Наконец, вы можете установить facebook_description в каждом контроллере, вызвав $this->document->setFacebookDescription('my description');.

Пример: в контроллере product.php вы добавляете

<?php
class ControllerProductProduct extends Controller {

    public function index() {

        // code...
        $this->document->setTitle($product_info['meta_title']);
        $this->document->setDescription($product_info['meta_description']);

        $this->document->setFacebookDescription($product_info['meta_description']);

        // the rest of the code...
    }
}

здесь вы устанавливаете $product_info['meta_description'] как тег описания facebook, однако вы также можете использовать $product_info['name'] или другую переменную.

Последнее примечание: вы можете изменить все системные классы Opencart с помощью vqmod.

person machineaddict    schedule 06.08.2014
comment
спасибо за ваше время и решение. это хорошая идея, я попробую это, как только смогу. кажется, это сработает, также его можно расширить для других метатегов, как вы сказали... - person Selman Genç; 06.08.2014