WordPress как на ладони
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

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

Выложу сразу, получившийся у меня код, который реализует все эти три пункта, что к чему объясняется сразу в коде.

// удалим стандартный вывод 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 и впишите туда произвольный заголовок.
 *
 * @ $foo            пустышка, чтобы нормально вызывалось через хук wp_title
 * @ $sep            разделитель
 * @ $add_blog_name  добавлять ли название блога в конец заголовка для архивов (true|false)
 *
 * version 3.0
 */
function kama_meta_title( $sep = '»', $add_blog_name = true ){
	global $post;

	$parts = array();
	$prev  = & $parts['prev'];
	$title = & $parts['title'];
	$after = & $parts['after'];

	if(0){}
	// 404
	elseif ( is_404() )
		$title = "Ошибка 404: такой страницы не существует";

	// поиск
	elseif ( is_search() )
		$title = 'Результаты поиска по запросу: '. get_query_var('s');

	// главная
	elseif( is_front_page() ){
		$title = get_bloginfo('name');
		$after = get_bloginfo('description');
	}

	// Архив типа поста
	elseif ( is_post_type_archive() )
		$title = post_type_archive_title('', 0 );

	// таксономии
	elseif( is_category() || is_tag() || is_tax() ){
		$term = get_queried_object();

		preg_match('/\[title=(.*?)\]/i', $term->description, $match );

		$title = function_exists('get_term_meta') && ($tit=get_term_meta( $term->term_id, 'title', 1 )) ? $tit : @ $match[1];

		if( ! $title ){
			$title = single_term_title('', 0 );
			if( is_tax() )
				$prev = get_taxonomy($term->taxonomy)->labels->name;
		}
	}

	// отдельная страница
	elseif( is_singular() || ( is_home() && ! is_front_page() ) || ( is_page() && ! is_front_page() ) ){
		$title = apply_filters('kama_meta_title_singular', null, $post );

		if( ! $title ) $title = get_post_meta($post->ID, 'title', 1 );
		if( ! $title ) $title = single_post_title( '', 0 );

		if( $cpage = get_query_var('cpage') )
			$prev = 'Комментарии '. $cpage;
	}

	// архив автора
	elseif ( is_author() ){
		$author = get_queried_object();
		$title = 'Статьи автора: '. $author->display_name;
		$after = 'blog_name';
	}

	// архив даты
	elseif ( is_day() || is_month() || is_year() ){
		$rus_month  = array('', 'январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь');
		$rus_month2 = array('', 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря');
		$year     = get_query_var('year');
		$monthnum = get_query_var('monthnum');
		$day      = get_query_var('day');

		if( is_year() )      $dat = "$year год";
		elseif( is_month() ) $dat = "$rus_month[$monthnum] $year года";
		elseif( is_day() )   $dat = "$day $rus_month2[$monthnum] $year года";

		$title = 'Архив за '. $dat;
		$after = 'blog_name';
	}

	// другое
	else {
		//$title = function_exists('wp_get_document_title') ? wp_get_document_title() : wp_title( $sep, 0, 'right');
	}

	// номера страниц для пагинации и деления записи
	$pagenum = ( $page = get_query_var('paged') ) ? $page : get_query_var('page');
	if( $pagenum ) $title .= " (страница $pagenum)";

	if( $after == 'blog_name' )
		$after = $add_blog_name ? get_bloginfo('name') : '';

	$parts = apply_filters( 'kama_meta_title_parts', $parts );

	$title = implode( ' '. trim($sep) .' ', array_filter($parts) );

	$title = wptexturize( $title );
	$title = esc_html( $title );

	return $title;
}

/**
 * Выводит метатег description
 *
 * Для элементов таксономий: метаполе description или в описании такой шоткод [description = текст описания]
 * У постов сначала проверяется, метаполе description, или цитата, или начальная часть контента.
 * Цитата или контент обрезаются до указанного в $maxchar символов.
 *
 * @ $home_description - указывается описание для главной страницы сайта.
 * @ $maxchar - Максимальная длина описания (в символах).
 *
 * version 0.6
 */
function kama_meta_description( $home_description = '', $maxchar = 160 ){
	global $wp_query, $post;

	$cut = true; // обрезать до макс символов.
	$out = '';

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

	elseif( is_singular() ){
		if( $out = get_post_meta($post->ID, "description", true ) )
			$cut = false;
		if( ! $out )
			$out = $post->post_excerpt ?: $post->post_content;

		$out = trim( strip_tags( $out ) );
	}
	// term
	elseif( is_category() || is_tag() || is_tax() ){
		$term = get_queried_object();

		// wp 4.4
		if( function_exists('get_term_meta') ){
			$out = get_term_meta( $term->term_id, "description", true );
			$cut = false;
		}
		// wp 4.4 -
		else{
			preg_match ('!\[description=(.*)\]!iU', $term->description, $match );
			$out = isset( $match[1] ) ? $match[1] : '';
		}
	}

	if( $out ){
		$out = str_replace( array("\n", "\r"), ' ', $out );
		$out = preg_replace('~\[[^\]]+\]~', '', $out); // удаляем шоткоды

		if( $cut ){
			$char = mb_strlen( $out );
			if( $char > $maxchar ){
				$out      = mb_substr( $out, 0, $maxchar );
				$words    = explode(' ', $out );
				$maxwords = count($words) - 1; //убираем последнее слово, ибо оно в 90% случаев неполное
				$out      = join(' ', array_slice($words, 0, $maxwords)).' ...';
			}
		}

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

/**
 * Генерирует метатег keywords для head части сайта
 *
 * Чтобы задать свои keywords для записи, создайте произвольное поле keywords и впишите в значения необходимые ключевые слова.
 * Для постов (post) ключевые слова генерируются из меток и названия категорий, если не указано произвольное поле keywords.
 *
 * Для меток, категорий и произвольных таксономий, ключевые слова указываются в описании, в шоткоде: [keywords=слово1, слово2, слово3]
 *
 * @ $home_keywords: Для главной, ключевые слова указываются в первом параметре: kama_meta_keywords( 'слово1, слово2, слово3' );
 * @ $def_keywords: сквозные ключевые слова - укажем и они будут прибавляться к остальным на всех страницах
 *
 * version 0.5
 */
function kama_meta_keywords( $home_keywords = '', $def_keywords = '' ){
	global $wp_query, $post;
	$out = '';

	if ( is_front_page() ){
		$out = $home_keywords;
	}
	elseif( is_singular() ){
		$out = get_post_meta($post->ID, 'keywords', true);

		// для постов указываем ключами метки и категории, если не указаны ключи в произвольном поле
		if( ! $out && $post->post_type == 'post' ){
			$res = wp_get_object_terms( $post->ID, array('post_tag', 'category'), array('orderby' => 'none') ); // получаем категории и метки
			if( $res )
				foreach( $res as $tag )
					$out .= ", $tag->name";

			$out = ltrim($out, ', ');
		}
	}
	elseif ( is_category() || is_tag() || is_tax() ){
		$term = get_queried_object();

		// wp 4.4
		if( function_exists('get_term_meta') ){
			$out = get_term_meta( $term->term_id, "keywords", true );
		}
		else{
			preg_match( '!\[keywords=([^\]]+)\]!iU', $term->description, $match );
			$out = isset($match[1]) ? $match[1] : '';
		}

	}

	if( $out && $def_keywords )
		$out = $out .', '. $def_keywords;

	if( $out )
		return print "<meta name=\"keywords\" content=\"$out\" />\n";
}

/**
 * Метатег robots
 *
 * Чтобы задать свои атрибуты метатега robots записи, создайте произвольное поле с ключом robots
 * и необходимым значением, например: noindex,nofollow
 *
 * Укажите параметр $allow_types, чтобы разрешить индексацию типов страниц.
 *
 * @ $allow_types Какие типы страниц нужно индексировать (через запятую):
 *                cpage, is_category, is_tag, is_tax, is_author, is_year, is_month, is_day, is_search, is_feed, is_post_type_archive, is_paged
 *                (можно использовать любые условные теги в виде строки)
 *                cpage - страницы комментариев
 * @ $robots      Как закрывать индексацию: noindex,nofollow
 *
 * version 0.5
 */
function kama_meta_robots( $allow_types = 'cpage, is_category, is_tag, is_tax, is_paged, is_post_type_archive', $robots = 'noindex,nofollow' ){
	global $post;

	if( ( is_home() || is_front_page() ) && ! is_paged() ) return;

	if( is_singular() ){
		$robots = get_post_meta( $post->ID, 'robots', true );
	}
	else {
		$types = preg_split('~[, ]+~', $allow_types );
		$types = array_filter( $types );

		foreach( $types as $type ){
			if( $type == 'cpage' && strpos($_SERVER['REQUEST_URI'], '/comment-page') ) $robots = false;
			elseif( function_exists($type) && $type() )                                $robots = false;
		}
	}

	$robots = apply_filters('kama_meta_robots_close', $robots );

	if( $robots ) echo "<meta name=\"robots\" content=\"$robots\" />\n";
}

Подключение

Чтобы код начал работать его нужно скопировать в файл темы functions.php.

Другой вариант подключения без functions.php

Если по какой-либо причине нужно подключить функции напрямую.

  1. Размещаем код выше в файле темы functions.php.

  2. Устанавливаем заголовок

    <title><?php echo kama_meta_title (" | "); ?></title>

    этой строкой мы заменяем существующий в header.php заголовок, примерно такой (с default темы):

    <title><?php wp_title('«', true, 'right'); ?> <?php bloginfo('name'); ?></title>
  3. В header.php в head части вызываем функции:

    <?php 
    kama_meta_description(); 
    kama_meta_keywords();
    kama_meta_robots();
    ?>

Заметка для версий WP 4.4. и выше

С версии 4.4. в WP элементам таксономии можно создавать метаполя и код из указанной статьи использует их, а не шорткоды.

Такие метаполя добавить очень просто и это удобнее чем шорткоды...

Чтобы добавить метаполя description и keywords к терминам используй пример из хука taxonomy-_edit_form_fields.

Далее, код из этой статьи сделает все сам...

Возможные проблемы: перезапись заголовков

Во многих темах заголовки сами генерируются так как нужно, поэтому часто перезапись заголовков вообще не нужна. Я говорю о такой структуре заголовков: <название страницы (учитывая метки, категории и т.п.)> | <Название блога/сайта>.

Перезапись нужна, если для новостей вы хотите использовать заголовки отличные от названия поста/страницы и с учетом некоторых особенностей. Например, заголовок у страницы навигации с пометкой какая по счету эта страница и т.п. Вся структура реализовывается, грубо говоря, двумя функциями WP wp_title() и get_bloginfo('name') с внедрением условий.

Сравнение СЕО плагинов platinum SEO Pack и All in One SEO Pack и отказ от них 193 комментария
Полезные 7 Вопросы 2 Все
  • Михаил cайт: trapeznaya.ucoz.ru
    @

    Не в упрек а в дружбу хочу заметить, что на некоторых ваших страницах такой код

    <meta property="og:title" content="get_the_post_thumbnail()" />

    в частности 'ссылка', думаю и у других такое может быть. Буду рад за ответ!

    Ответить8 дней назад #
    • Kama4090

      Не понял комментария unknw

      Ответить7 дней назад #
      • Михаил cайт: trapeznaya.ucoz.ru
        @

        ..Если открыть страницу в firefox и просмотреть код то видно что скрипт content="get_the_post_thumbnail()" обработался как строка.

        Ответить6 дней назад #
        • Kama4090

          Все равно не понял, а как должно быть? Это заголовок текущей странницы...

          Ответить6 дней назад #
  • Михаил cайт: trapeznaya.ucoz.ru
    @

    По предыдущему я ступил. А по коду нужно по моему доработать...
    Если на странице в записи используется шорткод, например в галерее, то в мета описание выводит так -description = [gallery link="file" ids="487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511"]

    Ответить6 дней назад #
    1
    • Kama4090

      Ну так укажи цитату, где будет нормально описание...

      Ответить6 дней назад #
      • Михаил cайт: trapeznaya.ucoz.ru
        @

        $out = preg_replace("@\[[^\]]+]\]@", '', $out); // удаляем шоткоды тогда эта строка зачем, она ведь должна удалять шорткоды.

        Ответить6 дней назад #
        1
        • Kama4090

          Ошибочка - лишний ]... Так правильно:

          $out = preg_replace('~\[[^\]]+\]~', '', $out); // удаляем шоткоды

          Спасибо! thank_you

          Ответить6 дней назад #
          • Михаил cайт: trapeznaya.ucoz.ru
            @

            Может этот код лучше разместить до if( $out ){ чтобы не выводить пустой discription;

            Ответить5 дней назад #

Здравствуйте, !

Ваш комментарий