"Это термины таксономии, а это вьюхи, которые выводят термины таксономии, а это метатеги, которые не хотят выводиться в терминах таксономии, которые выводятся вьюхами.."
Существует уже много тем по этой проблеме:
http://www.drupal.ru/node/67860
http://www.drupal.ru/node/63621
http://www.drupal.ru/node/40720
http://www.drupal.ru/node/21670
и т.п.
Поэтому, для тех, кто не нашел решения предлагаю, а для тех, кто разобрался прошу обсудить следующее решение:
Вбить в шапку вьюхи код, который будет самостоятельно доставать из базы данных нужные метатеги и записывать их куда надо.
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
$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"]);
}
}
}
}
Буду рад любым замечаниям, спасибо.
Комментарии
Проанализировал, значит 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, второй раз из моего сниппета.
Т.о. в коде вьюхи надо как то обнулять (или перезатирать) метатеги от глобальных настроек... А вот как это сделать - я пока не понял...
Большое спасибо за добрые слова! Прям бальзам) А то на какой-то момент показалось что это и не интересно никому(.
"Но, имеет недостаток - содержимое метатегов берётся из таксономии."
Ну как сказать, на самом деле только для них и делал) Просто еще боюсь глобальных идей, научиться хотя бы по мелочам расправляться для начала Но не думаю, что будет проблематично применить и для других типов материалов, ведь в базе данных у модуля metatag все разложено по названию типа материала и его номеру.
Кроме того бывает так, что термины тасономии одни, а метатеги надо подставить другие.
Не очень понял если честно) Metatag добавляет для каждого термина поля, и зачем туда вписывать значения, которые потом не надо подставлять?) (просто не понимаю вопроса, поэтому пока такие рассуждения)
Даже то, как реализовано в nodewords для D6 - не очень удобно. Т.к. у страницы вьюхи есть адрес, и в nodewords метатеги привязываются к адресу.
Для 7-ой там можно с помощью meta tags quick, но мне тоже не нравится такие танцы
Т.о. в коде вьюхи надо как то обнулять (или перезатирать) метатеги от глобальных настроек... А вот как это сделать - я пока не понял...
Кажется так добавляется только "глобальное-глобальное" правило. Т.е. действующее для всех типов материалов. Если keywords установить только в глобальных правилах для отдельных типов, то они затераются.
Узнать из вьюшки о глобальных настройках не сложно:
metatag_metatags_view('global', array());
или так
metatag_config_load_with_defaults('global');
а вот как их изменить, тоже не знаю)
Могу пока предложить вариант: template.php с использованием хука изменения страницы:
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 есть и там и там, то удалить глобальный
Здравствуйте. Вы не могли бы подсказать куда именно вставляется Ваш код. Просто у меня похожая проблема.
Попробовав вставить ваш код в свой 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".
в этой ошибке говорится лишь о том, что в template.php уже есть такая функция (хук). Двух быть не может, поэтому решите какую из них оставить и переместите в неё код из другой
Спасибо, Ваш метод мне очень помог! )))
P.S. А почему у Вас в SQL запросе имя таблицы в фигурных скобках. Если бы запись была {$metatag} было бы все понятно.
Всегда пожалуйста)
P.S. Когда возникла эта проблема, я не знал что нужно написать, чтобы раздобыть данные о метатегах. Но зато точно знал кто знает - сами разработчики этого модуля (CTRL+C|V). Но кажется, фигурные скобки - это хороший стиль, так что норм)
Помогите нубу. Не могли бы Вы детально описать пути куда прописывать ключевые слова и описание. Уже перепробовал несколько методов, но ничего не выходит. Сайт http://maminopravo.com
Могли бы, но сначала детально опишите несколько методов которые перепробовали.
1.Заходил в Meta tags (quick) settings, ставил везде птички, потом прописывал ключевы слова во вкладке Управление полями
2. Еще где-то вычитал, что можно через создание блоков прописать и ключевые слова и описание.
Meta tags quick и Meta tags разные вещи. И здесь Meta tags quick не курят, а колются Meta tags.
Для этого его нужно его установить и при создании материала выбрать нужную вкладку
где и указать все что нужно.
Для простых материалов больше делать ничего не нужно. Проблемы возникают при выводе терминов таксономии через views, для решения которых и создавалась тема.
Вот такое дополнение для удаления дублирования кейвордов и дескрипшнов из глобальных настроек заработало у меня в template.php
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']); // Убираем глобальные кейворды
}
}
Использую тему adaptivetheme (subtheme). Термины таксономии выводятся через вьюшку (встроенную). В template.php этот код не подставить. Подскажите как можно тут извернуться?
Тогда создайте свой модуль и используйте в нем код:
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']); // Убираем глобальные кейворды
}
}
Сам не проверял, но вроде должно работать.
Вот тут
http://drupal.org/node/1837660 написано решение.
Важно: модуль Metatag: Views выключить!
Это для 7-ки решение. В 6-ке без кодинга все работает.
к сожаления мне как не php прогеру это не осилить, вопрос актуален к drupal 6
В Drupal 7 теперь все нормально работает, мб и на 6ку обновления модуля сделали, если нет, то и наврятли...
whiesam, уважаемый! Это вы про какой именно модуль говорите? мне D7 так же актуально
После обновы модуль metatag начал вести себя адекватно, теперь все работает. Ну и плюсом надо было вьюшки через Taxonomy Display выводить.