Микроразметка кулинарного сайта. Комбинированный вариант: поля и функции

Приветствую! Предлагаю другой способ микроразметки рецептов на кулинарном сайте. Данный способ подходит для действующих сайтов с большим количеством записей.

А теперь пройдемся по пунктам из видео более подробно…

к содержанию

Добавляем произвольные поля

Чтобы добавить произвольные поля я использовал в данном случае плагин Advanced Custom Fields.

Микроразметка кулинарного сайта

После установки плагина создавайте новую группу полей и уже в этой группе вам надо будет сделать 5 полей:

  • Количество порций
  • Национальная кухня
  • Метод приготовления
  • Время на подготовку
  • Время приготовления

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

к содержанию

Импорт полей

Можно сделать проще.

Под кнопкой лежит файл .xml. В архиве. Скачивайте его и распаковывайте.

[download url=»https://wpruse.ru/wp-content/uploads/2015/09/advanced-custom-field-export.zip» title=»Файл импорта полей»]

Потом идете Админпанель — Инструменты — Импорт

Микроразметка кулинарного сайта

Устанавливаете плагин для импорта записей. И запускаете импорт

Микроразметка кулинарного сайта

Указываете файл с полями и импортируете. Ваши поля готовы

к содержанию

Выводим поля

Итак. Поля сделали теперь их надо вывести. Для этого открываем файл single.php или тот файл который отвечает за вывод записи (см. видео выше) и в самом верху обозначаем переменные, в которые записываем значения наши полей

<?php
$recipe_cuisine  = get_field('artabr_recipe_recipeCuisine'); // национальная кухня
$recipe_method  = get_field('artabr_recipe_cookingMethod'); // метод приготовления
$recipe_yield  = get_field('artabr_recipe_recipeYield'); // количество порций
$prep_time = artabr_convert_minute_hour( get_field('artabr_recipe_prepTime') ); //время подготовки
$cook_time = artabr_convert_minute_hour( get_field('artabr_recipe_cookTime') ); // время приготовления
$total_time = artabr_convert_minute_hour( artabr_calc_total_cook_time() ); // общее время
?>

Дальше ищем нужное нам место в файле, для вывода значений наших полей. Как правило такие метаданные выводит сразу под заголовком, так что ищем функцию the_title и где-нибудь ниже выводим наши поля.

Можно использовать мой код

<?php if(!in_category(243)) { ?>// проверяем, если запись НЕ принадлежит указанной рубрике, то выводим поля. Если надо указать несколько рубрики то пишем так: if (!in_category(array(ID рубрик чере запятую)))
	<div class="metadata-recipe">
		// метод приготовления
		<?php if ( $recipe_method ) { ?>
			<span class="recipe-method"><?php echo 'Метод: '; ?><span class="recipe" itemprop="cookingMethod"><?php echo $recipe_method; ?></span></span>
		<?php } ?>
		// количестов порций
		<?php if ( $recipe_yield ) { ?>
		<span class="recipe-yield">
			<?php echo 'Порций: '; ?><span class="recipe" itemprop="recipeYield"><?php echo $recipe_yield; ?></span></span>
		<?php } ?>
		// национальность
		<?php if ( $recipe_cuisine) { ?>
			<span class="recipe-cuisine"><?php echo 'Кухня: '; ?><span class="recipe" itemprop="recipeCuisine"><?php echo $recipe_cuisine; ?></span></span>
		<?php } ?>
		// время на подготовку
		<?php if ( $prep_time ) { ?>
			<span class="prep-time"><?php echo 'Время на подготовку: '; ?>
			<meta itemprop="prepTime" content="<?php echo schema_prep_time(); ?>"> // вывод времени для раметки в формате ISO
			<span class="the-time"><span class="dashicons dashicons-clock"></span> <?php echo $prep_time; ?></span></span>
		<?php } ?>
		// время приготовления и общее время
		<?php if ( $cook_time ) { ?>
			<span class="cook-time"><?php echo 'Время приготовления: '; ?>
			<meta itemprop="cookTime" content="<?php echo schema_cook_time(); ?>"> // вывод времени для раметки в формате ISO
			<span class="the-time"><span class="dashicons dashicons-clock"></span> <?php echo $cook_time; ?></span>
			<meta itemprop="totalTime" content="<?php echo schema_total_time(); ?>">// вывод времени для раметки в формате ISO
			</span>
		<?php } ?>
	</div>
<?php } ?>

Весь код откомментирован. Если что не понятно, спрашиваем в комментариях.

к содержанию

Подключаем функции автоматической разметки

В файл functions.php добавляем несколько функций:

  • Разметка изображений
  • Разметка ингредиентов
  • пересчет и разметка времени
/* ------------------------------------------------------------------------- *
*  микроразметка изображений 
/* ------------------------------------------------------------------------- */
// ищем все картинки в записи и размечаем их
function micro_image($content) {
	$content = str_replace('<img', '<img itemprop="image"', $content);
	return $content;
}
add_filter('the_content', 'micro_image');

// ищем первую из всех картинок в записи и размечаем ее по другому, если запись НЕ принадлежит рубрике Новости
function first_micro_image( $content ) {
	if(!in_category(243)) {
		$content = preg_replace(array('{<img itemprop="image"}'), array('<img itemprop=" image resultPhoto "'),$content, 1);
	}
	return $content;
}
add_filter( 'the_content', 'first_micro_image' );

/* ------------------------------------------------------------------------- *
 *  микроразметка ингредиентов, код взят здесь http://wp-fairytale.com/useful_code/kak-sdelat-mikrorazmetku-schema-org-dlya-retseptov.html
/* ------------------------------------------------------------------------- */
function ingredients($ingr){ 
	if(!in_category(243)) { // ищем нумерованный список в записи и размечаем его как ингредиенты, если запись НЕ принадлежит рубрике Новости
		$ingr = Preg_Replace_Callback('!<ol>(.*?)</ol>!si', Create_Function('$matches','Return Str_Replace("<li>", "<li itemprop=\"ingredients\" class= \"ingredient\">", $matches[0]);'),$ingr);
	}     
	return $ingr;      
}
add_filter('the_content', 'ingredients');

/**
 * Пересчет времени из минут в часы
 */
if ( ! function_exists( 'artabr_convert_minute_hour' ) ) {
 function artabr_convert_minute_hour( $time ) {
 $hours_postfix = '&nbsp;час';
 $minutes_postfix = '&nbsp;мин';
     settype( $time, 'integer' );
     if ( $time < 1 ) {
         return;
     }
     $hours = floor( $time / 60 );
     $minutes = $time % 60;
     if ( $time < 60 ) {
      $content = $minutes . $minutes_postfix;
     } else {
   $content = $hours . $hours_postfix . '&ensp;' . $minutes . $minutes_postfix;
     }
     return $content;
 }
}
/**
 * Подсчет общего времени
 */
if ( ! function_exists( 'artabr_calc_total_cook_time' ) ) {
 function artabr_calc_total_cook_time() {
	 global $post;
	 $prep_time = (int) ( get_field('artabr_recipe_prepTime')); // здесь указывается наше поле времени на подготовку
	 $cook_time = (int) ( get_field('artabr_recipe_cookTime') );// здесь указывается наше поле времени на приготовление
	 $total_time = $prep_time + $cook_time; // получаем общее время
 return $total_time;
 }
}

/**
 * Пересчет времени в формат ISO8601
 */
if ( ! function_exists( 'schema_convert_minute_hour' ) ) {
 function schema_convert_minute_hour( $time ) {
 $hours_postfix = 'h';
 $minutes_postfix = 'm';
     settype( $time, 'integer' );
     if ( $time < 1 ) {
         return;
     }
     $hours = floor( $time / 60 );
     $minutes = $time % 60;
     if ( $time < 60 ) {
      $content = $minutes . $minutes_postfix;
     } else {
    $content = $hours . $hours_postfix . ' ' . $minutes . $minutes_postfix;
     }
     return $content;
 }
}
/**
 * Пересчет времени подготовки в формат ISO8601
 */
if ( ! function_exists( 'schema_prep_time' ) ) {
 function schema_prep_time() {
 global $post;
 $prep_time = schema_convert_minute_hour( get_field('artabr_recipe_prepTime') ); // здесь указывается наше поле времени на подготовку и получаем время в формате ISO
 $prep_time_alt = strtoupper( str_replace( array( ' ', '-', ',' ), array( '' ), $prep_time ) );
 $prep_time_schema = 'PT' . $prep_time_alt;
 return $prep_time_schema;
 }
}
/**
 * Время приготовления в формат ISO8601
 */
if ( ! function_exists( 'schema_cook_time' ) ) {
 function schema_cook_time() {
 global $post;
 $cook_time = schema_convert_minute_hour( get_field('artabr_recipe_cookTime') ); // здесь указывается наше поле времени на приготовление и получаем время в формате ISO
 $cook_time_alt = strtoupper( str_replace( array( ' ', '-', ',' ), array( '' ), $cook_time ) );
 $cook_time_schema  = 'PT' . $cook_time_alt;
 return $cook_time_schema;
 }
}
/**
 * Пересчет общего времени в формат ISO8601
 */
if ( ! function_exists( 'schema_total_time' ) ) {
 function schema_total_time() {
 global $post;
 $total_time = schema_convert_minute_hour ( artabr_calc_total_cook_time() );
 $total_time_alt = strtoupper( str_replace( array( ' ', '-', ',' ), array( '' ), $total_time ) );
 $total_time_schema = 'PT' . $total_time_alt;
 return $total_time_schema;
 }
}

Для тех, кто не любит ковыряться в кодах, предлагаю скачать простой плагин, который заменит все действия со вставкой в файл functions.php. Ну и сайт ваш не будет вываливаться в белый экран в случае какой-нибудь ошибки

[download url=»https://wpruse.ru/wp-content/uploads/2015/09/Recipe-Functions.zip» title=»Recipe Functions»]

Плагин устанавливается штатным образом…

к содержанию

Добавляем общую разметку

Ну что ж, поля есть, картинки разметили, ингредиенты то же. Осталось только разметить саму запись и сказать роботам, что это рецепт.

Для этого находим тег с которого начинается наша запись.

Микроразметка кулинарного сайта

Чаще всего это тег article, но может различаться в зависимости от темы.

Так, нашли нужный тег и вместо него добавляем такой код

<?php if(!in_category(243)) { ?> // если запись НЕ принадлежит рубрике Новости, то размечаем ее как рецепты
	<article itemscope itemtype="http://schema.org/Recipe">
<?php } else { ?> // в противном случае, она будет записью
	<article  itemscope itemtype="http://schema.org/BlogPosting">
<?php } ?>
Внимание! Будьте аккуратны и делайте бекапы

Ну вроде и все. Если есть вопросы, пишем в комментариях. И незабывем поддержать лайком

Всегда ваш, Артем