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

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

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

к содержанию

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

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

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

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

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

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

к содержанию

Импорт полей

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

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

Скачать: Файл импорта полей
Скачано: 52, размер: 2.2 KB, дата: 20.Мар.2017

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

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

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

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

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

к содержанию

Выводим поля

Итак. Поля сделали теперь их надо вывести. Для этого открываем файл 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. Ну и сайт ваш не будет вываливаться в белый экран в случае какой-нибудь ошибки

Скачать: Recipe Functions
Скачано: 45, размер: 1.7 KB, дата: 20.Мар.2017

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

к содержанию

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

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

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

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

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

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

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

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

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

25 комментариев
  • Александр

    30.10.2015

    Здравствуйте Артем!

    У меня вопрос несколько о другом, хотя совсем рядом:

    Есть много постов в которые при создании публикаций в ручную нужно вставлять МЕНЮ-ЯКОРЬ для удобства навигации по статье пример:

    Стандарт
    Фотографии
    Видео
    Объявления
    Комментарии

    Как реализовать автоматизацию вывода такого меню в публикациях для КОНКРЕТНОЙ РУБРИКИ к которой прикреплены данные публикации.
    Я думаю можно произвольным полем и значением выводить, но нужно «разжевать» знания не позволяют :).
    Заранее благодарен за ответ.

    • Артем

      30.10.2015

      Добрый день! Хм, а меню одно и то же всегда или собирается из заголовков в статье?

      • Александр

        31.10.2015

        Меню одно и то. Я ведь понимаю что если-бы HTML МЕНЮ для каждой публикации разное, то это существенно усложняет задачу.

        Даже со своими знаниями я понимаю что такое реализуемо. На своей теме я реализовал вывод публикаций НА СТАНИЦЕ из определенной рубрики посредством дополнительного поля. Но вот как реализовать автоматизацию вывода такого меню в публикациях для КОНКРЕТНОЙ РУБРИКИ не знаю.

        Был совет:

        КОД МЕНЮ

        Но что-то здесь не то, слишком просто.

        • Александр

          31.10.2015

          Оооо а что PHP не отображается.

          • Артем

            31.10.2015

            Отображается. надо использовать тег pre

        • Артем

          31.10.2015

          Ну почему, оглавление можно автоматом собирать по заголовкам в тексте, если масса решений и плагинов.
          Если меню одно и то же то можно примерно так делать

          function menu_oglavl($content){ 
          	if(!in_category(id рубрики)) { // надо указать id рубрики
          		$menu_content = 'код меню';// в одинарных кавычках указываем код меню
          		$menu_content .= $content;
          		return $menu_content; 
          	}     
          }
          add_filter('the_content', 'menu_oglavl');
          

          Таким образом, меню должно появиться перед текстом записи, если запись принадлежить определенной рубрике

  • Александр

    31.10.2015

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

    • Артем

      31.10.2015

      На страницах не должен отображаться, в коде ошибочка. Пробуйте так

      function menu_oglavl($content){ 
      	if(in_category(id рубрики) && !is_page()) { // надо указать id рубрики
      		$menu_content = 'код меню';// в одинарных кавычках указываем код меню
      		$menu_content .= $content;
      		return $menu_content; 
      	}     
      }
      add_filter('the_content', 'menu_oglavl');
      

      Должно сработать

  • Александр

    01.11.2015

    Здравствуйте Артем!

    Теперь вообще ни на страницах ни в публикациях ни чего не отображается.
    Теперь ошибка еще существенней.

    • Артем

      01.11.2015

      Странно, проверили вроде работает. Правда надо еще проверку сделать, но это точно работает, проверял

      function menu_oglavl($content){ 
      	if(in_category(8) && !is_page()) { // надо указать id рубрики
      		$menu_content = 'код меню';// в одинарных кавычках указываем код меню
      		$menu_content .= $content;
      		return $menu_content; 
      	} else {
      		return $content; 
      	}   
      }
      add_filter('the_content', 'menu_oglavl');
      
  • Александр

    01.11.2015

    Ну как в том мультике совдеповском: «Вы гениальный механик — оставайтесь на нашей планете, будете гениальным механиком.

    Работает! Большое спасибо!
    Если Вы не против, в дальнейшем у меня будут всякого рода заказы, могу за оплату подкидывать работу.

    • Артем

      01.11.2015

      Всегда пожалуйста. Конечно не против, подкидывайте

  • Александр

    02.11.2015

    Здравствуйте Артем!

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

    • Артем

      02.11.2015

      Добрый день!
      Надо местами переменные поменять.

      function menu_oglavl($content){ 
      	if(in_category(8) && !is_page()) { // надо указать id рубрики
                      $menu_content = $content;
      		$menu_content .= 'код меню';// в одинарных кавычках указываем код меню
      		return $menu_content; 
      	} else {
      		return $content; 
      	}   
      }
      add_filter('the_content', 'menu_oglavl');
      

      Функция так работает: на вход получает контент, которых добавляется через редактор статей. И записывает его в переменную $content Ну и потом просто прислюниваем код меню или до контента или после и возвращаем уже новую переменную с контентом и меню.

  • Александр

    02.11.2015

    Работает. Спасибо!

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

    • Артем

      02.11.2015

      Пожалуйста. А почему так сложно меню создается в этаком полуавтоматическом режиме? И почему сборка по заголовкам не устраивает?

  • Александр

    02.11.2015

    Как понять — сборка по заголовкам?

    • Артем

      03.11.2015

      Очень просто. В статье или странице используются заголовки разного уровня, функция пробегает по этим заголовкам и собирает из них оглавление.
      Если заметили, на этом сайте, в верху каждого поста есть оглавление, оно собирает по используемым заголовкам, а функцию я взял у Камы http://wp-kama.ru/id_1513/kak-byistro-sozdat-soderzhanie-dlya-bolshih-postov.html — это практически плагин с кучей настроек.
      Есть и плагины подобные…

  • Александр

    04.11.2015

    Классное решение. Значительно упрощает задачу.
    Но я уже в ручную поставил якоря. Жаль что поздно увидел.

  • Александр

    04.11.2015

    Здравствуйте Артем.
    Вы знаете хорошую реализацию доски объявлений на WP.
    Я поставил плагин Ads-WordPress
    Но там по ходу пилить его и пилить, это не по моим зубам.

    • Артем

      06.11.2015

      Добрый день! Неа, не знаю, посмотрел плагин, вроде и неплохой. А какого функционала вам не хватает?

  • Александр

    08.11.2015

    Здравствуйте Артем!
    Там установка не простая. Раздуплился, функционал действительно не плохой.
    У меня есть вопросы и предложение, но здесь так долго все происходит.
    Может Вы согласитесь по Скайпу со звуком поговорить, если согласны в админке сайта видно мой E-mail, можете скинуть на почту логин.
    Было-бы очень не плохо!

    • Артем

      08.11.2015

      Добрый день!Написал на почту

  • Марат

    09.03.2017

    А может кто нибудь помочь с микроразметкой, создать произвольные пола смогу. а вот с вcвставкой кода и прочим будет проблема, в php не шарю.

    • Артем

      10.03.2017

      Я могу помочь, только сие дорогая процедура. Если сильно надо, пишите в личку

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *
php js HTML CSS Code