We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 3947
    • 8 Posts
    Хотя на сайтах MODx пишут про его чудесные SEO возможности, они, в реальности, ужасно неудобны.
    Явно разрабатывались человеком далеким (или удаленным) от SEO. Дружественные URL-ы тоже не сахар, и могли бы быть более дружественными. Но пока не про них.

    Короче, у меня вопрос к местным гуру и девелоперам -- можно ли сделать патч который бы позволял вписывать Keywords и Description для каждой страницы как, например, поле "Заголовок", таким же простым тектовым полем?
    Где-то отдельно вбивать киворды и дескрипшн, а потом выбирать их из списка -- безумная кривость, неудобно и долго, очень трудно управляемо. А при более-менее большом количестве страниц это вообще затруднительно использовать и не допускать ошибок.

    Keywords и Description такие же уникальные и равноправные поля для страницы как Заголовок и Содержимое. Их надо так же удобно редактировать. Пусть на отдельной вкладке, но как обычные текстовые поля.

    Может есть такой патч? Уверен, сделать его не сложно, а жизнь для seo-специалистов облегчит неимоверно и сделает эту CMS для них куда более привлекательной.

    Спасибо.
    • Привет! Добро пожаловать в сообщество MODx smiley
      Выбирать ключевые слова для каждой страницы из списка или вписывать их каждый раз отдельно - дело вкуса и.. личной лени smiley. Хотя соглашусь, что иногда более эффективно в плане продвижения в поисковиках записать ключевые слова в определенном порядке (меня раздражает иногда то, что нельзя управлять порядком выдачи ключевых слов, если выбираешь их из заранее составленного списка).
      Что касается Вашего вопроса - делается это легко путем использования TV (Template Variables):
      1. создаете отдельную переменную Keywords с типом Text и вторую переменную Description тоже типа Text;
      2. далее привязываете данные TV к своему шаблону (используя Template Access);
      3. создаете сниппет, который будет выбирать значения данных TV для конкретной страницы и выводить их (я обычно пишу свои сниппеты, возможно кто-то из сообщества подскажет готовый);
      4. для страниц своего сайта прописываете нужные данные в новых полях Keywords и Description.
      Вобщем-то все smiley.
        Разработка сайтов и программных модулей на MODX.
        Опыт работы на MODx с 2005 года. Высокое качество.
        Компания Baltic Design Colors: http://www.bdcolors.ru.
        • 31049
        • 48 Posts
        Друзья, а нет сниппета, чтобы динамически выводить кейвордся исходя из контента страницы? Такие хаки есть на многих кмс smiley
        • Quote from: Uneral at Nov 15, 2006, 08:38 AM

          Друзья, а нет сниппета, чтобы динамически выводить кейвордся исходя из контента страницы? Такие хаки есть на многих кмс  smiley
          Думаю, что вряд ли есть такой для MODx, да и сложно на мой взгляд написать хорошо работающий парсер страниц для получения ключевых слов.. здесь ведь кроме всего прочего обязательно придется учитывать морфологию, да к тому же у разных языков она разная.
            Разработка сайтов и программных модулей на MODX.
            Опыт работы на MODx с 2005 года. Высокое качество.
            Компания Baltic Design Colors: http://www.bdcolors.ru.
            • 26709
            • 4 Posts
            У меня есть крутой скрипт, который анализирует контент и создает кейворды и описание+ можно самому задавать список кейвордом. Могу поделиться. Скрипт занимает всего один файл. Очень простой. Чуть позже выложу
              • 19164
              • 1,215 Posts
              Я видел подобный скрипт на PHP-Nuke и могу сказать что это полный отстой. Как было сказано выше - нужно учитывать морфологию языка, а для этого понадобятся нехилые словари. В лучшем случае, на что способен подобный скрипт - добавить в кейворды либо слова из первых Х строк текста, убрав повторяющиея, либо добавив туда самые распространенные слова на странице, за исключением стоп-слов.
                DirectResize 0.9 beta. PHPThumb, sets of configurations, configuration, binded to specific path. No backward compatibility. | DirectResize 0.9. PHPThumb, наборы параметров, параметры, привязанные к определенным путям. Без обратной совместимости.

                Unfortunately, DirectResize project is closed. If you want to continue development, PM me for access to project page on Google Code. К сожалению, проект DirectResize закрыт. Если вы желаете продолжить разработки, обращайтесь через ПМ для получения доступа к репозиторию на Google Code.

                [PLUGIN] DirectResize - as Maxigallery but for single images :: Download :: [url=http://modxcms.com/forums/index.php/topic,21490]
                • 3947
                • 8 Posts
                Quote from: Igor at Nov 15, 2006, 07:32 AM

                Привет! Добро пожаловать в сообщество MODx smiley
                Выбирать ключевые слова для каждой страницы из списка или вписывать их каждый раз отдельно - дело вкуса и.. личной лени smiley. Хотя соглашусь, что иногда более эффективно в плане продвижения в поисковиках записать ключевые слова в определенном порядке (меня раздражает иногда то, что нельзя управлять порядком выдачи ключевых слов, если выбираешь их из заранее составленного списка).
                Что касается Вашего вопроса - делается это легко путем использования TV (Template Variables):
                1. создаете отдельную переменную Keywords с типом Text и вторую переменную Description тоже типа Text;
                2. далее привязываете данные TV к своему шаблону (используя Template Access);
                3. создаете сниппет, который будет выбирать значения данных TV для конкретной страницы и выводить их (я обычно пишу свои сниппеты, возможно кто-то из сообщества подскажет готовый);
                4. для страниц своего сайта прописываете нужные данные в новых полях Keywords и Description.
                Вобщем-то все smiley.

                Спасибо! Попробую. Только чего же это сразу не сделали... Куда проще и нагляднее.

                Кстати, в практике с большими сайтами полезно иметь еще одну фичу -- выгружать все киворды и дескрипшены с сайта в один файл, например CSV: id-страницы, ’список квиордов’, ’дескрипшен’.
                SEO-специалисту так удобнее анализировать и править массы страниц. А потом этот CSV-файл назад экспортим в СMS-ку.
                  • 3947
                  • 8 Posts
                  Igor, большое Вам спасибо за короткое, четкое и ясное описание. Все отлично получилось, даже проще. Достаточно было создать два TV для шаблона.
                  Теперь заданные TV Keywords и Description в редакторе выводятся сразу под Содержимым. То что нужно -)
                    • 31049
                    • 48 Posts
                    Quote from: Serg24 at Nov 15, 2006, 03:00 PM

                    У меня есть крутой скрипт, который анализирует контент и создает кейворды и описание+ можно самому задавать список кейвордом. Могу поделиться. Скрипт занимает всего один файл. Очень простой. Чуть позже выложу

                    Ок, будем ждать, а пока попробую на практике реализовать совет Игоря.
                      • 26709
                      • 4 Posts
                      Âîò îáåùàííûé òåêñò êðèïòà ìåòàãåíåðàòîðà

                      <?
                      ### Ôóíêöèÿ ñîçäàåò ñïèñîê êëþ÷åâûõ ñëîâ ïî òåêñòó, à òàêæå êðàòêîå îïèñàíèå.
                      ### Âõîäÿùèå ïàðàìåòðû:
                      ###   - $text - Ñîîáñòâåííî òåêñò äëÿ êîòîðîãî õîòèì ïîëó÷èòü êëþ÷åâûå ñëîâà
                      ###   - $keywords - Äîïîëíèòåëüíûå êëþ÷åâûå ñëîâà. Áóäóò äîáàâëÿòüñÿ â íà÷àëî ïîëó÷åííûõ.
                      ###   - $description - Äîïîëíèòåëüíîå îïèñàíèå. Áóäåò äîáàâëÿòüñÿ â íà÷àëî ïîëó÷åííîãî.
                      ###                    (Ó÷òèòå, îïèñàíèå íå áîëåå 200 ñèìâîëîâ, ïîýòîìó ïîëó÷åííîå áóäåò
                      ###                     îáðåçàòüñÿ ñ ó÷åòîì äëèííû äîïîëíèòåëüíîãî)
                      ###
                      ### Âûõîäíûå ïàðàìåòðû:
                      ###   - $meta['keywords'] - Ñîîòâåòñòâåííî êëþ÷åâûå ñëîâà
                      ###   - $meta['description'] - è îïèñàíèå
                      ###
                      ### Èñïîëüçîâàíèå:
                      ###   - $meta=create_meta($text);
                      ###   - $meta=create_meta($text, $keywords);
                      ###   - $meta=create_meta($text, 'äîïîëíèòåëüíûå,êëþ÷åâûå,ñëîâà');
                      ###   - $meta=create_meta($text, $keywords, $description);
                      ###   - $meta=create_meta($text, 'äîïîëíèòåëüíûå,êëþ÷åâûå,ñëîâà', 'äîïîëíèòåëüíîå,îïèñàíèå');
                      function create_meta($text, $keywords='', $description='') {
                          ### Íîðìàëèçàöèÿ òåêñòà
                          $text=trim(stripslashes(preg_replace('/[\r\n\t]/i', ' ', strip_tags($text))));
                          ### Ôîðìèðóåì îïèñàíèå èç òåêñòà, ìàêñ.200 çà äî ïåðâîãî çíàêà ïóíêòóàöèè
                          $idx=200;
                          if(!empty($description)) {
                              $description=trim($description).' ';
                              $idx-=strlen($description);
                          }
                          while(!in_array($text[$idx], array('.', '!', '?')))$idx--;
                          $meta['description']=$description.substr($text, 0, $idx+1);
                      
                          ### Çàãðóæàåì òàáëèöó îáùèõ ñëîâ è óäàëÿåì ýòè ñëîâà èç òåêñòà
                          $name='common-words.txt';
                          if(file_exists($name)) {
                              if($file=fopen($name, 'r')) {
                                  $data='';
                                  while(!feof($file)){
                                      $word=trim(fgets($file));
                                      if($word[0]=='#')continue;
                                      $data.=' '.$word;
                                  }
                                  fclose($file);
                                  $data=str_replace(' ', '|', trim($data));
                              }
                              $text=preg_replace('/\b'.$data.'\b/i', '', $text);
                          }
                      
                          ### Óäàëÿåì èç òåêñòà âñå çíàêè ïðåïèíàíèé è ïóíêòóàöèè è ïðåîáðàçóåì â ìàññèâ ñëîâ
                          $text=split(' ', preg_replace('/[^\w]+/i', ' ', $text)); $data='';
                          foreach($text as $key=>$word) if(strlen($word)>4)$data.=' '.strtolower($word);
                          $text=split(' ', trim($data)); $size=count($text);
                          $arr1=array(); $arr2=array(); $arr3=array();
                      
                          ### Ñòðîèì ìàññèâ ñëîâ îòñîðòèðîâàííûé ïî ÷àñòîòå âëîæåíèé â òåêñòå
                          for($i=0; $i<$size; $i++) {
                              $word=$text[$i];
                              if($arr1[$word])$arr1[$word]++; else $arr1[$word]=1;
                          }
                          arsort($arr1);
                          ### Ñòðîèì ìàññèâ ôðàç ñîñòîÿùèõ èç äâóõ ñëîâ îòñîðòèðîâàííûé ïî ÷àñòîòå âëîæåíèé â òåêñòå
                          for($i=0; $i<$size-1; $i++) {
                              $word=$text[$i].' '.$text[$i+1];
                              if($arr2[$word])$arr2[$word]++; else $arr2[$word]=1; 
                          }
                          arsort($arr2);
                          ### Ñòðîèì ìàññèâ ôðàç ñîñòîÿùèõ èç òðåõ ñëîâ îòñîðòèðîâàííûé ïî ÷àñòîòå âëîæåíèé â òåêñòå
                          for($i=0; $i<$size-2; $i++) {
                              $word=$text[$i].' '.$text[$i+1].' '.$text[$i+2];
                              if($arr3[$word])$arr3[$word]++; else $arr3[$word]=1;
                          }
                          arsort($arr3);
                      
                          ### Âûáèðàåì 15 ïåðâûõ ñëîâ ñ ìàêñèìàëüíîé ÷àñòîòîé âëîæåíèé
                          $data=array(); $i=0;
                          foreach($arr1 as $word=>$count) {
                              $data[$word]=$count;
                              if($i++==16)break;
                          }
                          ### Âûáèðàåì 8 ïåðâûõ ôðàç ñîñòîÿùèõ èç äâóõ ñëîâ ñ ìàêñèìàëüíîé ÷àñòîòîé âëîæåíèé
                          $i=0;
                          foreach($arr2 as $word=>$count) {
                              $data[$word]=$count;
                              if($i++==8)break;
                          }
                          ### Âûáèðàåì 4 ïåðâûõ ôðàç ñîñòîÿùèõ èç òðåõ ñëîâ ñ ìàêñèìàëüíîé ÷àñòîòîé âëîæåíèé
                          $i=0;
                          foreach($arr3 as $word=>$count) {
                              $data[$word]=$count;
                              if($i++==4)break;
                          }
                          arsort($data); $text='';
                      
                          ### Ïåðåâîäèì ìàññèâ ôðàç â òåêñò, îïÿòü òàêè ñ ó÷åòîì ÷àñòîò âëîæåíèé
                          foreach($data as $word=>$count) $text.=','.$word; $text=substr($text, 1);
                          if(!empty($keywords))$keywords=preg_replace('/,$/i', '', $keywords).',';
                          $meta['keywords']=$keywords.$text;
                      
                          ### Âîçâðàùàåì ïîëó÷åííûé ðåçóëüòàò
                          return $meta;
                      }
                      ?>
                      
                      


                      à âîò ôàéë common-words.txt
                      # Ñïèñîê îáùèõ ñëîâ äëÿ keyword ãåíåðàòîðà.
                      # Äîïóñêàåòñÿ îäíî îáùåå ñëîâî íà ëèíèþ.
                      # Ñïèñîê ìîæåò ñîñòîÿòü êàê èç àíãëèéñêèõ òàê è èç ðóññêèõ ñëîâ. Âëèÿåò òîëüêî íà ïðîèçâîäèòåëüíîñòü.
                      a
                      the
                      because
                      òàêæå
                      íèáóäü
                      ýòîãî
                      íåêîòîðûå
                      êîòîðîé
                      êîòîðûé
                      íàîáîðîò
                      òîëüêî
                      ìíîãî
                      íåêòî
                      íàøåé
                      íàøåãî
                      òîãäà
                      ïîñëå
                      âñåãî
                      ïèñàëè
                      


                      åñòåñòâåííî, åãî ìîæíî ñäåëàòü â âèäå òâïàðàìåòðà, è íàáèâàòü â íåãî ýòè ñëîâà. ß åùå íå ïåðåäåëûâàë åãî äëÿ ÌîäÕ, åñëè êòî õî÷åò, ìîæåò ïîïðîáîâàòü.

                      È åùå. Âîò â ÌîäÕ åñòü òàêîé ñíèïåò - íåäàâíî íàøåë. Îí ãåíåíðèðóåò êåéâîðäû íà îñíîâàíèè òåêñòà ñòðàíèöû
                      /****************************************************<?
                      * Name: PageKeywords
                      * Version 0.3 - just fixed a truncation error 18. Aug. 2006
                      * Desc: returns a list of words from the document's content
                      * created by Paul Paulousek [email protected]
                      * date Aug, 17. 2006
                      * based on tagcloud of Marc Hinse, [email protected], www.modxcms.de
                      * Version: 1.1.
                      *
                      * Usage: [[PageKeywords?min=`2`]]
                      * Parameters: 
                      *	min: Minimum occurrences of a word to be displayed (defaults to 1)
                      *   if a chunk named "cloudwords" exists, the snippet will take the content of it for building the cloud
                      *   the chunk must contain a comma-separated list of words and phrases.
                      * ***************************************************/
                      
                      $min = isset($min)? $min : "1";
                      
                      $include =  $modx->getChunk('cloudwords');
                      $include = explode(",",$include);
                      //try to get a Chunk for the include-words
                      if (sizeof($include)<2) {
                      $include = array('blog','method','edit','content','design','links','quickedit','MODx','customize'); 
                      //include list (sample, put in your words here)
                      }
                      //try to get a Chunk for the include-words
                      if (!isset($include)) {
                      $include = array('blog','method','edit','content','design','links','quickedit','MODx','customize'); 
                      }
                      
                      $zeichen = array(',','.',':');		//array of chars to be deleted
                      if (strpos($parent,',')){
                      	$parent= explode(',',$parent);
                      }
                      $cid = $modx->documentIdentifier; //current document
                      $contents = $modx->getDocument($cid);
                      // get the normal content
                      $content=$contents['content'];
                      
                      // get the TVs
                      $tvcontent = $modx->getTemplateVarOutput('*', $cid);
                      // clear the content-TV
                      $tvcontent['content'] = "";
                      
                      
                      //put them together
                      
                      foreach($tvcontent as $key => $value) 
                      {
                      		$content.= strip_tags($value)." ";	
                      	}
                      		
                      
                      $output='';
                      //all to lower and without HTML
                      
                      $words=array();
                      	foreach($include as $incword) 
                      	{
                      	$wert = substr_count($content,$incword);
                      		if($wert>=$min) 
                      		{ 	//look if the word counts the required minimum and is in the include list 
                      			$words[$incword] = $wert;	//put them in a new array
                      		}
                      	} 
                      
                      ksort($words);	//sort them alphabetically (just comment that out, then they will be unsorted
                      foreach($words as $key => $wert) {
                      		$output.= $key.',';	
                      	}
                      $output = substr($output,0,strlen($output)-1); //delete last comma and space	
                      return $output;