WordPress как на ладони
WordPress Meetup #4. Встречаемся в Москве wordpress jino

Сравнение СЕО плагинов platinum SEO Pack и All in One SEO Pack и отказ от них

В последнее время меня все чаще посещает желание сместить в сторону свалки плагин All in One SEO Pack и его «близнеца» platinum SEO Pack, которые я использую для СЕО оптимизации.

На некоторых своих сайтах я уже от них избавился, в частности на этом. Почему? Потому что, большая часть их функциональности почти всегда остается не у дел, к примеру, 301 редирект. Также, не очень нравится, как генерируется описание (description) и кейворды (keywords). Заглянув в код, желание породнить эти плагины со свалкой стало крепче, потому что все это можно сделать проще, подредактировав header.php.

Однако, не хочу никого вводить в заблуждение, что эти плагины сильно нагружают систему, что это какие-то монстры от которых лучше избавиться. Нет, это не так: они хороши и ими очень даже можно пользоваться!

В этой статье я попробую ответить на вопрос: есть ли объективные причины отказаться от вышеупомянутых СЕО плигинов и какова жертва? Также, я постараюсь подробно рассмотреть оба плагина, чтобы прояснить для себя и вас, чем же конкретно эти плагины занимаются и в чем их различия. Для начала я решил подробно разобраться в том, что входит в их задачи и какие из функций крайне важны, чем их можно заменить, дабы избавится от них. А также, сравнивая функциональность, можно понять, чем отличаются эти плагины и какой плагин лучше. Рассмотрим возможности, которые описываются разработчиками этих плагинов:

Platinum SEO Pack

  1. Автоматический 301 редирект при изменении постоянных ссылок (УРЛов) - (нет в All in one SEO);

  2. Можно менять структуру постоянных ссылок (permalink). При изменении структуры постоянных ссылок плагин автоматически создает 301 редирект на новое расположение страниц, таким образо весь ПР должен перетечь на новые страницы. (нет в All in one SEO);

  3. Канонические URL'ы (rel='canonical' в метатегах, подробнее можете прочитать тут). Помогает избежать дублирование контента;

  4. Настраиваемая автоматическая генерация мета заголовков у постов и страниц;

  5. Автоматическая генерация всех SEO тегов **(title, discription, keywords)**;

  6. Настройки для установки мета описания (description) для страниц категорий / меток. см. тут (нет в All in one SEO);

  7. Возможность выключить, метазаголовки у определенных постов или страниц;

  8. Настроить формат мета заголовка (title) у постов или страниц;

  9. Возможность переписать заголовок (title), ключевые слова (keywords) и описание (description) для постов и страниц;

  10. Совместим со многими плагинами, такими как like Auto Meta, Ultimate Tag Warrior и другими;

  11. Добавляет index, noindex, follow or nofollow, noodp, noydir, noarchive, nosnippet мета теги к постам и страницам. (нет в All in one SEO).

  12. Поддерживает произвольные типы записей и произвольные таксономии.

All in One SEO Pack

  1. Продвинутые Канонические URL'ы (в чем "продвинутость" непонятно);

  2. Использует свои фильтры, которые выступают как API. Благодаря этому другие плагины или темы могут расширять функциональность плагина;

  3. Единственный плагин, который поддерживает СЕО интеграцию для WP e-Commerce сайтов;

  4. Nonce защита (такая защита используется повсеместно в WordPress - принцип одноразового использования ключей);

  5. Автоматически генерирует мета заголовок (Title);

  6. Генерирует остальные мета теги (description, keywords);

  7. Предотвращает дублирование контента, характерного для WordPress;

  8. Множество настроек;

  9. Можно устанавливать мета заголовки (title), описание (description) и ключевые (keywords) слова для каждой записи / страницы.

  10. Совместим с плагинами, такими как like Auto Meta, Ultimate Tag Warrior и др.

  11. Есть платная версия All in One SEO Pack Pro ($39).

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

Теперь, сравнивая эти два плагина, пожалуй, можно сказать, что более функциональным является platinum SEO Pack (за исключением некоторых пунктов), хотя оба плагина очень похожи.

Произвольные поля, в которые плагин All in One SEO Pack записывает: заголовок, описание и ключевые слова:

aioseop_title
aioseop_description
aioseop_keywords

Преимущества  platinum SEO Pack над All in One SEO Pack:

  1. Создает 301 редирект при любых изменениях в постоянных ссылках (URL'ах). Насколько это востребованная функция и кому она нужна сказать сложно, но я этой функцией плагина не пользовался никогда. Имею ввиду, если мне нужен был 301 редирект я его ставил в .htaccess. А менять постоянные ссылки у уже опубликованных страниц крайне не рекомендуется! И по-моему этим никто не занимается;

  2. Есть возможность настроить описание (description) и ключевые слова (keywords) отдельно для каждой рубрики и метки;

  3. Можно указать robots значения: index, noindex, follow и т.д. для каждого поста или страницы в отдельности. (для всех видов архивов index, noindex  (индексация) настраивается так же как и в platinum SEO)

All in One SEO Pack по большому счету преимуществами не обладает, единственное - это пункт 3 - интеграция с e-Commerce. Все остальное: nonce защита, API и т.д. не так важны. Что касается функции канонических URL (присутствует у обоих плагинов), этот мета тег canonical уже реализован в самом WordPress, начиная с версии 2.9.

Знаете ли вы?

Полезной функцией у platinum SEO Pack, о которой знают не все, является пункт 6 - настройка мета описания и ключей для категорий и меток. Для тех, кто пользуется этим плагином опишу как использовать эту функцию: Заходим в админ-панель (Записи > Рубрики > изменить) и в поле "описание" используем шоткоды:

  • [description]Описание рубрики, которое потом будет отображаться в мета description[/description]

  • [keywords]Ключевые слова (keywords) для рубрики, через запятую (keyword 1, keyword 2, keyword 3  и т.д.)[/keywords]

После этого у рубрики автоматически появятся мета поля: description и keywords.

platinum SEO pack

Настройки platinum SEO хранятся каждая отдельно, тогда как у All in One SEO хранит все настройки в массиве (предпочтительный вариант).

Альтернатива SEO плагинам

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

Скажу сразу, если вы совсем не разбираетесь в PHP, то все что ниже вам вряд ли пригодится. Используйте плагин - это гораздо удобнее.

Оба эти плагина создавались ради 3-х основных вещей:

  1. Перезапись мета Заголовков;

  2. Генерация description и keywords;

  3. Генерация мета поля robots, в котором указывается как индексировать страницу.

Код замены для title, description, keywords, robots

Перенесено в другую статью: SEO мета-теги без плагинов: title, description, robots, Open Graph.

188 комментов
Полезные 9 Все
  • Иван cайт: drevodel.org

    All in One SEO Pack мне больше нравится чем platinum SEO Pack

    Ответить3.1 года назад #
  • Бизон

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

    Спасибо тебе за все эти вещи. bravo

    1
    Ответить2.6 года назад #
  • Leon1010 cайт: i-leon.ru

    А как добавить произвольные поля title, description на страницы редактирования категорий и тегов в WP > 4.4. ??

    Пытался найти решение, но везде описывается способ для старых версий WP, с добавлением новых таблиц в базу.

    Ответить2.5 года назад #
    • Kama5408

      Вот тут первый пример как раз про это.

      Ответить2.5 года назад #
      • Leon1010 cайт: i-leon.ru

        Вот, сам написал smile

        // добавляет вызов функции при инициализации административного раздела
        add_action('admin_init', 'cat_and_tag_custom_fields', 1);
        // функция расширения функционала административного раздела
        function cat_and_tag_custom_fields(){
        	// отображение формы при создании категории и тегов
        	add_action('category_add_form_fields', 'cat_tag_fields_form');
        	add_action('post_tag_add_form_fields', 'cat_tag_fields_form');
        	// отображение формы при редактировании категории и тегов
        	add_action('edit_category_form_fields', 'cat_tag_fields_form');
        	add_action('edit_tag_form_fields', 'cat_tag_fields_form');
        	// добавления действия при сохранении формы ввода параметров категории и тегов
        	add_action('edited_category', 'cat_tag_fields_save');
        	add_action('edited_post_tag', 'cat_tag_fields_save');
        
        	add_action('create_category', 'cat_tag_fields_save');
        	add_action('create_post_tag', 'cat_tag_fields_save'); 
        }
        
        function cat_tag_fields_form($tag){
        		$t_id = $tag->term_id;
        		$meta_title = get_term_meta($t_id, "title", true );
        		$meta_desc = get_term_meta($t_id, "description", true );
        ?>
        		<tr class="form-field">
        			<th scope="row" valign="top"><label for="title">SEO Title</label></th>
        			<td>
        			<input type="text" name="meta[title]" id="title" style="width:60%;" value="<?php echo $meta_title; ?>"><br />
        			<span class="description"><?php _e('Title'); ?></span>
        			</td>
        		</tr>
        		<tr class="form-field">
        			<th scope="row" valign="top"><label for="meta_desc">SEO Description</label></th>
        			<td>
        			<input type="text" name="meta[description]" id="meta_desc" style="width:100%;" value="<?php echo $meta_desc; ?>"><br />
        			<span class="description"><?php _e('Description'); ?></span>
        			</td>
        		</tr>
        		<?php
        }
        
        function cat_tag_fields_save($term_id){
        	if (isset($_POST['meta'])) {
        		$cat_keys = array_keys($_POST['meta']);
        		foreach ($cat_keys as $key) {
        			if (isset($_POST['meta'][$key])) {
        				update_term_meta($term_id, $key, $_POST['meta'][$key]);
        			}
        		}
        	}
        }
        
        1
        Ответить2.5 года назад #
        • Dzmitry Roshchyn cайт: pribylvseti.ru

          Фигу, у меня не заработала, поля в настройках появились: title и description (кстати keywords тоже интересует). Заполняем, обновляем и при просмотре кода страницы ничего, заголовок меняется, точнее выводится с главной страницы.

          Ответить2.5 года назад #
          • Работает, но только с термами встроенных Рубрик и Меток.

            Метабоксы для произвольных таксономий создаются, но значения не сохраняются. Кто бы дописал код, чтобы использовать с произвольными таксономиями?

            WordPress 4.6.1

            Ответить1.5 год назад #
          • Вот дописал для Keywords.

            <?php // Метаблоки Таксономий
            // подключаем функцию активации мета блока (my_extra_fields)
            // добавляет вызов функции при инициализации административного раздела
            add_action('admin_init', 'cat_and_tag_custom_fields', 1);
            // функция расширения функционала административного раздела
            function cat_and_tag_custom_fields(){
            	// отображение формы при создании категории и тегов
            	add_action('category_add_form_fields', 'cat_tag_fields_form');
            	add_action('post_tag_add_form_fields', 'cat_tag_fields_form');
            	// отображение формы при редактировании категории и тегов
            	add_action('edit_category_form_fields', 'cat_tag_fields_form');
            	add_action('edit_tag_form_fields', 'cat_tag_fields_form');
            	// добавления действия при сохранении формы ввода параметров категории и тегов
            	add_action('edited_category', 'cat_tag_fields_save');
            	add_action('edited_post_tag', 'cat_tag_fields_save');
            
            	add_action('create_category', 'cat_tag_fields_save');
            	add_action('create_post_tag', 'cat_tag_fields_save'); 
            }
            
            function cat_tag_fields_form($tag){
            		$t_id = $tag->term_id;
            		$meta_title = get_term_meta($t_id, "title", true );
            		$meta_desc = get_term_meta($t_id, "description", true );
            		$meta_keywords = get_term_meta($t_id, "keywords", true );
            ?>
            		<tr class="form-field">
            			<th scope="row" valign="top"><label for="title">SEO Title</label></th>
            			<td>
            			<input type="text" name="meta[title]" id="title" style="width:60%;" value="<?php echo $meta_title; ?>"><br />
            			<span class="description"><?php _e('Title'); ?></span>
            			</td>
            		</tr>
            		<tr class="form-field">
            			<th scope="row" valign="top"><label for="meta_desc">SEO Description</label></th>
            			<td>
            			<input type="text" name="meta[description]" id="meta_desc" style="width:100%;" value="<?php echo $meta_desc; ?>"><br />
            			<span class="description"><?php _e('Description'); ?></span>
            			</td>
            		</tr>
            		<tr class="form-field">
            			<th scope="row" valign="top"><label for="meta_desc">SEO Keywords</label></th>
            			<td>
            			<input type="text" name="meta[keywords]" id="meta_keywords" style="width:100%;" value="<?php echo $meta_keywords; ?>"><br />
            			<span class="description"><?php _e('Keywords'); ?></span>
            			</td>
            		</tr>
            		<?php
            }
            
            function cat_tag_fields_save($term_id){
            	if (isset($_POST['meta'])) {
            		$cat_keys = array_keys($_POST['meta']);
            		foreach ($cat_keys as $key) {
            			if (isset($_POST['meta'][$key])) {
            				update_term_meta($term_id, $key, $_POST['meta'][$key]);
            			}
            		}
            	}
            }
            Ответить1.5 год назад #
            • Михаил cайт: trapeznaya.ucoz.ru

              Степан. error log жалуется Trying to get property of non-object на строку
              $t_id = $tag->term_id;

            • В WP4.9.5, description прописываешь для рубрики или для метки, он не выводится в head, а если прописан стандартный, то выводится только он! scratch_one-s_head

              Ответить2 месяца назад #
      • Dzmitry Roshchyn cайт: pribylvseti.ru

        Буду ждать, мне лично это возможность интересна. Уже года три пытаюсь выяснить стоит ли раскачивать категории (хотя бы эти) и теги на блогах wordpress, или нет. Использовал раньше конструкцию, мы её в вопросах и ответах разбирали, рабочая она, но, что то вней не так. Реально гробит отсутствие встроенного редактора html при добалении контента в категории и тэги, приходится руками проставлять к текстами и изображения ... Да и некоторые темы неправильно всё воспринимают. Если будет мануал, Тимур, то добавь поле под ключевые слова.

        Ответить2.5 года назад #
  • Dzmitry Roshchyn cайт: pribylvseti.ru

    Тимур привет! Какой вариант подключения лучше и надёжней считаешь, с или напрямую без functions.php? И каким сам вариант вывода используешь?

    Ответить2.5 года назад #
    • Kama5408

      Лучше всего, через functions.php или через плагин, если темы меняются иногда. Подключать лучше все через хук wp_head. Заголовок с версии 4,4 надо выводить через хук 'pre_get_document_title' смотри описание wp_get_document_title()

      1
      Ответить2.5 года назад #
      • Dzmitry Roshchyn cайт: pribylvseti.ru

        Благодарю за совет!thank_you Тимур, у меня и через wp_head выводит нормально. Или есть скрытые заморочки с заголовками версии 4.4?

        Ответить2.5 года назад #
  • dima

    Привет, а у меня поле robots выводит http://prntscr.com/9o9mhh, как это исправить?

    Ответить2.5 года назад #
    • Kama5408

      Странно так не должно быть. Как выводите? kama_meta_robots последняя версия?

      Ответить2.5 года назад #
      • dima

        Вывожу через Advanced Custom Fields, в function.php вставил ваш код, создал поля http://prntscr.com/9obfda , все поля выводятся отлично кроме поля robots

        Ответить2.5 года назад #
        • Kama5408

          Видимо Advanced Custom Fields там сохраняет не строку, а массив...

          Попробуйте на странице вывести это строку так:

          $close = get_post_meta( $post->ID, 'robots', true );
          print_r( $close );

          Что выведет?

          Ответить2.5 года назад #
          • dima

            Array
            (
            [0] => noindex,nofollow
            )

            Ответить2.5 года назад #
            • Kama5408

              Мдя ну и логика... Надо вам функцию дописать... Заменить

              $close = get_post_meta( $post->ID, 'robots', true );

              на

              $close = get_post_meta( $post->ID, 'robots', true );
              if( is_array($close) ) $close = array_shift( $close );
              Ответить2.5 года назад #
  • Привет Кама, у меня не работает вот этот кусок кода

    // удалим стандартный вывод title
    remove_action( 'wp_head', '_wp_render_title_tag', 1 );
    
    // вызов всех функций
    add_action( 'wp_head', 'kama_render_seo_tags', 1 );
    function kama_render_seo_tags(){
    	//remove_theme_support( 'title-tag' ); // не обязательно
    	echo '<title>'. kama_meta_title() .'</title>'."\n\n";
    
    	kama_meta_description('Текст для главной');
    	kama_meta_keywords ('ключи, для, главной');
    	kama_meta_robots();
    }

    В заголовке увидел два <title> </title> стандартный вывод и <title>'. kama_meta_title() .'</title>

    и нет описания, и ключей для главной страницы и пагинации. Как исправить?

    Ответить2.3 года назад #
    • Kama5408

      Где вызывается этот код? Он должен работать!

      Ответить2.3 года назад #
      • В functions.php я прописал строку require get_template_directory() . '/inc/kama-seo.php'; и в этот файл вставил весь код.

        Или вы хотите сказать что фрагмент не рабочего кода нужно вставить в header.php?

        Ответить2.3 года назад #
        • Kama5408

          Нет, не хочу. Все правильно сделали! Но странно почему не работает. У меня на этом блоге точно также сделано...

          Сейчас проблема с описанием и ключами на главной как я понимаю? Попробуйте

              if( is_front_page() ) 
          		$out = $home_description ?: get_bloginfo( 'description', 'display' );

          заменить на

              if( is_front_page() || is_home() ) 
          		$out = $home_description ?: get_bloginfo( 'description', 'display' );

          или на (для проверки)

              //if( is_front_page() || is_home() ) 
          		$out = $home_description ?: get_bloginfo( 'description', 'display' );

          П.С. Чтобы убрать воторой заголовок удалите код его выводящий в header.php

          Ответить2.3 года назад #
          • Попробовал оба исправления, изменений нет. Только в этом коде ошибка синтаксиса:

                //if( is_front_page() || is_home() ) 
            		$out = $home_description ?: get_bloginfo( 'description', 'display' );

            и пропал заголовок <title>'. kama_meta_title() .'</title>

            и работает kama_meta_robots();

            И к стати, на этом блоге Я не увидел описание и ключи на главной странице

            Ответить2.3 года назад #
            • Kama5408

              Блин ошибка... Надо так вызывать:

                  kama_meta_description('', 'Текст для главной');
              	kama_meta_keywords('', 'ключи, для, главной');

              Первый параметр должен быть пустой, я это добавил а вызов забыл поправить...

              // удалим стандартный вывод title
              remove_action( 'wp_head', '_wp_render_title_tag', 1 );
              
              // вызов всех функций
              add_action( 'wp_head', 'kama_render_seo_tags', 1 );
              function kama_render_seo_tags(){
              	//remove_theme_support( 'title-tag' ); // не обязательно
              	echo '<title>'. kama_meta_title() .'</title>'."\n\n";
              
              	kama_meta_description('', 'Текст для главной');
              	kama_meta_keywords('', 'ключи, для, главной');
              	kama_meta_robots();
              }

              Спасибо за комментарии...

              1
              Ответить2.3 года назад #
              • Кама спасибо разобрался,
                есть вопрос: если мне надо описание и ключи постов вывести еще в:

                meta itemprop="description" content="" 
                meta itemprop="keywords" content="" 
                

                какие переменные вставлять в content="?"

                кроме этого описание одинаковые для главной страницы и page/2 как добавить в описание для второй страницы, например (страница 2)?

                Ответить2.3 года назад #
                • Kama5408

                  По аналогии

                  echo '<meta name="description" content="'. esc_attr($out) .'" />'."\n";
                  echo '<meta itemprop="description" content="'. esc_attr($out) .'" />'."\n";

                  Для определения страниц пагинации используй функцию is_paged() или get_query_var('paged'):

                  $paged = (get_query_var('paged') > 1) ? ' ( страница '. get_query_var('paged') .')' : '';
                  
                  echo '<meta name="description" content="'. esc_attr($out) . $paged .'" />'."\n";
                  1
                  Ответить2.3 года назад #
  • Dzmitry Roshchyn cайт: pribylvseti.ru

    Тимур привет. Давно использую твой код и доволен. Но есть смежный вопрос. Допустим, у меня на одном сайте есть статья (хотя, их просто куча, была бы одна не парился бы, наверное), разбитая аж на 37 страниц посредством <!--nextpage--> (такова логика обзора), всё индексируется. Как мне показать поисковикам, что это не разные страницы, а составные части одной. В заголовке вроде норм выводится ... (страница 2) и так далее, тоесть по идее здесь, поисковики должны понять, что это вторая (третья и т.д.) страница одного и того же обзора, однако не факт, что этого хватит для полного счастья.

    Перерыл кучу статей в сети и мало нашёл путного; одна надёжа на тебя. Вроде для надёжности логично использовать атрибуты prev и next (Гугл рекомендует).

    Вопрос №1: как вывести в коде конструкцию <link rel="prev" href="...обзор.html/2"> <link rel="next" href="...обзор.html/3">?

    Вопрос №2: что в таких случаях делают с rel="canonical"? Понятно, что он нужен в данном случае для первой страницы обзора, а вот для остальных, оставить по умолчанию (то есть каноническими будут ссылки ...обзор.html/2, ...обзор.html/3 и т.д.)?

    Вопрос №3: нужно ли в моём случае убирать со страниц пагинации записи description и keywords и как это сделать. По логике вещей вроде нужно, ведь описание и ключи уже обозначены на первой странице, а на остальных смысла нет или поисковики смогут во всём разобраться сами?

    Буду рад услышать твоего совета по моей проблематике!
    С ув. Дмитрий

    • Kama5408

      Тебе лучше у СЕОшников спросить...

      Я думаю, что поисковику показать что страницы связаны между собой мало реально - для него есть страница, которую нужно показать по запросу и все... Чтобы их хоть как-то связать нужна перелинковка, например с каждой страницы пагинации ссылка на главную страницу.

      Вопрос №1: как вывести в коде конструкцию

      Не думаю что эти ссылки вообще нужны... Но вывести конечно можно... Для этого отключи вывод таких дефолтных ссылок и выведи аналогичные свои, где будет правильный URL на подстраницы:

      // отключим ссылки на соседние записи: <link rel='next'... <link rel='prev'...
      remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10 ); 
      
      add_action( 'wp_head', 'my_adjacent_posts_rel_link', 10 );
      function my_adjacent_posts_rel_link(){
      	// выводим ссылки, см. https://wp-kama.ru/function/adjacent_posts_rel_link
      }

      Вопрос №2: что в таких случаях делают с rel="canonical"?

      Это как не крути отдельные страницы и адрес канонический у них должен быть свой, уникальный. Поэтому, да, оставляем как есть: ...обзор.html/2, ...обзор.html/3.

      Вопрос №3: нужно ли в моём случае убирать со страниц пагинации записи description и keywords

      Думаю не нужно, опять же - это отдельный страницы и ранжироваться они могут только отдельно... Например, я задаю вопрос в поиске ответ на который есть на странице /3 она и должна появится в поиске. А далее по заголовку пользователь уже увидит что это часть общего обзора... Поисковик тут не особо при делах - его задача выдать юзеру релевантный ответ, а насколько ответ релевантный, показывает время...

      -

      Вообще, было бы неплохо для таких сетов, выводить где-то в статье общее оглавление или что-то в этом роде, чтобы юзеры видили что это много статей одного обзора...

      -

      Еще раз повторюсь, проконсультируйся с СЕО спецом, у которого есть опыт, у меня такого опыта нет и я могу только догадываться...

      • Dzmitry Roshchyn cайт: pribylvseti.ru

        Спасибо за ответ и совет. Я на первой странице обзора делают "Содержание" в которое входят ссылки (открываются в новой вкладке) на остальные страницы обзора, где анкорами выступают заголовки этих страниц. Здесь вроде как пойдёт. Далее, внизу есть постраничная пагинация (снова твой код: Альтернатива wp_link_pages). Вот с ней как быть? Выводить ближайшие страницы + главную или все страницы сразу на каждой?

        • Kama5408

          Не уверен что пагинация вообще нужна, раз есть содержание... Но так для "вдруг пригодиться" можно оставить. Для СЕО думаю она не нужна, поэтому сделай как удобнее...

  • Сереня

    итого на каждой странице надо создавать по три поля??)) хехе, ACF чем не угодил? при добавлении страницы три поля УЖЕ готовы к заполнению!!!

    -1
  • Как правильно добавить такие же мета поля для рубрик и меток (вывести бокс с полями)? А то код от Leon1010, который выше, криво работает для description и не чистит БД.

    Ответить2 месяца назад #
Здравствуйте, !     Войти . Зарегистрироваться