Найти тему
Контент менеджер

Разметка schema.org для меню в Wordpress

В одном из проектов на Wordpress захотелось реализовать микроразметку меню schema.org. Долго искал рабочий код, который можно вставить в то место, где будет выводится меню.

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

<?
// Заносим меню в переменную, отключая вывод меню, чтобы дальше с ней работать. Также сразу присваиваем врапперу атрибуты разметки.
$temp_menu = wp_nav_menu(

array(

'theme_location' => 'primary',

'menu_class'     => 'nav-menu',

'echo'            => false,

'items_wrap'      => '<ul id="%1$s" class="%2$s" itemscope itemtype="http://www.schema.org/SiteNavigationElement">%3$s</ul>',

));
$temp_menu = str_replace("<a", "<a itemprop='url' ", $temp_menu); // Ставим атрибут для пунктов меню через замену

preg_match_all("~<a (.*?)>(.*)</a>~", $temp_menu, $matchesz); // Через регулярное выражение находим все теги "a", чтобы осуществить поиск тега "span"


foreach($matchesz[0] as $value){
// Ищем в текущем теге "a" вложенный тег "span"
if(strpos($value, "<span") === false){ // Если текущий тег "a" не имеет вложенного тега "span", через регулярное выражение обворачиваем содержимое тега "a" в "span" и ставим ему атрибут разметки
$temp_value = preg_replace("~<a (.*?)>(.*)</a>~", "<a $1><span itemprop='name'>$2</span></a>", $value);
$temp_menu = str_replace($value, $temp_value, $temp_menu);
}else{ // Если тег "span" найден, через замену ставим ему атрибут разметки
$temp_value = str_replace("<span", "<span itemprop='name'", $value);
$temp_menu = str_replace($value, $temp_value, $temp_menu);
}
}
echo $temp_menu;
?>

В итоге получаем такой результат

разметка schema.org для меню в wordpress
разметка schema.org для меню в wordpress