Как найти нужный фильтр

Случилось мне на днях доделывать один сайт…

На этом сайте присутствует страничка заказа каталожных услуг, причем группового заказа, по целой Рубрике услуг. Причем ID рубрики передается в шаблон странички с помощью GET-параметра  Заказчику непременно захотелось, чтобы у каждой странички с разными GET-параметрами использовались разные метаданные (title, keywords, description), соответствующие рубрике.

Изначально для формирования метаданных использовался SEO-плагин HEAD SPACE, который прекрасно формирует и запоминает набор метаданных в том числе для рубрик сайта. Его недостаток в данном случае оказался следующим: страница с  разными GET-параметрами для него была единой, соответственно и метаданные формировались единые, неизменяемые.

Итак, я взялся вставить:

  • в метатэг title — название рубрики, по которой производился заказ,
  • в метатэг description —  краткое описание рубрики,
  • в метатэг keywords — ключевые слова Head Space для рубрики

За работу я взялся с некоторым даже пренебрежением. Вставить в <title> название рубрики — это просто. Благо, в качестве GET-параметра на страницу передавался slug рубрики, для вывода заголовка использовалась стандартная функция wordpress wp_title(), а для разделения частей заголовка (имя страницы|имя сайта) использовалась не менее стандартная вертикальная черта. И действительно, достаточно было распилить имеющийся заголовок на части, а затем собрать по-новому, вставив  необходимое  следующим программным кодом в шаблон заголовка header.php.

Selec All Code:
1
2
3
4
5
6
7
8
//meta title
  if (isset($_GET['slug'])) {
	$slug = $_GET['slug'];
	$cattit = get_category_by_slug($slug);
	$cathed=explode('. ',$cattit->name);
	$tit=explode('|',wp_title( '|', false, 'right' ));
	echo $cathed[1].'|'.$tit[1];
//meta title

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

Для начала потребовалось найти  метатэги категории, для которых в стандартных таблицах WordPress места вроде бы нет. Единственное возможное для них место — это таблица wp_options. Чтобы не просматривать ее всю, я внес парочку уникальных слов в  метатэги и попробовал найти содержащие эти слова записи в таблице wp_options базы сайта, используя phpMyAdmin. Искомый параметр естественно нашелся, им оказался параметр под названием ‘headspace_cat_’. Посмотреть функцией var_dump() его структуру не составляло труда, как и выудить строку, содержащую набор ключевых слов.

Сложности начались дальше. Сформированные метаданные SEO-плагин выводит с помощью стандартной функции wp_head(), которая основные проблемы и создала. Мои попытки отфильтровать вносимые плагином метаданные аналогично способа с wp_title() ни к чему не привели: функция wp_head() не предназначена для какого-либо получения выдаваемых ею данных в переменную. Любое использование этой функции, даже самое экзотическое, приводит к выводу данных на страницу.

Оставалось два способа решить проблему:

  • удалить используемую функцию wp_head(), обеспечив вывод передаваемой ею информации собственным кодом  (за исключением, естественно, метаданных)
  • исключить вывод функцией wp_head() данных SEO-плагина за счет использования функции remove_action() .

Для реализации второго способа, который  я решил применить, нужно было определить, какой именно хук использует SEO-плагин. И это оказалось самой сложной задачей.   Несколькочасовые поиски информации познакомили меня с весьма полезной переменной WordPress, которая содержит информацию обо ВСЕХ действующих хуках — $wp_filter. Но переменная оказалась с хитрецой. Простой код var_dump( $wp_filter) переменную почему-то не выводил. Зато заработал следующий код:

Selec All Code:
1
2
3
4
5
6
global $wp_filter;
foreach ($wp_filter as $ind=>$wlev)
{
   echo 'ind='.$ind.' date=';
   var_dump($wlev[$ind]);
}

Переменная раскрылась во всей красе. Обнаружились несколько «акций», привинченных к событию ‘wp_head’. А уж когда я вывел  их более подробно, то получил еще и раскладку по приоритету:

Selec All Code:
1
2
3
4
5
6
global $wp_filter;
foreach ($wp_filter['wp_head'] as $ind=>$wlev)
{
   echo 'ind='.$ind.' date=';
   var_dump($wlev[$ind]);
}

Среди них оказалось несколько подозрительных акций с приоритетом 10 — длинное название, похожее на MD5 код плюс ключевые в моей ситуации буквы ‘wp_head’. Они были явно созданы, чтобы усложнить мне жизнь, подумал я, и опасение подтвердилось. Через несколько вызовов код МД5 поменялся. Осталась неизменной только одна составляющая —   сочетание ‘wp_head’. Судя по вредности обеих акций, они обе принадлежали SEO-плагину. А уж отключить их было проще простого:

Selec All Code:
1
2
3
4
5
6
7
8
9
10
$l=str_replace('n','',strip_tags($cattit->description));
$mydescr='';
global $wp_filter;
foreach	($wp_filter['wp_head'][10] as $ind=>$wpf) {
  $pos = strpos($ind, "wp_head");
  if ($pos>0) {
    $ll=$ind;
    remove_action('wp_head',$ind,10);
  }
}

Еще более простым оказалось собрать и вывести необходимую мета-строку из описания категории и данных плагина:

Selec All Code:
1
2
3
4
5
6
7
8
$mydescr='';
$opt=get_option('headspace_cat_'.$cattit->term_id);
$l=$opt['keywords'];
if ($l!=''){
  $mytags='';
}
wp_head();
echo $mydescr.$mytags;

Задача была решена, а я с  тех пор уверен в том, что смогу «поймать» любой хук, и разобраться, какие «акции» к нему прицеплены.

***

Хотите обсудить? Оставьте комментарий