Meta tags, taxonomy term и Views

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 16 декабря 2011 в 4:04

"Это термины таксономии, а это вьюхи, которые выводят термины таксономии, а это метатеги, которые не хотят выводиться в терминах таксономии, которые выводятся вьюхами.."

Существует уже много тем по этой проблеме:
http://www.drupal.ru/node/67860
http://www.drupal.ru/node/63621
http://www.drupal.ru/node/40720
http://www.drupal.ru/node/21670
и т.п.

Поэтому, для тех, кто не нашел решения предлагаю, а для тех, кто разобрался прошу обсудить следующее решение:

Вбить в шапку вьюхи код, который будет самостоятельно доставать из базы данных нужные метатеги и записывать их куда надо.

<?php
function add_metatag($name, $content){
           $meta = array(
                '#type' => 'html_tag',
                '#tag' => 'meta',
                '#attributes' => array(
                    'name' => $name,
                    'content' => $content,
                )
            );
      drupal_add_html_head($meta, 'meta_'.$name);
}

$enitity_id=arg(2);
$enitity_type=arg(0)."_".arg(1);

$metatags = db_query("SELECT entity_id, data FROM {metatag} WHERE entity_type = :type AND entity_id = :ids", array(
      ':type' => $enitity_type,
      ':ids' => $enitity_id,
    )
)->fetchAllKeyed();

$metatags = array_map('unserialize', $metatags);
//dsm($metatags);

if(count($metatags["$enitity_id"]) > 0){

   if(isset($metatags["$enitity_id"]["description"])){
           add_metatag("description", $metatags["$enitity_id"]["description"]);
   }
   if(isset($metatags["$enitity_id"]["keywords"])){
       add_metatag("keywords", $metatags["$enitity_id"]["keywords"]);
   }

   //к сожалению, тайтлы так и не заработали(((
   if(isset($metatags["$enitity_id"]["title"])){
           //drupal_set_title($metatags["$enitity_id"]["title"]["value"]);
           //variable_set("head_title", $metatags["$enitity_id"]["title"]["value"]);
   }
}
?>

Либо, если, например, как у меня, все термины таксономии выводятся через вьюхи, и надо каким-то макаром все-таки добавить этот проклятый тайтл, то менять template.php

function add_my_metatag($name, $content){
    $meta = array(
        '#type' => 'html_tag',
        '#tag' => 'meta',
        '#attributes' => array(
            'name' => $name,
            'content' => $content,
        )
    );
       
    drupal_add_html_head($meta, 'meta_'.$name);
}

       
       
function altroco_preprocess_html(&$vars) {

if(arg(0)=="taxonomy" && arg(1)=="term"){
 
$enitity_id=arg(2);
$enitity_type=arg(0)."_".arg(1);

$metatags = db_query("SELECT entity_id, data FROM {metatag} WHERE entity_type = :type AND entity_id = :ids", array(
      ':type' => $enitity_type,
      ':ids' => $enitity_id,
    )
)->fetchAllKeyed();

$metatags = array_map('unserialize', $metatags);
//dsm($metatags);

if(count($metatags["$enitity_id"]) > 0){

   if(isset($metatags["$enitity_id"]["description"])){
           add_my_metatag("description", $metatags["$enitity_id"]["description"]);
   }
   if(isset($metatags["$enitity_id"]["keywords"])){
       add_my_metatag("keywords", $metatags["$enitity_id"]["keywords"]);
   }

   if(isset($metatags["$enitity_id"]["title"])){
 
           //работает)
           $vars['head_title'] = $metatags["$enitity_id"]["title"]["value"];

           //не работает(
           //drupal_set_title($metatags["$enitity_id"]["title"]["value"]);
           //variable_set("head_title", $metatags["$enitity_id"]["title"]["value"]);
   }
}
}
}

Буду рад любым замечаниям, спасибо.

0 Thanks

Комментарии

Аватар пользователя Erly Erly 17 декабря 2011 в 21:14

Проанализировал, значит Vaplas, что люди по этому поводу пишут. Понял, что не всё так просто, нашёл своё решение и всех известил.
Планомерный подход.
Уважаю. Респект!

Ваше решение, Vaplas, хорошее.

Но, имеет недостаток - содержимое метатегов берётся из таксономии. А что если мы вовыдим объекты, к которым не прикреплены термины таксономии... (ну мало ли что мы там выводим - юзеров или, быть может, какие то "объекты" и т.д. и т.п.). Кроме того бывает так, что термины тасономии одни, а метатеги надо подставить другие.

Хочется так: есть вьюха (тип страница), там поля: ключевые слова, описание. Вбиваешь и всё ОК.
Даже то, как реализовано в nodewords для D6 - не очень удобно. Т.к. у страницы вьюхи есть адрес, и в nodewords метатеги привязываются к адресу. Приходится посмотреть адрес вьюхи, потом пойти в nodewords, там найти этот адрес, и отредактировать метатег.

Я, со своей стороны, ищу такое решение:
в "заголовок" вьюхи, добавить сниппет с php-кодом, где устанавливать метатеги.
Есть как бы решение:


<?php 
$meta 
= array (
  
'#theme' => 'metatag',
  
'#tag' => 'meta',
  
'#id' => 'metatag_keywords',
  
'#name' => 'keywords',
  
'#value' => 'ключевики!!!!!!!!!!!!!!!!!!!',
            
'#type' => 'html_tag',
        );
 
drupal_add_html_head($meta'meta_keywords');

?>
 

Но у него есть недостаток - если у нас установлен модуль metatag, в котором установлены глобальные настройки, то keywords выводятся два раза: один раз от модуля metatag, второй раз из моего сниппета.

Т.о. в коде вьюхи надо как то обнулять (или перезатирать) метатеги от глобальных настроек... А вот как это сделать - я пока не понял...

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 18 декабря 2011 в 3:24

Большое спасибо за добрые слова! Прям бальзам) А то на какой-то момент показалось что это и не интересно никому(.

"Но, имеет недостаток - содержимое метатегов берётся из таксономии."
Ну как сказать, на самом деле только для них и делал) Просто еще боюсь глобальных идей, научиться хотя бы по мелочам расправляться для начала ;) Но не думаю, что будет проблематично применить и для других типов материалов, ведь в базе данных у модуля metatag все разложено по названию типа материала и его номеру.

Кроме того бывает так, что термины тасономии одни, а метатеги надо подставить другие.

Не очень понял если честно) Metatag добавляет для каждого термина поля, и зачем туда вписывать значения, которые потом не надо подставлять?) (просто не понимаю вопроса, поэтому пока такие рассуждения)

Даже то, как реализовано в nodewords для D6 - не очень удобно. Т.к. у страницы вьюхи есть адрес, и в nodewords метатеги привязываются к адресу.
Для 7-ой там можно с помощью meta tags quick, но мне тоже не нравится такие танцы

Т.о. в коде вьюхи надо как то обнулять (или перезатирать) метатеги от глобальных настроек... А вот как это сделать - я пока не понял...

Кажется так добавляется только "глобальное-глобальное" правило. Т.е. действующее для всех типов материалов. Если keywords установить только в глобальных правилах для отдельных типов, то они затераются.

Узнать из вьюшки о глобальных настройках не сложно:

metatag_metatags_view('global', array());

или так

metatag_config_load_with_defaults('global');

а вот как их изменить, тоже не знаю)

Могу пока предложить вариант: template.php с использованием хука изменения страницы:

function ТЕМА_page_alter(&$page) {

   if(isset($page['content']['metatags'])){
        $metaGlobal = &$page['content']['metatags'];
        $metaAdd = drupal_add_html_head();

        if( isset($metaGlobal['global']) &&
            isset($metaGlobal['global']['keywords']) &&
            isset($metaAdd['meta_keywords'])
          ){
                $metaGlobal['global']['keywords'];
                unset($metaGlobal['global']['keywords']);              
        }
     }
}

т.е. проверить, если keywords есть и там и там, то удалить глобальный

Аватар пользователя simon_db simon_db 9 января 2012 в 17:39

Здравствуйте. Вы не могли бы подсказать куда именно вставляется Ваш код. Просто у меня похожая проблема.
Попробовав вставить ваш код в свой template.php я словил ошибку "Fatal error: Cannot redeclare main_preprocess_html() (previously declared in /home/gvsby/public_html/sites/all/themes/main/template.php:6) in /home/gvsby/public_html/sites/all/themes/main/template.php on line 259".

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 9 января 2012 в 20:59

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

Аватар пользователя simon_db simon_db 10 января 2012 в 16:45

Спасибо, Ваш метод мне очень помог! )))
P.S. А почему у Вас в SQL запросе имя таблицы в фигурных скобках. Если бы запись была {$metatag} было бы все понятно.

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 10 января 2012 в 19:42
simon_db wrote:

Спасибо, Ваш метод мне очень помог! )))
P.S. А почему у Вас в SQL запросе имя таблицы в фигурных скобках. Если бы запись была {$metatag} было бы все понятно.

Всегда пожалуйста)

P.S. Когда возникла эта проблема, я не знал что нужно написать, чтобы раздобыть данные о метатегах. Но зато точно знал кто знает - сами разработчики этого модуля (CTRL+C|V). Но кажется, фигурные скобки - это хороший стиль, так что норм)

Аватар пользователя Goobkabob Goobkabob 13 февраля 2012 в 19:55

Помогите нубу. Не могли бы Вы детально описать пути куда прописывать ключевые слова и описание. Уже перепробовал несколько методов, но ничего не выходит. Сайт http://maminopravo.com

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 13 февраля 2012 в 20:07

Могли бы, но сначала детально опишите несколько методов которые перепробовали.

Аватар пользователя Goobkabob Goobkabob 13 февраля 2012 в 20:15

1.Заходил в Meta tags (quick) settings, ставил везде птички, потом прописывал ключевы слова во вкладке Управление полями
2. Еще где-то вычитал, что можно через создание блоков прописать и ключевые слова и описание.

Аватар пользователя g78knl6cvxf0 g78knl6cvxf0 13 февраля 2012 в 20:30

Meta tags quick и Meta tags разные вещи. И здесь Meta tags quick не курят, а колются Meta tags.

Для этого его нужно его установить и при создании материала выбрать нужную вкладку

где и указать все что нужно.

Для простых материалов больше делать ничего не нужно. Проблемы возникают при выводе терминов таксономии через views, для решения которых и создавалась тема.

Аватар пользователя vitiok78 vitiok78 7 апреля 2012 в 2:47

Вот такое дополнение для удаления дублирования кейвордов и дескрипшнов из глобальных настроек заработало у меня в template.php

function ТЕМА_html_head_alter(&$head_elements) {
  if (isset($head_elements['meta_description']) &&
      isset($head_elements['metatag_description']))
    {
      unset($head_elements['metatag_description']); // Убираем глобальный дескрипшн
    }
  if (isset($head_elements['meta_keywords']) &&
      isset($head_elements['metatag_keywords']))
    {
      unset($head_elements['metatag_keywords']); // Убираем глобальные кейворды
    }
}
Аватар пользователя whiesam whiesam 3 октября 2012 в 19:54

Использую тему adaptivetheme (subtheme). Термины таксономии выводятся через вьюшку (встроенную). В template.php этот код не подставить. Подскажите как можно тут извернуться?

Аватар пользователя vitiok78 vitiok78 3 октября 2012 в 23:57

Тогда создайте свой модуль и используйте в нем код:

function ИМЯМОДУЛЯ_html_head_alter(&$head_elements) {
  if (isset($head_elements['meta_description']) &&
      isset($head_elements['metatag_description']))
    {
      unset($head_elements['metatag_description']); // Убираем глобальный дескрипшн
    }
  if (isset($head_elements['meta_keywords']) &&
      isset($head_elements['metatag_keywords']))
    {
      unset($head_elements['metatag_keywords']); // Убираем глобальные кейворды
    }
}

Сам не проверял, но вроде должно работать.

Аватар пользователя qvazar qvazar 4 июня 2013 в 4:53

к сожаления мне как не php прогеру это не осилить, вопрос актуален к drupal 6

Аватар пользователя whiesam whiesam 4 июня 2013 в 9:54

В Drupal 7 теперь все нормально работает, мб и на 6ку обновления модуля сделали, если нет, то и наврятли...

Аватар пользователя qvazar qvazar 10 июня 2013 в 0:28

whiesam, уважаемый! Это вы про какой именно модуль говорите? мне D7 так же актуально

Аватар пользователя whiesam whiesam 10 июня 2013 в 12:35
"qvazar" wrote:

whiesam, уважаемый! Это вы про какой именно модуль говорите? мне D7 так же актуально

После обновы модуль metatag начал вести себя адекватно, теперь все работает. Ну и плюсом надо было вьюшки через Taxonomy Display выводить.