Приветствую! Предлагаю другой способ микроразметки рецептов на кулинарном сайте. Данный способ подходит для действующих сайтов с большим количеством записей.
А теперь пройдемся по пунктам из видео более подробно…
к содержаниюДобавляем произвольные поля
Чтобы добавить произвольные поля я использовал в данном случае плагин [link]Advanced Custom Fields[/link].
После установки плагина создавайте новую группу полей и уже в этой группе вам надо будет сделать 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 = ' час'; $minutes_postfix = ' мин'; 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; } } /** * Подсчет общего времени */ 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 } ?>
Ну вроде и все. Если есть вопросы, пишем в комментариях. И незабывем поддержать лайком
Всегда ваш, Артем