<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href="/assets/xsl/rss-style.xsl" type="text/xsl"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><title>Сергей Глазов</title><subtitle>Сергей Глазов — full-stack веб-разработчик Nuxt, Laravel</subtitle><link href="https://sglazov.ru/notes/feed/" rel="self"/><link href="https://sglazov.ru"/><updated>2025-08-02T00:00:00Z</updated><id>https://sglazov.ru/</id><author><name>Сергей Глазов</name><email>sglazov@sglazov.ru</email></author><entry><title>Скрипт для вёрстки статей из Google Docs в чистый HTML c картинками для WordPress</title><link href="https://sglazov.ru/notes/google-docs-to-html/"/><published>2025-08-02T00:00:00Z</published><updated>2025-08-02T00:00:00Z</updated><id>https://sglazov.ru/notes/google-docs-to-html/</id><media:thumbnail url="https://sglazov.ru/notes/google-docs-to-html/images/covers/og.png" /><content type="html">
          &lt;ul class=&quot;menu sub-menu&quot;&gt;&lt;li class=&quot;menu__item&quot;&gt;
      &lt;a href=&quot;https://sglazov.ruundefinednotes/google-docs-to-html/&quot;
         class=&quot;menu__link link menu__link_active&quot;&gt;Описание&lt;/a&gt;
    &lt;/li&gt;&lt;li class=&quot;menu__item&quot;&gt;
      &lt;a href=&quot;https://sglazov.ruundefinednotes/google-docs-to-html/readme/&quot;
         class=&quot;menu__link link&quot;&gt;Документация&lt;/a&gt;
    &lt;/li&gt;&lt;/ul&gt;
  &lt;div class=&quot;task&quot;&gt;
  &lt;div class=&quot;task__title&quot;&gt;Задача:&lt;/div&gt;&lt;!-- /.task__title --&gt;
  &lt;div class=&quot;task__message&quot;&gt;
    На Apps Script написать скрипт для конвертации документа из Google Docs в чистый HTML с правильным именованием и хронологическим порядком картинок
  &lt;/div&gt;&lt;!-- /.task__message --&gt;
&lt;/div&gt;
&lt;p class=&quot;subtitle&quot;&gt;В Google Docs экспорт в HTML через меню «Файл» → «Сохранить как» → «Веб-страница (HTML, ZIP-архив)» — &lt;em&gt;вообще&lt;/em&gt; не работает. Точнее работает, но через жопу. Результат импорта практически использовать нельзя. На выходе будет архив, в котором кривой html-файл с десятичным кодом в unicode для всего текста, куча мусорных тегов &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; с инлайн-атрибутами и рандомными CSS-классами, странные общие глобальные стили, и, что самое удивительное, хронологический порядок картинок и их именование будет совершенно случайным.&lt;/p&gt;
&lt;aside&gt;
&lt;p&gt;Ещё в 2018-м году работа с картинками, особенно на объёмных постах была неудобной, я автоматизировал эту часть через &lt;a href=&quot;https://github.com/sglazov/google-docs-images&quot;&gt;JS-сниппет для понимания порядка картинок в HTML-экспорте Google Docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Это скорее компромисс и упрощение ручной разметки и именования.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;В июле 2024 в Google Docs &lt;a href=&quot;https://workspaceupdates.googleblog.com/2024/07/import-and-export-markdown-in-google-docs.html&quot;&gt;добавили экспорт в Markdown&lt;/a&gt; и в md-формате хронология и имена картинок — правильные! При этом картинки собираются в этом же файле в base64, что использовать сложно и рождает череду промежуточных этапов при простой казалось бы задаче «сверстать пост в блог на WordPress».&lt;/p&gt;
&lt;p&gt;С ростом редакции и блогов захотелось нормальный инструмент для &lt;em&gt;простого&lt;/em&gt; экспорта максимально чистого HTML и удобной работы с графикой в документе.&lt;/p&gt;
&lt;p&gt;Все доступные найденные инструменты — не работали. Надежда была только на прямую конвертацию средствами Apps Script. Вариант через проект в Apps Script где-то внутри уже Google Drive меня не устраивал: создание, его настройка, раздача прав доступа под каждый документ на исполнение и сложности с правами на расшаренные документы напугали объёмом и передачей знаний по проекту. Инструкцию из двух десятков шагов не каждый пройдёт до финала.&lt;/p&gt;
&lt;aside&gt;
&lt;p&gt;В &lt;a href=&quot;https://workspaceupdates.googleblog.com/2025/01/granular-oauth-consent-in-google-apps-script.html&quot;&gt;январе 2025 Google обновил модалки авторизации&lt;/a&gt; и получений разрешений, их теперь куча.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;Найден был более простой вариант: запустить отдельный сценарий в Apps Script на одном конкретном документе. Этот сценарий никуда ничего не передаёт и работает только с аккаунтом активного юзера. &lt;em&gt;Минусы сценария:&lt;/em&gt; каждый запуск нужно проходить через череду модалок разрешений самого гугла.&lt;/p&gt;
&lt;h2&gt;Чего хотелось от скрипта и почему&lt;/h2&gt;
&lt;h3&gt;Чистая и семантичная вёрстка&lt;/h3&gt;
&lt;p&gt;Если документ в самом Google Docs разметили правильно (что редакторы делают чаще всего), то его экспорт в HTML будет чистым по структуре: заголовки всех уровней будут заголовками, абзацы — абзацами, нумерованные и маркированные списки — списками. Если ссылка внешняя — взять и сразу добавить ей атрибут &lt;code&gt;rel=&amp;quot;nofollow&amp;quot;&lt;/code&gt;. Ну и поисковые роботы всё это уважают, что для контент-проектов важно.&lt;/p&gt;
&lt;h3&gt;Работа с графикой и работа с медиафайлами в WordPress&lt;/h3&gt;
&lt;p&gt;Как процесс вёрстки поста для WordPress устроен в целом упрощённо без деталей про «а как» для каждого этапа: отдельно верстается разметка, отдельно загружается пачка файлов для этого поста и используется в разметке.&lt;/p&gt;
&lt;p&gt;И вот эти промежуточные шаги, особенно если в посте картинок так с десятка два, чтобы каждую правильно именовать, например, добавив префикс после имени, которое повторяет slug поста, занимали кучу фокуса и времени. И это всё с учётом в разметке того, что WordPress будет хранить файлы по пути типа &lt;code&gt;/wp-content/uploads/2025/08/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ожидаемый результат: при запуске скрипта задаётся базовый набор параметров среди которых slug поста, например, &lt;code&gt;ya-metrika&lt;/code&gt;. Алгоритм перебора картинок возьмёт его, добавит суффикс с порядковым номером типа &lt;code&gt;ya-metrika_24&lt;/code&gt; и сложит все картинки в архив.&lt;/p&gt;
&lt;p&gt;Из архива все картинки загружаются в медиа библиотеку при создании нового поста в WordPress и все пути правильно работают.&lt;/p&gt;
&lt;h3&gt;Результат работы в едином артефакте&lt;/h3&gt;
&lt;p&gt;На выходе — один zip-архив с файлом разметки и всеми картинками из документа с правильным именованием. И поскольку мы в пределах Google Docs и Apps Script, то результат выполнения можно отправить на почту, с которой и ведётся работа с документом.&lt;/p&gt;
&lt;h3&gt;Автоматическое оглавление документа&lt;/h3&gt;
&lt;p&gt;Скорее бонусный, но приятный пункт. В самих Google Docs в панели слева есть структура документа. Почему бы её не вытащить также в кастомную разметку? Вместе с этой задачей добавляется новая задача: всем заголовкам надо добавить id, а чтобы его добавить нужна какая-то штука для транслитерации в slug-формат, чтобы из текста заголовка &lt;em&gt;«Как создать и настроить счетчик посещений»&lt;/em&gt; получился id &lt;code&gt;kak-sozdat-i-nastroit-schetchik-poseshchenij&lt;/code&gt;. Приставкой можно ещё id поста добавить, например, для уникальности.&lt;/p&gt;
&lt;h2&gt;Кому всё это надо&lt;/h2&gt;
&lt;p&gt;Контент-менеджерам, редакциям, верстальщикам — упростить рутину, автоматизировать самое нудное, ускорить процесс вёрстки и выпуска контента.&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://sglazov.ruundefinednotes/google-docs-to-html/readme/&quot;&gt;Как это работает&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Открыть документ в Google Docs;&lt;/li&gt;
&lt;li&gt;В меню «Расширения» → выбрать пункт «Apps Script»:&lt;/li&gt;
&lt;li&gt;В открывшийся редактор скопировать всё содержимое скрипта и &lt;a class=&quot;pseudo-link&quot; href=&quot;https://sglazov.ruundefinednotes/google-docs-to-html/readme/#heading-3&quot;&gt;настроить&lt;/a&gt; параметры;&lt;/li&gt;
&lt;li&gt;Нажать на иконку сохранения и после → «Выполнить»:&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;pseudo-link&quot; href=&quot;https://sglazov.ruundefinednotes/google-docs-to-html/readme/#heading-2&quot;&gt;Пройти все этапы подтверждения&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Получить письмо на почту с ZIP-архивом.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Смотрите &lt;a href=&quot;https://sglazov.ruundefinednotes/google-docs-to-html/readme/&quot;&gt;документацию&lt;/a&gt; с пошаговой инструкций прохождения этапа подтверждения.&lt;/p&gt;
&lt;h2&gt;Реальные результаты&lt;/h2&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;p&gt;Этот скрипт — настоящая находка для контент-команд, редакторов и верстальщиков! Он значительно ускоряет процесс подготовки статей, автоматизируя рутинные задачи и минимизируя ошибки при переносе текста из Google Docs в HTML.&lt;/p&gt;
&lt;p&gt;Этот инструмент серьезно упрощает жизнь контент-специалистам. Если раньше верстка статьи занимала 20-30 минут, то теперь — буквально пару кликов. Рекомендую всем, кто работает с большими объемами текстов и хочет оптимизировать процесс публикации.&lt;/p&gt;
&lt;footer&gt;— Антон&lt;/footer&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Фичи и заморочки&lt;/h2&gt;
&lt;aside&gt;
  &lt;div class=&quot;factoids&quot;&gt;
    &lt;div class=&quot;factoid&quot;&gt;
      &lt;div class=&quot;factoid__key&quot;&gt;4 параметра&lt;/div&gt;
      &lt;div class=&quot;factoid__value&quot;&gt;в конфиге для настройки документа&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/aside&gt;
&lt;div class=&quot;column-list&quot;&gt;
&lt;ul&gt;
&lt;li&gt;Семантичная чистая HTML-разметка;&lt;/li&gt;
&lt;li&gt;Поддержка форматирования текста: &lt;strong&gt;жирный&lt;/strong&gt;, &lt;em&gt;курсив&lt;/em&gt;, &lt;s&gt;зачёркнутый&lt;/s&gt;;&lt;/li&gt;
&lt;li&gt;Хронологический порядок картинок;&lt;/li&gt;
&lt;li&gt;Именование картинок по &lt;code&gt;slug&lt;/code&gt; поста;&lt;/li&gt;
&lt;li&gt;Базовый &lt;code&gt;alt&lt;/code&gt; для всех картинок;&lt;/li&gt;
&lt;li&gt;Формирование &lt;code&gt;src&lt;/code&gt; для картинок под файловую структуру WordPress;&lt;/li&gt;
&lt;li&gt;Автоматически атрибуты размеров &lt;code&gt;width&lt;/code&gt; и &lt;code&gt;height&lt;/code&gt; для картинок;&lt;/li&gt;
&lt;li&gt;Картинки размечены, как ссылки для открытия полного изображения по клику;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rel=&amp;quot;nofollow&amp;quot;&lt;/code&gt; для внешних ссылок;&lt;/li&gt;
&lt;li&gt;Автоматические &lt;code&gt;slug id&lt;/code&gt; для заголовков транслитом;&lt;/li&gt;
&lt;li&gt;Форматирование маркированных и нумерованных списков;&lt;/li&gt;
&lt;li&gt;Форматирование таблиц;&lt;/li&gt;
&lt;li&gt;Автоматическое оглавление документа;&lt;/li&gt;
&lt;li&gt;Отправка письма с результатом в архиве;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;section class=&quot;purchase&quot;&gt;
  &lt;form
    action=&quot;/api/pay/&quot;
    method=&quot;post&quot;
    class=&quot;purchase__form&quot;
    id=&quot;js_purchase&quot;
  &gt;
    &lt;input type=&quot;hidden&quot; name=&quot;price&quot; value=&quot;2500&quot;&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;description&quot; value=&quot;Оплата скрипта google-docs-to-html для конвертации Google Docs в HTML&quot;&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;product&quot; value=&quot;google-docs-to-html&quot;&gt;
    &lt;div class=&quot;purchase__description&quot;&gt;
      &lt;h2 class=&quot;purchase__title&quot;&gt;Купить Apps Script для вёрстки статей из Google Docs в WordPress&lt;/h2&gt;&lt;!-- /.purchase__title --&gt;
      &lt;div class=&quot;purchase__price&quot;&gt;
        &lt;div class=&quot;purchase-price&quot;&gt;
          2 500 ₽
        &lt;/div&gt;&lt;!-- /.purchase-price --&gt;
      &lt;/div&gt;&lt;!-- /.purchase__price --&gt;
    &lt;/div&gt;&lt;!-- /.purchase__description --&gt;
    &lt;div class=&quot;purchase-form&quot;&gt;
      &lt;fieldset class=&quot;purchase-form__fieldset&quot;&gt;
        &lt;legend class=&quot;purchase-form__legend&quot;&gt;Куда отправить скрипт, инструкцию и чек&lt;/legend&gt;
        &lt;div class=&quot;input input_dynamic-label&quot;&gt;
          &lt;label class=&quot;input__label&quot;
                 for=&quot;email&quot;&gt;Электронная почта&lt;/label&gt;
          &lt;input class=&quot;input__widget&quot;
                 type=&quot;email&quot;
                 id=&quot;email&quot;
                 name=&quot;email&quot;
                 required
                 placeholder=&quot;Адрес эл.почты&quot;&gt;
        &lt;/div&gt;&lt;!-- /.input --&gt;
      &lt;/fieldset&gt;&lt;!-- /.purchase-form__box --&gt;
      &lt;nav class=&quot;purchase-form__actions&quot;&gt;
        &lt;button
          class=&quot;button js_pay-button&quot;
          type=&quot;submit&quot;
          disabled
        &gt;
          Заплатить 2 500 ₽
        &lt;/button&gt;
        &lt;div class=&quot;purchase-form__status js_fields-info&quot;&gt;
          Осталось заполнить:
          &lt;span class=&quot;js_fields-info-list&quot;&gt;
            &lt;a href=&quot;https://sglazov.ruundefined#terms&quot; class=&quot;pseudo-link&quot;&gt;согласие с офертой&lt;/a&gt;,
            &lt;a href=&quot;https://sglazov.ruundefined#privacy-policy&quot; class=&quot;pseudo-link&quot;&gt;согласие с политикой конфиденциальности&lt;/a&gt; и
            &lt;a href=&quot;https://sglazov.ruundefined#email&quot; class=&quot;pseudo-link&quot;&gt;электронную почту&lt;/a&gt;
          &lt;/span&gt;
        &lt;/div&gt;&lt;!-- /.purchase-form__status --&gt;
      &lt;/nav&gt;&lt;!-- /.purchase-form__actions --&gt;
      &lt;div class=&quot;purchase-form__agreement&quot;&gt;
        &lt;p&gt;Нажимая на кнопку «&lt;em&gt;Заплатить 2 500 ₽&lt;/em&gt;», вы соглашаетесь
          &lt;label
            class=&quot;choice choice_checkbox is-mini&quot;
            for=&quot;privacy-policy&quot;
          &gt;
            &lt;input
              class=&quot;choice__widget&quot;
              type=&quot;checkbox&quot;
              id=&quot;privacy-policy&quot;
              name=&quot;privacy-policy&quot;
              required
            &gt;
            &lt;span class=&quot;choice__label&quot;&gt;с &lt;a href=&quot;https://sglazov.ruundefinedlegal/privacy-policy/&quot; class=&quot;link external-link&quot; target=&quot;_blank&quot;&gt;политикой конфиденциальности&lt;/a&gt;&lt;/span&gt;
          &lt;/label&gt;,
          &lt;label
            class=&quot;choice choice_checkbox is-mini&quot;
            for=&quot;terms&quot;
          &gt;
            &lt;input
              class=&quot;choice__widget&quot;
              type=&quot;checkbox&quot;
              id=&quot;terms&quot;
              name=&quot;terms&quot;
              required
            &gt;
            &lt;span class=&quot;choice__label&quot;&gt;с &lt;a href=&quot;https://sglazov.ruundefinedlegal/terms/&quot; class=&quot;link external-link&quot; target=&quot;_blank&quot;&gt;офертой&lt;/a&gt;&lt;/span&gt;
          &lt;/label&gt;, а ещё с тем, что вы великолепны.&lt;/p&gt;
      &lt;/div&gt;&lt;!-- /.purchase-form__agreement --&gt;
    &lt;/div&gt;&lt;!-- /.purchase-form --&gt;
  &lt;/form&gt;&lt;!-- /.purchase__form --&gt;
  &lt;aside class=&quot;purchase__aside&quot;&gt;
    &lt;h4&gt;Письмо после оплаты&lt;/h4&gt;
    &lt;p&gt;На почту придёт ссылка для скачивания скрипта, &lt;a class=&quot;link&quot; href=&quot;https://sglazov.ruundefinednotes/google-docs-to-html/readme/&quot;&gt;инструкция&lt;/a&gt; по запуску внутри Google Docs и чек.&lt;/p&gt;
    &lt;h4&gt;Проблемы при оплате&lt;/h4&gt;
    &lt;p&gt;Если что-то идет не так, напишите мне на &lt;a class=&quot;link&quot; href=&quot;https://sglazov.ruundefinedmailto:sglazov@sglazov.ru&quot;&gt;sglazov@sglazov.ru&lt;/a&gt;.&lt;/p&gt;
  &lt;/aside&gt;&lt;!-- /.purchase__aside --&gt;
&lt;/section&gt;

        </content><category term="Google Docs, Apps Script, WordPress, HTML, JS" /></entry><entry><title>Скрипт для проброса UTM-меток на внутренние и внешние ссылки</title><link href="https://sglazov.ru/notes/utm-forward/"/><published>2025-04-05T00:00:00Z</published><updated>2025-04-05T00:00:00Z</updated><id>https://sglazov.ru/notes/utm-forward/</id><media:thumbnail url="https://sglazov.ru/notes/utm-forward/images/covers/og.png" /><content type="html">
          &lt;ul class=&quot;menu sub-menu&quot;&gt;&lt;li class=&quot;menu__item&quot;&gt;
      &lt;a href=&quot;https://sglazov.ruundefinednotes/utm-forward/&quot;
         class=&quot;menu__link link menu__link_active&quot;&gt;Описание&lt;/a&gt;
    &lt;/li&gt;&lt;li class=&quot;menu__item&quot;&gt;
      &lt;a href=&quot;https://sglazov.ruundefinednotes/utm-forward/readme/&quot;
         class=&quot;menu__link link&quot;&gt;Документация&lt;/a&gt;
    &lt;/li&gt;&lt;/ul&gt;
  &lt;div class=&quot;task&quot;&gt;
  &lt;div class=&quot;task__title&quot;&gt;Что происходит:&lt;/div&gt;&lt;!-- /.task__title --&gt;
  &lt;div class=&quot;task__message&quot;&gt;
    Написал клёвый скрипт для работы с UTM и простой задачей прокинуть полученные метки из источника перехода (реклама, например, или поисковая выдача) на все ссылки на странице.
  &lt;/div&gt;&lt;!-- /.task__message --&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;utm-forward.js&lt;/code&gt; — это простой и эффективный скрипт на ванильном JS без зависимостей для автоматического проброса UTM-меток на внутренние и внешние ссылки вашего сайта. Для любых CMS, конструкторов сайтов или систем обучения (LMS).&lt;/p&gt;
&lt;h2&gt;Проблема и решение&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Проблема:&lt;/strong&gt; Когда пользователь переходит по ссылке с UTM-метками на ваш сайт, а затем кликает по внутренней ссылке, все UTM-параметры теряются. Это приводит к неточной аналитике и невозможности понять, какие маркетинговые каналы действительно приносят конверсии.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Решение:&lt;/strong&gt; &lt;code&gt;utm-forward.js&lt;/code&gt; автоматически добавляет UTM-метки ко всем внутренним и внешним ссылкам на вашем сайте, сохраняя информацию об источнике трафика на протяжении всего пути пользователя.&lt;/p&gt;
&lt;h2&gt;Кому подходит &lt;code&gt;utm-forward.js&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;Всем: и без программистов и программирования всё можно настроить отслеживание UTM: нужно просто подключить скрипт на сайте или в конструкторе.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Маркетологам&lt;/strong&gt; — для точного отслеживания эффективности рекламных кампаний&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Образовательным платформам&lt;/strong&gt; — для понимания, откуда приходят студенты&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Конструкторам сайтов&lt;/strong&gt; — для улучшения аналитики клиентов&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Владельцам интернет-магазинов&lt;/strong&gt; — для отслеживания пути пользователя от рекламы до покупки&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Как это работает?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Пользователь переходит на ваш сайт по ссылке с UTM-метками&lt;/li&gt;
&lt;li&gt;&lt;code&gt;utm-forward.js&lt;/code&gt; сохраняет эти метки в localStorage браузера&lt;/li&gt;
&lt;li&gt;Когда пользователь кликает по любой ссылке на сайте, скрипт автоматически добавляет сохраненные UTM-метки&lt;/li&gt;
&lt;li&gt;Аналитика показывает полный путь пользователя от первого клика до конверсии&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Преимущества&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Простая установка&lt;/strong&gt; — один JavaScript-файл и несколько строк кода&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Не требует серверной части&lt;/strong&gt; — работает полностью на стороне клиента&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Совместимость&lt;/strong&gt; — работает со всеми популярными CMS и конструкторами сайтов&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Гибкая настройка&lt;/strong&gt; — можно настроить, какие ссылки должны получать UTM-метки&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Поддержка&lt;/strong&gt; — регулярные обновления и техническая поддержка&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Примеры использования&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Образовательные платформы&lt;/strong&gt; — отслеживайте, какие рекламные кампании приводят к регистрации на курсы и покупке подписок&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Конструкторы сайтов&lt;/strong&gt; — помогите клиентам понять, какие маркетинговые каналы приносят им трафик и конверсии&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Интернет-магазины&lt;/strong&gt; — отслеживайте путь пользователя от первого клика по рекламе до покупки, даже если он посетил несколько страниц&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Реальные результаты&lt;/h2&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;p&gt;Скрипт решил проблему, которая отняла кучу времени. Примеры кода найденные на просторах интернета не работали. Реализовать решение через httacess не получилось. Скрипт легок в настройке и установке.&lt;/p&gt;
&lt;footer&gt;— Михаил&lt;/footer&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Фичи&lt;/h2&gt;
&lt;aside&gt;
  &lt;div class=&quot;factoids&quot;&gt;
    &lt;div class=&quot;factoid&quot;&gt;
      &lt;div class=&quot;factoid__key&quot;&gt;6 параметров&lt;/div&gt;
      &lt;div class=&quot;factoid__value&quot;&gt;для настройки скрипта в его конфиге&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/aside&gt;
&lt;h3&gt;Основные возможности&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Автоматическое сохранение UTM-меток при первом переходе&lt;/li&gt;
&lt;li&gt;Добавление UTM-меток ко всем внутренним ссылкам&lt;/li&gt;
&lt;li&gt;Добавление UTM-меток к внешним ссылкам (опционально)&lt;/li&gt;
&lt;li&gt;Настройка исключений для определенных ссылок&lt;/li&gt;
&lt;li&gt;Совместимость с Google Analytics, Яндекс.Метрикой и другими системами аналитики&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Заморочки&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Работает без перезагрузки страницы&lt;/li&gt;
&lt;li&gt;Не влияет на скорость загрузки сайта&lt;/li&gt;
&lt;li&gt;Совместим со всеми современными браузерами&lt;/li&gt;
&lt;li&gt;Не требует jQuery или других библиотек&lt;/li&gt;
&lt;li&gt;Минимальный размер скрипта&lt;/li&gt;
&lt;/ul&gt;
&lt;section class=&quot;purchase&quot;&gt;
  &lt;form
    action=&quot;/api/pay/&quot;
    method=&quot;post&quot;
    class=&quot;purchase__form&quot;
    id=&quot;js_purchase&quot;
  &gt;
    &lt;input type=&quot;hidden&quot; name=&quot;price&quot; value=&quot;990&quot;&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;description&quot; value=&quot;Оплата JS-скрипта utm-forward.js для проброса UTM-меток&quot;&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;product&quot; value=&quot;utm-forward&quot;&gt;
    &lt;div class=&quot;purchase__description&quot;&gt;
      &lt;h2 class=&quot;purchase__title&quot;&gt;Купить JS скрипт проброса UTM-меток&lt;/h2&gt;&lt;!-- /.purchase__title --&gt;
      &lt;div class=&quot;purchase__price&quot;&gt;
        &lt;div class=&quot;purchase-price&quot;&gt;
          990 ₽
        &lt;/div&gt;&lt;!-- /.purchase-price --&gt;
      &lt;/div&gt;&lt;!-- /.purchase__price --&gt;
    &lt;/div&gt;&lt;!-- /.purchase__description --&gt;
    &lt;div class=&quot;purchase-form&quot;&gt;
      &lt;fieldset class=&quot;purchase-form__fieldset&quot;&gt;
        &lt;legend class=&quot;purchase-form__legend&quot;&gt;Куда отправить скрипт, инструкцию и чек&lt;/legend&gt;
        &lt;div class=&quot;input input_dynamic-label&quot;&gt;
          &lt;label class=&quot;input__label&quot;
                 for=&quot;email&quot;&gt;Электронная почта&lt;/label&gt;
          &lt;input class=&quot;input__widget&quot;
                 type=&quot;email&quot;
                 id=&quot;email&quot;
                 name=&quot;email&quot;
                 required
                 placeholder=&quot;Адрес эл.почты&quot;&gt;
        &lt;/div&gt;&lt;!-- /.input --&gt;
      &lt;/fieldset&gt;&lt;!-- /.purchase-form__box --&gt;
      &lt;nav class=&quot;purchase-form__actions&quot;&gt;
        &lt;button
          class=&quot;button js_pay-button&quot;
          type=&quot;submit&quot;
          disabled
        &gt;
          Заплатить 990 ₽
        &lt;/button&gt;
        &lt;div class=&quot;purchase-form__status js_fields-info&quot;&gt;
          Осталось заполнить:
          &lt;span class=&quot;js_fields-info-list&quot;&gt;
            &lt;a href=&quot;https://sglazov.ruundefined#terms&quot; class=&quot;pseudo-link&quot;&gt;согласие с офертой&lt;/a&gt;,
            &lt;a href=&quot;https://sglazov.ruundefined#privacy-policy&quot; class=&quot;pseudo-link&quot;&gt;согласие с политикой конфиденциальности&lt;/a&gt; и
            &lt;a href=&quot;https://sglazov.ruundefined#email&quot; class=&quot;pseudo-link&quot;&gt;электронную почту&lt;/a&gt;
          &lt;/span&gt;
        &lt;/div&gt;&lt;!-- /.purchase-form__status --&gt;
      &lt;/nav&gt;&lt;!-- /.purchase-form__actions --&gt;
      &lt;div class=&quot;purchase-form__agreement&quot;&gt;
        &lt;p&gt;Нажимая на кнопку «&lt;em&gt;Заплатить 990 ₽&lt;/em&gt;», вы соглашаетесь
          &lt;label
            class=&quot;choice choice_checkbox is-mini&quot;
            for=&quot;privacy-policy&quot;
          &gt;
            &lt;input
              class=&quot;choice__widget&quot;
              type=&quot;checkbox&quot;
              id=&quot;privacy-policy&quot;
              name=&quot;privacy-policy&quot;
              required
            &gt;
            &lt;span class=&quot;choice__label&quot;&gt;с &lt;a href=&quot;https://sglazov.ruundefinedlegal/privacy-policy/&quot; class=&quot;link external-link&quot; target=&quot;_blank&quot;&gt;политикой конфиденциальности&lt;/a&gt;&lt;/span&gt;
          &lt;/label&gt;,
          &lt;label
            class=&quot;choice choice_checkbox is-mini&quot;
            for=&quot;terms&quot;
          &gt;
            &lt;input
              class=&quot;choice__widget&quot;
              type=&quot;checkbox&quot;
              id=&quot;terms&quot;
              name=&quot;terms&quot;
              required
            &gt;
            &lt;span class=&quot;choice__label&quot;&gt;с &lt;a href=&quot;https://sglazov.ruundefinedlegal/terms/&quot; class=&quot;link external-link&quot; target=&quot;_blank&quot;&gt;офертой&lt;/a&gt;&lt;/span&gt;
          &lt;/label&gt;, а ещё с тем, что вы великолепны.&lt;/p&gt;
      &lt;/div&gt;&lt;!-- /.purchase-form__agreement --&gt;
    &lt;/div&gt;&lt;!-- /.purchase-form --&gt;
  &lt;/form&gt;&lt;!-- /.purchase__form --&gt;
  &lt;aside class=&quot;purchase__aside&quot;&gt;
    &lt;h4&gt;Письмо после оплаты&lt;/h4&gt;
    &lt;p&gt;На почту придёт ссылка для скачивания скрипта, &lt;a class=&quot;link&quot; href=&quot;https://sglazov.ruundefinednotes/utm-forward/readme/&quot;&gt;инструкция&lt;/a&gt; по установке и чек.&lt;/p&gt;
    &lt;h4&gt;Проблемы при оплате&lt;/h4&gt;
    &lt;p&gt;Если что-то идет не так, напишите мне на &lt;a class=&quot;link&quot; href=&quot;https://sglazov.ruundefinedmailto:sglazov@sglazov.ru&quot;&gt;sglazov@sglazov.ru&lt;/a&gt;.&lt;/p&gt;
  &lt;/aside&gt;&lt;!-- /.purchase__aside --&gt;
&lt;/section&gt;

        </content><category term="UTM, JS" /></entry><entry><title>Стилизуй свой RSS</title><link href="https://sglazov.ru/notes/rss-styling/"/><published>2025-03-02T00:00:00Z</published><updated>2025-03-02T00:00:00Z</updated><id>https://sglazov.ru/notes/rss-styling/</id><media:thumbnail url="https://sglazov.ru/notes/rss-styling/images/covers/og.png" /><content type="html">
          &lt;p&gt;&lt;a href=&quot;https://ru.wikipedia.org/wiki/RSS&quot;&gt;RSS&lt;/a&gt; не умер. Это не мейнстрим, но это все еще процветающий протокол, особенно среди технарей. Многие не знают, что такое RSS-лента и как им пользоваться.&lt;/p&gt;
&lt;p&gt;Большинство браузеров отображают RSS как сырые XML-файлы, что не помогает пользователям понять, в чём суть:&lt;/p&gt;
&lt;img src=&quot;https://sglazov.ruundefinedimages/rss-unstyled.png&quot; width=&quot;604&quot; alt=&quot;Пример необработанных XML-файлов RSS-лент&quot;&gt;
&lt;p&gt;В этой статье я расскажу, как оформлять RSS-ленты и одновременно обучать читателей.&lt;/p&gt;
&lt;h2&gt;XSL(T) приходит на помощь&lt;/h2&gt;
&lt;p&gt;Вот как выглядит &lt;a href=&quot;https://darekkay.com/atom.xml&quot;&gt;RSS-лента этого блога&lt;/a&gt;:&lt;/p&gt;
&lt;img src=&quot;https://sglazov.ruundefinedimages/rss-styled.png&quot; width=&quot;566&quot; alt=&quot;Пример необработанных XML-файлов RSS-лент&quot;&gt;
&lt;p&gt;Чтобы стилизовать XML-файл в браузере, необходимо предоставить информацию о стилях. Это можно сделать, &lt;a href=&quot;https://www.w3.org/TR/2010/REC-xml-stylesheet-20101028/&quot;&gt;добавив&lt;/a&gt; инструкцию обработки &lt;code&gt;xml-stylesheet&lt;/code&gt; в RSS-ленту:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;/span&gt;
&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml-stylesheet href=&quot;https://sglazov.ruundefinedrss.xsl&quot; type=&quot;text/xsl&quot;?&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;feed&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.w3.org/2005/Atom&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;media&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://search.yahoo.com/mrss/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  ...
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;feed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Атрибут &lt;code&gt;href&lt;/code&gt; указывает URL-адрес допустимого &lt;a href=&quot;https://www.w3.org/Style/XSL/WhatIsXSL.html&quot;&gt;XSL&lt;/a&gt;-файла. Вы можете &lt;a href=&quot;https://darekkay.com/assets/xsl/rss-style.xsl&quot;&gt;ознакомиться&lt;/a&gt; с моим примером. Вот суть:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;stylesheet&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;3.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;xsl&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.w3.org/1999/XSL/Transform&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;atom&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.w3.org/2005/Atom&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;output&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;html&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;UTF-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;indent&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;yes&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;template&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.w3.org/1999/xhtml&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        RSS Feed | &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;value-of&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/atom:feed/atom:title&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/assets/styles.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        This is an RSS feed. Visit
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://aboutfeeds.com&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;About Feeds&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        to learn more and get started. It’s free.
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Recent blog posts&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;for-each&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/atom:feed/atom:entry&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;attribute&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;value-of&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;atom:link/@href&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;attribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;value-of&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;atom:title&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;value-of&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;atom:summary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
        Last updated:
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;value-of&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;substring(atom:updated, 0, 11)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;for-each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;stylesheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Этот код вдохновлен &lt;a href=&quot;https://github.com/genmon/aboutfeeds/blob/main/tools/pretty-feed-v3.xsl&quot;&gt;pretty-feed-v3&lt;/a&gt;, но я адаптировал его под спецификацию Atom.&lt;/p&gt;
&lt;p&gt;XSL-файл преобразует XML-ленту в валидный HTML-документ, который любой браузер может отобразить. Вы можете использовать любую информацию из XML-файла и поместить её в новую структуру разметки. Вы даже можете отобразить контент, который не является частью XML-ленты. Идеальный пример использования — добавить заметку о том, что такое RSS-ленты и как их использовать &lt;em&gt;(как показано в примере выше)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Вы можете определить встроенные CSS-стили с помощью обычного элемента &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;, но также можно импортировать внешние CSS-файлы. Я импортировал основной CSS-файл своего блога, поэтому мне не пришлось писать новый код, чтобы RSS-лента соответствовала дизайну моего блога.&lt;/p&gt;
&lt;p&gt;Кроме того, можно использовать &lt;a href=&quot;https://www.w3.org/TR/xpath-functions-30/&quot;&gt;функции XSLT&lt;/a&gt; для изменения значений. Вот как я обрезаю временную метку, чтобы отображалась только дата:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Full timestamp --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;value-of&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;atom:updated&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Date only --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;value-of&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;substring(atom:updated, 0, 11)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://caniuse.com/?search=xslt&quot;&gt;Поддержка браузером&lt;/a&gt; XSL-трансформаций отличная; неподдерживаемые браузеры вернутся к поведению по умолчанию (прогрессивное улучшение).&lt;/p&gt;
&lt;h2&gt;Примеры&lt;/h2&gt;
&lt;p&gt;Вот несколько стилизованных RSS-лент, которые вы можете посмотреть для вдохновения:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://darekkay.com/atom.xml&quot;&gt;This blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://photos.darekkay.com/atom.xml&quot;&gt;My photography website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://feeds.bbci.co.uk/news/world/europe/rss.xml&quot;&gt;BBC News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lepture.com/feed.xml&quot;&gt;Hsiaoming Yang&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daverupert.com/atom.xml&quot;&gt;Dave Rupert&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thepcspy.com/feeds/full.xml&quot;&gt;Oli Warner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrismorgan.info/feed.xml&quot;&gt;Chris Morgan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;XSL-файлы публичны, так что можно посмотреть, как эти всё реализовано.&lt;/p&gt;
&lt;h2&gt;Sitemap&lt;/h2&gt;
&lt;p&gt;XSL-файлы можно применять к любому XML-файлу. Ещё один пример использования стилизованных XML-файлов — это &lt;a href=&quot;https://www.sitemaps.org/&quot;&gt;карта сайта&lt;/a&gt;. Хотя карты сайта предназначены для обработки роботами (например, краулерами), их можно стилизовать с минимальными усилиями. Посмотрите &lt;a href=&quot;https://darekkay.com/sitemap.xml&quot;&gt;мою карту сайта&lt;/a&gt; и &lt;a href=&quot;https://darekkay.com/assets/xsl/sitemap-style.xsl&quot;&gt;соответствующий XSL-файл&lt;/a&gt; в качестве примера. Вот суть:&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;stylesheet&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;3.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;xsl&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.w3.org/1999/XSL/Transform&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;sitemap&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.sitemaps.org/schemas/sitemap/0.9&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;output&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;html&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;UTF-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;indent&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;yes&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;template&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.w3.org/1999/xhtml&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Sitemap&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;for-each&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/sitemap:urlset/sitemap:url&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;attribute&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;value-of&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sitemap:loc&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;attribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;value-of&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sitemap:loc&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          Last updated:
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;value-of&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;substring(sitemap:lastmod, 0, 11)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;for-each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;xsl:&lt;/span&gt;stylesheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Предостережение&lt;/h2&gt;
&lt;p&gt;Что произойдёт, если пользователь захочет сохранить стилизованный XML-файл? Интересно, что ответ зависит от браузера. Chrome и Safari сохранят оригинальный XML-файл, а Firefox сохранит стилизованную HTML-страницу. Большинство RSS-ридеров ожидают URL-адрес ленты, поэтому это поведение не имеет значения. Однако я бы был осторожен с XML-файлами, которые предназначены для загрузки, например, OPML-файлами. Спасибо Robb Knight за это &lt;a href=&quot;https://social.lol/@robb/111793259765506845&quot;&gt;наблюдение&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Заключение&lt;/h2&gt;
&lt;p&gt;Я люблю RSS, и, согласно &lt;a href=&quot;https://darekkay.com/blog/rss-subscriber-count/&quot;&gt;моей статистике&lt;/a&gt;, многие мои читатели тоже его любят. С учётом всех закрытых экосистем социальных сетей, я надеюсь, что RSS станет более популярным. Создавая собственный XSL-файл, вы можете сделать свою RSS-ленту привлекательной и добавить информацию о том, что такое RSS на самом деле.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Про этот сайт и что сделал я&lt;/h2&gt;
&lt;p&gt;Мне понравилась идея. Я захотел сделать не отдельную «красивую страницу» самого RSS, а как бы «вписать» RSS-страницу в общее оформление сайта — ну вот чтобы и шапка и подвал и вообще весь контекст.&lt;/p&gt;
&lt;p&gt;Получилось вот так: &lt;a href=&quot;https://sglazov.ru/notes/feed/&quot;&gt;https://sglazov.ru/notes/feed/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;К сожалению, даты локализовать я не смог. И меня несколько смущает вот этот вид «2024-04-18», но это всё же лучше, чем просто xml-файл или отсутствие даты.&lt;/p&gt;
&lt;p&gt;Мой файл &lt;a href=&quot;https://sglazov.ru/assets/xsl/rss-style.xsl&quot;&gt;&lt;code&gt;rss-style.xsl&lt;/code&gt;&lt;/a&gt; повторяет разметку файла &lt;code&gt;layout.njk&lt;/code&gt; всей темы этого сайта.&lt;/p&gt;
&lt;p&gt;Единственный момент — понадобилось написать простую функцию, чтобы HTML-разметка там, где надо преобразовалась в xHTML — где-то закрывать теги и всё такое:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;html2xhtml&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;(&amp;lt;(img|source)[^&gt;]*?) *&#92;/?&gt;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;$1 /&gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;itemscope&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;itemscope=&quot;&quot;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;amp;copy;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;amp;#169;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;amp;nbsp;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;amp;#160;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;В неё целиком я оборачиваю какие-то include-конструкции. &lt;a href=&quot;https://sglazov.ru/sitemap.xml&quot;&gt;Карта сайта&lt;/a&gt; сделана также.&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;wide&quot;&gt;
&lt;h2&gt;Ещё всякие ссылки и посты про XSL(T)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=36401854&quot;&gt;Style your RSS feed on Hacker News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.petefreitag.com/blog/css-stylesheet-rss/&quot;&gt;Adding a CSS StyleSheet to your RSS Feed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jonchristopher.us/blog/beginning-to-style-your-rss-feed/&quot;&gt;Beginning to Style Your RSS Feed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dbushell.com/2024/02/06/rss-feed-styles/&quot;&gt;RSS Feed Styles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web-standards.ru/podcast/375/#01:23:36&quot;&gt;Выпуск №375 подкаста Веб-стандарты&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://t.me/mefody_dev/68&quot;&gt;Пост в канале Никиты Дубко mefody.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

        </content><category term="RSS, XML" /></entry><entry><title>История создания двух ссылок для добавления мероприятия в календарь</title><link href="https://sglazov.ru/notes/add-to-calendar/"/><published>2024-04-18T00:00:00Z</published><updated>2024-04-18T00:00:00Z</updated><id>https://sglazov.ru/notes/add-to-calendar/</id><media:thumbnail url="https://sglazov.ru/notes/add-to-calendar/images/covers/og.png" /><content type="html">
          &lt;p class=&quot;subtitle&quot;&gt;Ну казалось бы: две маленькие простые странные ссылки «Добавить в календарь» среди кучи интерактивных элементов на странице. При этом я получил ответы на вопросы типа «почему формат календарей устроен именно так?».&lt;/p&gt;
&lt;aside&gt;
  &lt;figure&gt;
      &lt;img src=&quot;https://sglazov.ruundefinedimages/final.png&quot; 
            width=&quot;&quot; 
            height=&quot;&quot; 
            alt=&quot;&quot;&gt;
      &lt;figcaption&gt;
          Вот про такие две ссылки история 
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/aside&gt;
&lt;h2&gt;С чего всё началось&lt;/h2&gt;
&lt;p&gt;На самом-то деле, конечно, с глупости. На каком-то «сером» сайте-помойке, типа «скачать субтитры из видео ютуба», где тонна всякой хреновой рекламы и друных схем обмана наивных посетителей. Попал я на такой сайт с айфона.&lt;/p&gt;
&lt;p&gt;Встретил забавную штуку: через какое-то время взаимодействия с сайтом (успел вставить скопированную ссылку на видос), появилось уведомление о предложении добавить чего-то там фид-ленту в мой календарь.&lt;/p&gt;
&lt;p&gt;Из любопытства и исследовательского взгляда — согласился. И эта херня подписала меня на ical-feed какого-то «новостного агентства», засрав мне весь календарь, блин. Создав отдельный типа событий в календаре и при этом подтягивая данные из своей ленты из внешнего источника. Забавная же хрень. Я тоже такую захотел.&lt;/p&gt;
&lt;p&gt;Понравилось. Как идея того, что можно сделать подписку на ленту мероприятий. Как раз то, что нужно мне в проекте.&lt;/p&gt;
&lt;p&gt;Контекст истории в проекте начинается там, где есть вот такой дизайн статус-шапки с информацией о событии:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://sglazov.ruundefinedimages/design.png&quot; alt=&quot;Дизайн статус-шапки с информацией о мероприятии&quot;&gt;&lt;br&gt;
Даты проведения и длительность, место проведения и/или формат (очное или онлайн) ну и кнопка-действие. В первом экране, отвечает сразу на все базовые вопросы&lt;/p&gt;
&lt;p&gt;Аккуратно свёрстано и работает. Во время вёрстки придумал, что для очного формата элемент с адресом будет кликабельным и открывать Яндекс.Карты с прокинутым в поиск, адресом. Урлы Яндекс.Карты умеют получать адрес и искать просто из ссылки с параметром &lt;code&gt;?text=&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- 
    Параметр `z=16` — это масштаб карты (zoom), 
    z=20, например покажет отдельное здание 
--&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://maps.yandex.ru/?text=Санкт-Петербург, Тверская 10&amp;amp;z=16&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
   &lt;span class=&quot;token attr-name&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;_blank&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
   &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Подскажем адрес на Яндекс.Картах&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  Санкт-Петербург, ...
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Включил это для тач-устройств в первую очередь: опыт дружелюбнее. В большинстве случаев после тапа, сразу откроется приложение Яндекс.Карт на телефоне. Если приложения на устройстве нет, то откроется браузер с сайтом карт сразу с адресом.&lt;/p&gt;
&lt;p&gt;Захотелось также сделать что-то приятно-незаметное &lt;em&gt;(пока не кликнешь, не знаешь, что о тебе позаботились и сценарий продумали уже)&lt;/em&gt; и для элемента с датой. Самый очевидный вариант — добавлялка напоминания в календарь.&lt;/p&gt;
&lt;h2&gt;А как у других&lt;/h2&gt;
&lt;h3&gt;Afisha.ru, russpass.ru, KudaGo и Яндекс Афиша&lt;/h3&gt;
&lt;p&gt;На самых популярных порталах добавление в календарь не встречается в интерфейсе вовсе. Скорее там везде один паттерн: призыв к добавлению будет после действия — записи или покупки.&lt;/p&gt;
&lt;p&gt;Также, как и с билетами на самолёт, например. В письме с маршрутной квитанцией обязательно будут ссылки, типа «Добавить в Apple Wallet» и добавлялки в календари.&lt;/p&gt;
&lt;p&gt;Так что актуальных примеров для вдохновения я там не нашёл. Поискал скрины и в своих письмах по истории покупок билетов, понятны стали самые популярные варианты календарей:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Google Calendar,&lt;/li&gt;
&lt;li&gt;iCal (Apple),&lt;/li&gt;
&lt;li&gt;Outlook Calendar,&lt;/li&gt;
&lt;li&gt;Есть ещё частные случаи, где компания активно пушит свои продукты: Календарь Mail.ru, Яндекс Календарь и проч.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;TimePad&lt;/h3&gt;
&lt;aside&gt;
  &lt;figure&gt;
      &lt;img src=&quot;https://sglazov.ruundefinedimages/timepad.png&quot; width=&quot;&quot; height=&quot;&quot; alt=&quot;&quot;&gt;
      &lt;figcaption&gt;
          Событие на TimePad, оформление даты как листа календаря, апрель, 2024 
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/aside&gt;
&lt;p&gt;Подглядел в TimePad. Если смотреть их стандартную «Афишу» — клик по блоку с датой скроллит к этажу выбора билетов. А вот идея с оформлением даты, как календарика — понравилась. Кнопок-действий для добавления в календарь на странице отдельного события нет &lt;em&gt;(апрель, 2024)&lt;/em&gt;. Но есть в письмах после регистрации или оплаты:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://sglazov.ruundefinedimages/timepad-1.png&quot; alt=&quot;123&quot;&gt;&lt;br&gt;
Ссылки в письме TimePad. С отдельной явной сноской о необходимости авторизации в Google-календаре.&lt;/p&gt;
&lt;p&gt;А если смотреть на страницу отдельного организатора мероприятий, то в блоке даты есть ссылка «Добавить в календарь» с выпадайкой и выбором вариантов. Любопытно, что такого нет на других отдельных страницах.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://sglazov.ruundefinedimages/timepad-2.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;
Отдельная страница организатора TimePad и контрол на стрнице в сайтбаре с выпадайкой&lt;/p&gt;
&lt;h2&gt;Как хочу сделать я&lt;/h2&gt;
&lt;aside&gt;
  &lt;figure&gt;
      &lt;img src=&quot;https://sglazov.ruundefinedimages/result.png&quot; 
            width=&quot;&quot; 
            height=&quot;&quot; 
            alt=&quot;&quot;&gt;
      &lt;figcaption&gt;
          Ссылки календарей. Иконки показывают дату события 
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/aside&gt;
&lt;p&gt;&lt;strong&gt;Технические вводные у задачи&lt;/strong&gt;: WordPress, PHP, свой шаблон и полный контроль над кодом, часть данных из админки доставать надо через поля Advanced Custom Fields (ACF).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Я выбираю только Google Calendar и (Календаря iCloud) iCal (Apple) варианты из мысли о том, что уж они всегда в телефоне и под рукой.&lt;/li&gt;
&lt;li&gt;Придумал, что спрячу ссылки на добавление в dropdown по клику на дату: что элемент интерактивный и кликабельный, покажу ховер-эффектом.&lt;/li&gt;
&lt;li&gt;Чего ещё хочу: чтобы иконки календарей в списке показывали актуальную дату события в стилистике самой иконки. Как фавикон у гугла или иконка на рабочем столе в айфоне. Контекст события и всех данных о нём у меня есть в шаблоне, почему бы и не сверстать.&lt;/li&gt;
&lt;li&gt;Ещё хочу отдельную RSS-ленту для ical-календаря, чтобы на неё можно было подписаться и видеть весь актуальный список мероприятий.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Google Calendar&lt;/h2&gt;
&lt;aside&gt;
&lt;p&gt;С любопытством изучил список &lt;a class=&quot;link external-link&quot; href=&quot;https://about.google/brand-resource-center/logos-list/&quot; target=&quot;_blank&quot;&gt;Logos list&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Некоторые из проектов даже и не встречал. Там 134 пункта на апрель 2024.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;У продукта Google Calendar &lt;a href=&quot;https://about.google/brand-resource-center/logos-list/#calendar&quot;&gt;квадратная по пропорциям иконка&lt;/a&gt; и внутри текстом указывается актуальный день месяца. В favicon &lt;a href=&quot;https://calendar.google.com&quot;&gt;calendar.google.com&lt;/a&gt; — &lt;img src=&quot;https://calendar.google.com/googlecalendar/images/favicons_2020q4/calendar_27.ico&quot; width=&quot;16&quot; height=&quot;16&quot; class=&quot;inline&quot;&gt; тоже подставляется актуальный день, например, такое:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; 
  &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;icon&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
  &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;favicon&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
  &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;image/x-icon&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
  &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://calendar.google.com/googlecalendar/images/favicons_2020q4/calendar_27.ico&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Где «&lt;code&gt;27&lt;/code&gt;» в имени файла &lt;code&gt;calendar_27.ico&lt;/code&gt; — день месяца. Ещё очень интересна структура УРЛа. Что ж там такое ещё есть в &lt;code&gt;favicons_2020q4&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Как добавить событие Google Calendar в календарь&lt;/h3&gt;
&lt;p&gt;Чтобы добавить какое-то событие в календарь — была (!) ссылка &lt;code&gt;http://www.google.com/calendar/render?&lt;/code&gt; с обширным списком параметров для события. Почему-то из официальной документации хоть какая-то полезная информация была удалена и все всегда во всех вопросах ссылаются на вебархивную ссылку из 2012-го (!): &lt;a href=&quot;https://web.archive.org/web/20120313011336/http://www.google.com/googlecalendar/event_publisher_guide.html&quot;&gt;Share your events with an individual, a group, or the whole world&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Интернет очень странная штука, конечно. На этой же архивной странице есть генератор ссылок. Работает и спустя 12 лет.&lt;/p&gt;
&lt;p&gt;А современные официальные ссылки документации и раздела помощи гугла показывают что-то бесполезное.&lt;/p&gt;
&lt;p&gt;Параметры описаны на странице &lt;a href=&quot;https://web.archive.org/web/20120225150257/http://www.google.com/googlecalendar/event_publisher_guide_detail.html&quot;&gt;Instructions for making Google Calendar event reminder buttons&lt;/a&gt;, тоже вебархивная ссылка. Там параметры обозначают термином «CGI parameters».&lt;/p&gt;
&lt;p&gt;Базовый набор:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# тут всегда только TEMPLATE, так сказано в доке &lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;TEMPLATE
&lt;span class=&quot;token comment&quot;&gt;# название события&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Публикация поста и ссылках на календари&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# местоположение&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://sglazov.ru&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# описание, можно простые HTML-теги&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Я публикую пост, это торжественно!&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# дата, в Ymd&#92;THis + `Z` после времени&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;dates&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;20240517T190000Z/20240517T200000Z&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;И всё это можно превратить в набор параметров для ссылки, правда ссылка-пример из этой самой [документации] — не работает, почему-то в параметрах запроса есть лишние символы точки с запятой: &lt;code&gt;text;=&lt;/code&gt;, &lt;code&gt;&amp;amp;details;=&lt;/code&gt; ну и т.п. А &lt;a href=&quot;https://web.archive.org/web/20120313011336/http://www.google.com/googlecalendar/event_publisher_guide.html&quot;&gt;конструктор кнопок&lt;/a&gt; — работает, но выбор года там только до 2020.&lt;/p&gt;
&lt;p&gt;Ну и актуальный УРЛ для добавления мероприятий и формирования полной ссылки — &lt;code&gt;https://calendar.google.com/calendar/r/eventedit&lt;/code&gt;, параметры передаются гетом.&lt;/p&gt;
&lt;h3&gt;Беру и делаю&lt;/h3&gt;
&lt;p&gt;SVG-иконку для фона взял случайную, сам в фигме удалил фон. При вёрстке поставил блок с текстом по центру размеров иконки и подогнал визуально размер шрифта, чтобы две цифры даты не поломали габариты блока. Ещё какое-то время понадобилось уделить тому, чтобы выяснить, параметр &lt;code&gt;&amp;amp;ctz=Europe/Moscow&lt;/code&gt; для часового пояса обязателен.&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// переменные $dateStart, $dateEnd, $speakerName, $title, $formatOffline, $city объявлены выше, там ничего интересного&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// форматирует даты&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$calendarDataStart&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Ymd&#92;THis&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;strtotime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$dateStart&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
&lt;span class=&quot;token variable&quot;&gt;$calendarDataEnd&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Ymd&#92;THis&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;strtotime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$dateEnd&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token variable&quot;&gt;$calendarDetails&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Преподаватель: &lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$speakerName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;. Описание и программа: https://site.tld/events/&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_the_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token variable&quot;&gt;$calendarUrl&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https://calendar.google.com/calendar/r/eventedit&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$calendarUrl&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;?text=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;htmlspecialchars&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// название мероприятия&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$calendarUrl&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;&amp;amp;ctz=Europe/Moscow&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// часовой пояс обязательный&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$calendarUrl&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;&amp;amp;dates=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$calendarDataStart&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;/&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$calendarDataEnd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$calendarUrl&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;&amp;amp;details=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;htmlspecialchars&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$calendarDetails&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// если событие в оффлайне и в админке указан город &lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$formatOffline&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$city&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;$calendarAddress&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$city&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;token comment&quot;&gt;// добавляем параметр `location` с адресом к урлу календаря&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;$calendarUrl&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;&amp;amp;location=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;htmlspecialchars&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$calendarAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;dropdown-menu__item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;add-to-calendar-link&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$calendarUrl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Календарь откроется в новом окне&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;token attr-name&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;_blank&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;add-to-calendar-link__symbol&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
           &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;22&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
           &lt;span class=&quot;token attr-name&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;22&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;use&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xlink:&lt;/span&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#i_google-calendar-blank&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;use&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.w-icon__symbol --&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;add-to-calendar-link__day&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;j&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;strtotime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$dateStart&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- день месяца в стилизованной иконке календаря --&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.add-to-calendar-link__day --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.add-to-calendar-link__symbol --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;add-to-calendar-link__text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      Google Календарь
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.add-to-calendar-link__text --&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.add-to-calendar-link --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.dropdown-menu__item --&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;И всё прекрасно заработало.&lt;/p&gt;
&lt;h2&gt;Ссылка для добавления в iCal — календарь Apple iCloud&lt;/h2&gt;
&lt;p&gt;Стоит упомянуть, что «i» в названии формата iCalendar, созданного в 1998/2009, не имеет отношение к манере Apple называть свои продукты. В случае с iCalendar — это &lt;strong&gt;Internet&lt;/strong&gt; Calendaring and Scheduling Core Object Specification &lt;em&gt;(iCalendar)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Формат представляет собой набор параметров вида ключ-значение. В этой реализации все параметры орут и написаны прописными. В 199* так было модно? Файл на десятка два событий, визуально превращается в мешанину из капса, цифр и неожиданных двоеточий.&lt;/p&gt;
&lt;p&gt;Пример структуры для отдельного события:&lt;/p&gt;
&lt;aside&gt;
  &lt;figure&gt;
      &lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/c/c0/ICalendarSpecification.png&quot; 
            width=&quot;&quot; 
            height=&quot;&quot; 
            alt=&quot;&quot;&gt;
      &lt;figcaption&gt;
&lt;p&gt;В википедии есть клёвая таблица с подсказкой о компонентах в формате — &lt;a href=&quot;https://en.wikipedia.org/wiki/File:ICalendarSpecification.png&quot;&gt;iCalendar components and their properties&lt;/a&gt;.&lt;br&gt;
&lt;/figcaption&gt;&lt;/p&gt;
  &lt;/figure&gt;
&lt;/aside&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;BEGIN:VCALENDAR
PRODID:-//Timepad Ltd.//NONSGML Timepad//RU
VERSION:2.0
METHOD:PUBLISH

BEGIN:VEVENT
UID:3414132849538
DTSTART:20240517T190000
DTEND:20240517T200000
DTSTAMP:20240415T000102
SUMMARY:SPB Frontend Митап #36
DESCRIPTION:[...] традиционная встреча веб-разработчиков в Санкт-Петербурге [...]
LOCATION:Санкт-Петербург, Цветочная улица, дом 19
END:VEVENT

END:VCALENDAR&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Формат состоит из компонент-секций &lt;code&gt;BEGIN:-END:&lt;/code&gt;. Версия является обязательной и всегда указывается вторая. Сомневаюсь, что она будет когда-то меняться, но поскольку есть совсем старинная первая, то указывается вторая.&lt;/p&gt;
&lt;p&gt;Вместо &lt;code&gt;TITLE&lt;/code&gt; использовали вариант &lt;code&gt;SUMMARY&lt;/code&gt;, ну ок. &lt;code&gt;METHOD:PUBLISH&lt;/code&gt; — это про событие, которое явно случится.&lt;/p&gt;
&lt;p&gt;Отдельных &lt;code&gt;VEVENT&lt;/code&gt; внутри &lt;code&gt;*.ics&lt;/code&gt; может быть произвольное количество, не только одно событие.&lt;/p&gt;
&lt;h3&gt;Как всё работает и как должно работать у меня, тезисно:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Магией создаётся/генерируется налету файл &lt;code&gt;id.ics&lt;/code&gt;, где &lt;code&gt;id&lt;/code&gt; — уникальный ID мероприятия, ну можно префикс ещё добавить;&lt;/li&gt;
&lt;li&gt;К этому «файлу» можно обратиться по уникальной ссылке;&lt;/li&gt;
&lt;li&gt;В момент обращения — скачивается &lt;code&gt;*.ics&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Файл при открытии запускает календарь, например, на айфоне;&lt;/li&gt;
&lt;li&gt;Или пользователь его открывает сам после скачивания &lt;em&gt;(нууу, такоооое, но именно так оно задумано и работает)&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ещё я хотел отдельную ленту всех мероприятий в формате iCal. Придумал, что можно сделать кастомную RSS-ленту в WordPress, которая может принимать на вход один ID параметром, типа &lt;code&gt;?event=&amp;lt;?= get_the_id(); ?&amp;gt;&lt;/code&gt; и формировать файл для отдельного мероприятия. Ну и без параметра урл вида &lt;code&gt;/feed/ical/&lt;/code&gt; будет отдавать всегда актуальный общий список мероприятий в формате iCalendar. Два в одном типа.&lt;/p&gt;
&lt;p&gt;Кастомную RSS-ленту можно собрать через WordPress-хук &lt;a href=&quot;https://developer.wordpress.org/reference/functions/add_feed/&quot;&gt;&lt;code&gt;add_feed()&lt;/code&gt;&lt;/a&gt;. Писал про этот хук на Хабре в 2019-м: &lt;a class=&quot;link external-link&quot; href=&quot;https://habr.com/ru/companies/click/articles/466193/&quot; target=&quot;_blank&quot;&gt;Кастомная авторассылка в MailChimp из RSS-ленты&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Скачать файл сразу поможет и сам браузер, но лучше ему помочь и указать заголовок &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition&quot;&gt;&lt;code&gt;Content-Disposition: attachment;&lt;/code&gt;&lt;/a&gt; при ответе.&lt;/p&gt;
&lt;h3&gt;Создание RSS-ленты&lt;/h3&gt;
&lt;p&gt;Файл &lt;code&gt;feed-ical.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Добавляет новую ленту `/feed/ical`&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add_action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;init&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;iCalendarFeed&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;iCalendarFeed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;add_feed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;ical&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;iCalendarFeedTemplate&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Шаблон ленты&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;iCalendarFeedTemplate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;get_template_part&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;feed&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;ical&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Подключить в файле функций темы &lt;code&gt;functions.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// лента для Apple Календаря&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_template_directory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;/core/custom/feed-ical.php&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ну, у меня оно так разложено по своей структуре и собирается через &lt;code&gt;require&lt;/code&gt; под полным моим контролем.&lt;/p&gt;
&lt;h3&gt;Кнопка-действие&lt;/h3&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;dropdown-menu__item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;add-to-calendar-link&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
     &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_feed_link&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;ical&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;?event=&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_the_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Файл события скачается&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;token attr-name&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;_blank&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;token attr-name&quot;&gt;download&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;event-&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_the_id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;.ics&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;add-to-calendar-link__symbol&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;apple-calendar&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;apple-calendar__week&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;date_i18n&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;D&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;strtotime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$dateStart&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.apple-calendar__week --&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;apple-calendar__date&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;j&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;strtotime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$dateStart&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.apple-calendar__date --&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.apple-calendar --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.add-to-calendar-link__symbol --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;add-to-calendar-link__text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      iCal (Календарь Apple)
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.add-to-google-calendar__text --&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.add-to-calendar-link --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /.dropdown-menu__item --&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;WordPress-функция &lt;a href=&quot;https://developer.wordpress.org/reference/functions/date_i18n/&quot;&gt;&lt;code&gt;date_i18n()&lt;/code&gt;&lt;/a&gt; позволяет из коробки работать с локализацией дат без магии. Ну и формат &lt;code&gt;D&lt;/code&gt; выведет сокращённый двухбуквенный вариант дня недели. Как в иконке календаря на айфоне. А на макос иконка позывает месяц + день.&lt;/p&gt;
&lt;h3&gt;Шаблон iCal-ленты&lt;/h3&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// имя файла&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;urlencode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;event-&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Y-m-d&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;.ics&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// это — календарь, в UTF-8&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Content-type: text/calendar; charset=utf-8&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// и файл надо скачать&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Content-Description: File Transfer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// имя этому файлу объявлено&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Content-Disposition: attachment; filename=&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// помогает всегда отдавать только свежее, игнорируя кэш&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Expires: 0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;


&lt;span class=&quot;token comment&quot;&gt;// если `event=ID`, то карточку собираем для него &lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;event&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;event&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;$getEvent&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;event&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token variable&quot;&gt;$args&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;p&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$getEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;        &lt;span class=&quot;token comment&quot;&gt;// ID мероприятия из запроса&lt;/span&gt;
  &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;post_type&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;events&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// мероприятия&lt;/span&gt;
  &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;posts_per_page&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// все&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$getEvents&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WP_Query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$args&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// в стандартном цикле WP перебираем всё, что нужно&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$getEvents&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;have_posts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
PRODID:-//RU
NAME:БРЕНД
X-WR-CALDESC:Краткое описание календаря
TZID:Europe/Moscow
&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// в цикле собирает отдельный компонент `BEGIN:VEVENT-END:VEVENT`&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$getEvents&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;have_posts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ... тут из acf/wp достаются нужные поля&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;ob_start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
  BEGIN:VEVENT
  SUMMARY:&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
  UID:&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;uniqid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
  DTSTAMP:&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$timestamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
  DTSTART:&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$dateStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
  DTEND:&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$dateEnd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
  LOCATION:&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;escapeString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$location&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
  DESCRIPTION:&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;escapeString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
  END:VEVENT
&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endwhile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;
END:VCALENDAR
&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;ob_end_clean&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ob_get_contents&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Стандарты и спецификации&lt;/h2&gt;
&lt;p&gt;В 1996-м году написали &lt;a href=&quot;http://web.archive.org/web/20160321023312/https://www.imc.org/pdi/vcal-10.txt&quot;&gt;спеку vCalendar&lt;/a&gt;, где «v» — &lt;em&gt;virtual&lt;/em&gt;. vCalendar — формат данных для представления и обмена информацией календаря. В той же спеке было и первое упоминание &lt;a href=&quot;http://web.archive.org/web/20150906130553/http://www.imc.org/pdi/&quot;&gt;формата vCard&lt;/a&gt; — формата данных для карточки контакта. vCard частично работает до сих и формат 1996 поддерживается в рамках обратной совместимости.&lt;/p&gt;
&lt;p&gt;Формат vCalendar позже превратился в iCalendar — &lt;em&gt;vCalendar: The Basis for Cross-Platform Scheduling&lt;/em&gt;. В 1998 году появилась спека &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc2445&quot;&gt;RFC 2445&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;В 2009-м, через два года после выхода &lt;a href=&quot;https://www.youtube.com/watch?v=LqmYarhXLaY&quot;&gt;первого iPhone&lt;/a&gt;, первую спеку прокачали для применения уже в разросшемся вебе — &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc5545&quot;&gt;RFC 5545&lt;/a&gt;, она и является актуальной. Ещё её правили в 2016-м и в целом, спека — живая.&lt;/p&gt;
&lt;p&gt;В 2014 году сделали мапинг формата iCalendar в &lt;code&gt;json&lt;/code&gt;-формат в спеке &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7265&quot;&gt;RFC 7265&lt;/a&gt; — jCal. Перед ним в период популярности &lt;code&gt;XML&lt;/code&gt; была спека &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc6321&quot;&gt;RFC 6321&lt;/a&gt; — xCal, но формат уж слишком многословный получился.&lt;/p&gt;
&lt;div class=&quot;wide&quot;&gt;
&lt;h2&gt;Ещё всякие ссылки про календари и спецификации&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Спецификации &lt;a href=&quot;http://web.archive.org/web/20150906130553/http://www.imc.org/pdi/&quot;&gt;vCard и vCalendar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Спецификации &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc2445&quot;&gt;RFC 2445&lt;/a&gt; и &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc5545&quot;&gt;RFC 5545&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Сайт &lt;a href=&quot;https://icalendar.org/&quot;&gt;iCalendar.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=DC_V0ZduT-4&quot;&gt;«Calendaring Standards for Free Software»&lt;/a&gt; Andrew McMillan, 2014 год&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?app=desktop&amp;amp;v=5pDqnDBPWCo&quot;&gt;«Как работать с календарями»&lt;/a&gt; — Доклад Алексея Авдеева, FrontendConf&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

        </content><category term="WordPress, PHP, iCal, Google Calendar" /></entry><entry><title>Электрические письма</title><link href="https://sglazov.ru/notes/emails/"/><published>2023-06-05T00:00:00Z</published><updated>2023-06-05T00:00:00Z</updated><id>https://sglazov.ru/notes/emails/</id><media:thumbnail url="https://sglazov.ru/notes/emails/images/covers/og.png" /><content type="html">
          &lt;p&gt;В 1971 году было написано и отправлено первое электронное письмо. Общедоступный WWW и то, во что он превратился создан в 1991-1996 годах. В Россию Рунет пришёл в апреле 1994 года.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.w3.org/MarkUp/html3/&quot;&gt;Черновик HTML 3.0&lt;/a&gt; опубликован в марте 1995 года. Ну и вот начинается то, куда мы пришли. Есть активное развитие каждой из ключевых технологий и веб пополз даже в другие стороны, захватывая железные части: можно получать доступ к микрофону или &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API&quot;&gt;геопозиции&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/DeviceOrientationEvent&quot;&gt;акселерометру&lt;/a&gt;, сканеру отпечатка пальцев для подтверждения операций и много чего ещё интересного. Тут всё хорошо, и пока не об этом хочется поговорить.&lt;/p&gt;
&lt;p&gt;Первые письма с минимальными возможностями технологий тех лет (HTML 4.01 и CSS2) начали использовать только в конце 90-х. В 1997 году появляется почтовый веб-клиент с использованием актуальных веб-технологий. Ну, Hotmail вы точно должны знать — он был первым. Через год после запуска его купит Microsoft и вслед за этим запустит свой почтовый клиент — Outlook. Outlook жил в Windows. Это очень повлияло на его популярность. Но доставило много боли разработчикам. Всё как с Internet Explorer. Кстати. В июне 1999 Microsoft выпускает Outlook 2000 в котором письма рендерит движок их собственного браузера Internet Explorer 6 (эх). В январе 2007 Outlook перешёл с движка Internet Explorer на движок своего другого продукта — MS Word. Сразу после перехода много CSS-свойств в письмах перестали нормально поддерживаться. Совпадение?&lt;/p&gt;
&lt;p&gt;Среди &lt;a href=&quot;http://web.archive.org/web/20021231051842/http://www.georgedillon.com/web/html_email_is_evil_still.shtml&quot;&gt;первой критики HTML-писем&lt;/a&gt; были такие пункты: «съедают» пропускную способность интернет-канала, долго рендерятся. Пост с этой критикой — целая история. И актуальные для тех лет проблемы.&lt;/p&gt;
&lt;p&gt;Разработчикам оставалось только бороться и изобретать костыли для решения задач: функциональных, оформительных или кросс-платформенных. Вот самые интересные вариант: &lt;a href=&quot;https://www.litmus.com/blog/how-to-code-a-live-dynamic-twitter-feed-in-html-email&quot;&gt;встраивание ленты твиттера&lt;/a&gt; прямо в письмо, работающая форма заявки, &lt;a href=&quot;https://www.litmus.com/blog/how-to-build-an-interactive-quiz-in-an-email&quot;&gt;чекбоксы&lt;/a&gt; (!) и на их основе слайдеры и блоки-спойлеры.&lt;/p&gt;
&lt;p&gt;Например, Gmail &lt;em&gt;(и веб-клиент и приложение)&lt;/em&gt; обрежут письмо, превышающее &lt;a href=&quot;http://web.archive.org/web/20210415100610/https://blog.mailtrap.io/email-size/&quot;&gt;102 Кб&lt;/a&gt;. Отдельно сразу нужно заметить, что делает он это также тогда, когда несколько писем были отправлены с одной и той же темой. 102 Кб — это только про разметку и HTML-код.&lt;/p&gt;
&lt;p&gt;Человечество уже столкнулось с каждой проблемой и нашло какое-то решение.&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;wide&quot;&gt;
&lt;h2&gt;Всякие ссылки про письма&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sglazov/pechkin&quot;&gt;«Печкин»&lt;/a&gt; помогает быстро начать вёрстку писем&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caniuse.email&quot;&gt;caniuse.email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.caniemail.com&quot;&gt;caniemail.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.campaignmonitor.com/css/&quot;&gt;Поддерживаемые CSS-свойства в разных почтовых клиентах&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mjml.io&quot;&gt;mjml.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.howtotarget.email&quot;&gt;howtotarget.email&lt;/a&gt; — список хаков для задания стилей и разметки для конкретных почтовых клиентов&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

        </content><category term="email, CSS" /></entry><entry><title>WordPress и домены-синонимы (алиасы)</title><link href="https://sglazov.ru/notes/wordpress-domains/"/><published>2022-07-12T00:00:00Z</published><updated>2022-07-12T00:00:00Z</updated><id>https://sglazov.ru/notes/wordpress-domains/</id><media:thumbnail url="https://sglazov.ru/notes/wordpress-domains/images/covers/og.png" /><content type="html">
            &lt;div class=&quot;task&quot;&gt;
  &lt;div class=&quot;task__title&quot;&gt;Задача:&lt;/div&gt;&lt;!-- /.task__title --&gt;
  &lt;div class=&quot;task__message&quot;&gt;
    сделать так, чтобы один сайт на WordPress с одной БД открывался по множеству разных доменов и не сойти с ума.
  &lt;/div&gt;&lt;!-- /.task__message --&gt;
&lt;/div&gt;
&lt;p&gt;Ситуация такая: есть сайт. Внутри — WordPress и свой мир. У сайта есть команда разработки. Для каждого разработчика придумано своё окружение и работы ведутся на dev-домене. &lt;code&gt;dev0.*.tld&lt;/code&gt;, &lt;code&gt;dev2.*.tld&lt;/code&gt;, ну и пока не закончатся разработчики или цифры.&lt;/p&gt;
&lt;p&gt;Ещё есть обычные зеркала сайта — маркетинг придумал домен в другой доменной зоне, глобальные, региональные и какие угодно. И при этом всё это живёт на одной &lt;abbr title=&quot;База данных&quot;&gt;БД&lt;/abbr&gt;, ну, да. Не спрашивайте. Так бывает. Реальность достаточна сурова и объясняется контекстом (который до конца никому не понятен) или фразой типа: &lt;em&gt;«так устроена жизнь»&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;И вот я совсем не понимаю, зачем в WordPress в базе данных в пугающе многих местах, захардкожен домен сайта. При варианте разработки «сделал локально → перенёс на удалённый сервер», человечество изобрело для этого костыля другие костыли или просто в лоб заменяют SQL-запросом все совпадения домена. Потрясающе.&lt;/p&gt;
&lt;h2&gt;Константы &lt;code&gt;WP_SITEURL&lt;/code&gt; и &lt;code&gt;WP_HOME&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Решение (трюк?) с &lt;a href=&quot;https://ru.wordpress.org/support/article/editing-wp-config-php/#wp_siteurl&quot;&gt;переопределением&lt;/a&gt; констант &lt;code&gt;WP_SITEURL&lt;/code&gt; и &lt;code&gt;WP_HOME&lt;/code&gt; работают не так, как нужно: они переопределяются, но не изменяются. И чаще всего вы получите при обращении к &lt;code&gt;dev0.*.tld&lt;/code&gt; запрос ресурсов, статики и всего, с абсолютным урлом основного домена. На dev-окружениях такое и бесит и недопустимо.&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// wp-config.php&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;WP_HOME&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https://&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;HTTP_HOST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;WP_SITEURL&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https://&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;HTTP_HOST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;«Умная переопределялка» для хоста через &lt;code&gt;$_SERVER[&#39;HTTP_HOST&#39;]&lt;/code&gt; будет вести себя точно также из-за абсолютных ссылок в БД.&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * Вторая попытка определения хоста для дев- и прод-доменов
 */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;strtolower&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;HTTP_HOST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;dev.7site.tld&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;WP_SITEURL&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https://dev.7site.tld&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;WP_HOME&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https://dev.7site.tld&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;7site.tld&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;WP_SITEURL&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https://7site.tld&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;WP_HOME&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https://7site.tld&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;WP_SITEURL&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https://site.tld&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;WP_HOME&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;    &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https://site.tld&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Разумеется, при этом менять что-то в самой БД — нельзя. При этом хочется. А нельзя.&lt;/p&gt;
&lt;p&gt;Кажется, логичным: заменять то, что нужно и там, где надо &lt;em&gt;(дорогостоящая операция по производительности)&lt;/em&gt;. Так уже работает, например, для медиафайлов на dev-доменах: медиа загружены на основной домен, менеджер при тестировании смотрит окружение разработчика, но урл для картинки будет заменён на урл боевого домена:&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;gallery__img&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;alt&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;draggable&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;str_replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;dev1.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;src&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token delimiter important&quot;&gt;?&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Что же делать&lt;/h2&gt;
&lt;p&gt;Выкинуть из кода все переопределения констант.&lt;/p&gt;
&lt;p&gt;Создать файл &lt;code&gt;wp-domains.php&lt;/code&gt; в корне. Внутри описать &lt;a href=&quot;https://mihanentalpo.me/2017/03/wordpress-%D0%BF%D0%BE-%D1%87%D0%B5%D0%BB%D0%BE%D0%B2%D0%B5%D1%87%D0%B5%D1%81%D0%BA%D0%B8-%D1%81-git/&quot;&gt;магию&lt;/a&gt; с &lt;code&gt;ob_start&lt;/code&gt; + &lt;code&gt;str_replace&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/**
 * https://github.com/MihanEntalpo/WordpressGitTools/blob/master/wp-domains.php
 */&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//Проверим, не запускался ли данный скрипт ранее:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;defined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;WP_DOMAINS_INITIALIZED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;WP_DOMAINS_INITIALIZED&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//Домены на котором может работать сайт, локальные и удалённые,&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$domains_enabled&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;site.tld&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;7site.tld&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;dev.7site.tld&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;


&lt;span class=&quot;token comment&quot;&gt;//Добавим в массив $_SERVER все необходимые для проверки ключи,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//которых там может не быть&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;array_replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;HTTPS&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;HTTP_HTTPS&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;REQUEST_SCHEME&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;SERVER_PORT&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//Проверим, используется ли https?&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$https&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;HTTPS&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;HTTPS&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;off&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;HTTP_HTTPS&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;HTTP_HTTPS&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;off&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;REQUEST_SCHEME&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;https&#39;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;SERVER_PORT&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;


&lt;span class=&quot;token comment&quot;&gt;//Составим адрес хоста&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$site_addr&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$https&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;https://&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;http://&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;HTTP_HOST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//Заменим адрес хоста на тот, что мы вычислили&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;defined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;WP_HOME&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;WP_HOME&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$site_addr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;defined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;WP_SITEURL&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;WP_SITEURL&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$site_addr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;


&lt;span class=&quot;token comment&quot;&gt;//Добавим обработчик выдачи сайта, который будет заменять во всех ссылках&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//домены на текущий домен&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ob_start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$domains_enabled&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$https&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;$current_host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;HTTP_HOST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;$replace&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;$scheme&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$https&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;https&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;http&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$domains_enabled&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$current_host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$domain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;http://&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$domain&lt;/span&gt;&lt;/span&gt;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$scheme&lt;/span&gt;&lt;/span&gt;://&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$current_host&lt;/span&gt;&lt;/span&gt;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;https://&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$domain&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$scheme&lt;/span&gt;&lt;/span&gt;://&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$current_host&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;//&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$domain&lt;/span&gt;&lt;/span&gt;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;//&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$current_host&lt;/span&gt;&lt;/span&gt;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;//&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$domain&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;//&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$current_host&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;str_replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;array_keys&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;array_values&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Подключить файл &lt;code&gt;wp-domains.php&lt;/code&gt; в файлы &lt;code&gt;wp-config.php&lt;/code&gt; и &lt;code&gt;wp-load.php&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;require_once&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;__DIR__&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;/wp-domains.php&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Проверено на хостинге &lt;a href=&quot;https://timeweb.com/ru&quot;&gt;timeweb.ru&lt;/a&gt;, четырёх доменах-синонимов и трёх поддоменах.&lt;/p&gt;

        </content><category term="WordPress, PHP" /></entry><entry><title>Хочешь чего-то узнать — включи любопытство</title><link href="https://sglazov.ru/notes/curious/"/><published>2022-06-30T00:00:00Z</published><updated>2022-06-30T00:00:00Z</updated><id>https://sglazov.ru/notes/curious/</id><media:thumbnail url="https://sglazov.ru/notes/curious/images/covers/og.png" /><content type="html">
          &lt;p&gt;И не выключай никогда, слыш.&lt;/p&gt;
&lt;p&gt;Вот детям такое объяснять даже не надо. А взрослым — почему-то это всё вообще не очевидно. Они всего боятся вокруг. Даже дерево в парке потрогать. Даже себя иногда боятся.&lt;/p&gt;
&lt;p&gt;Когда появляется какая-то новая штука — хочется расковырять, узнать побольше, понять, как устроена. И как вообще чего оно там.&lt;/p&gt;
&lt;p&gt;Даёшь людям законченную единицу смысла в работе. Изолировано и так, чтобы они ничего не сломали, а если и сломали — это даже плюс. Можно что-то сделать лучше, чем было. А случившаяся поломка бы не задела другие части системы. От админки и до оплат — критичное всё, в общем. А остальное — ломай, изучай, понимай.&lt;/p&gt;
&lt;p&gt;А через три месяца узнаёшь, что люди используют три очевидные кнопки и переключатель, а на пункт «развернуть», где ещё есть шесть кнопок даже курсор наводить бояться. Объективного ответа на «почему?» — на находится.&lt;/p&gt;
&lt;p&gt;Вспомнил историю на контрасте. Моя тётя. Много годиков. Любопытство к этому возрасту даже проветриваться должно и заменяться поучительной мудростью (неуместной). Учитель математики у кучи избалованных непоседливых детей. И тут вот пандемия, онлайн-уроки, Zoom и его аналоги, вся вот эта херня.&lt;/p&gt;
&lt;p&gt;Она попросила мне ей позвонить, сама создала комнаты-конференции, сама изучила, как кикнуть из звонка кого-либо, как стереть с демонстрации экрана нарисованную письку или если кто-то в крестики-нолики играет, или слово «хуй» написал сердечками-символами. Я оставил звонок без звука и её с любопытством. За час она перезванивала трижды и за полтора часа знала, как устроено всё со стороны организатора и как вести себя (куда нажать) в нужной ей ситуации.&lt;/p&gt;
&lt;p&gt;Уважуха за любопытство.&lt;/p&gt;
&lt;p&gt;И почему так не у всех — я так и не понимаю.&lt;/p&gt;

        </content></entry><entry><title>Исполнитель (сотрудник) — не ксерокс</title><link href="https://sglazov.ru/notes/your-opinion/"/><published>2022-06-09T00:00:00Z</published><updated>2022-06-09T00:00:00Z</updated><id>https://sglazov.ru/notes/your-opinion/</id><media:thumbnail url="https://sglazov.ru/notes/your-opinion/images/covers/og.png" /><content type="html">
          &lt;p&gt;В каком-либо конвейере процесса при передаче штуки в работу человек не является инструментом клонирования результата прошлого звена в цепочке.&lt;/p&gt;
&lt;p&gt;У человека должно быть своё мнение. Обязано быть.&lt;/p&gt;
&lt;p&gt;И свой взгляд на то, что он делает. Даже если всё ТЗ описали (так не бывает) прям педантично.&lt;/p&gt;
&lt;p&gt;Предусмотреть все детали и все ситуации во всех мультивалентных и позаботится о нескольких шагах наперёд. Менеджер или кто-то угодно в цепочке дел может что-то проебать или просто не знать. Ну а ты-то знаешь. Добавь своего видения.&lt;/p&gt;
&lt;p&gt;Всегда был убеждён, кто каждый человек заинтересован делать что-то хорошее в первую очередь для себя.&lt;/p&gt;
&lt;p&gt;Разгрузить своё время, позаботиться о себе так, чтобы результат был прекрасным.&lt;/p&gt;
&lt;p&gt;&lt;mark&gt;Круто работать с теми, кому не всё равно.&lt;/mark&gt;&lt;/p&gt;

        </content></entry><entry><title>Laravel на виртуальном хостинге (shared hosting) TimeWeb</title><link href="https://sglazov.ru/notes/laravel-in-shared-timeweb/"/><published>2021-11-25T00:00:00Z</published><updated>2021-11-25T00:00:00Z</updated><id>https://sglazov.ru/notes/laravel-in-shared-timeweb/</id><media:thumbnail url="https://sglazov.ru/notes/laravel-in-shared-timeweb/images/covers/og.png" /><content type="html">
            &lt;div class=&quot;task&quot;&gt;
  &lt;div class=&quot;task__title&quot;&gt;Задача:&lt;/div&gt;&lt;!-- /.task__title --&gt;
  &lt;div class=&quot;task__message&quot;&gt;
    поднять Laravel на хостинге TimeWeb и вкрутить CI/CD через GitHub Actions.
  &lt;/div&gt;&lt;!-- /.task__message --&gt;
&lt;/div&gt;
&lt;p&gt;Так случилось, что хостинг клиента — виртуальный (shared) на &lt;a href=&quot;https://timeweb.com&quot;&gt;TimeWeb&lt;/a&gt;. Тариф ничем не выделяется.&lt;/p&gt;
&lt;p&gt;Внутри есть SSH, БД, вообще всё, что нужно и задача в целом, реальная и решаемая.&lt;/p&gt;
&lt;p&gt;В терминале версия PHP5.6:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;client@vh2**:~/site.tld$ php &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;
PHP &lt;span class=&quot;token number&quot;&gt;5.6&lt;/span&gt;.37 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cli&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;built: Jul &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2018&lt;/span&gt; 00:54:11&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;А нужна минимум PHP7.3. В настройках каждого сайта в личном кабинете хостера можно указать требуемую версию PHP, но вот терминалу на это плевать.&lt;/p&gt;
&lt;h2&gt;Установка Composer и Laravel&lt;/h2&gt;
&lt;p&gt;В терминале можно указать путь к исполняемому пакету с нужной версией PHP. Laravel ставится через &lt;a href=&quot;https://getcomposer.org/download/&quot;&gt;Composer&lt;/a&gt;, его надо скачать и положить рядом.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;php &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;copy(&#39;https://getcomposer.org/installer&#39;, &#39;composer-setup.php&#39;);&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
php &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unlink(&#39;composer-setup.php&#39;);&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;В корне появился &lt;code&gt;composer.phar&lt;/code&gt;. Ставим &lt;a href=&quot;https://laravel.com/docs/9.x#your-first-laravel-project&quot;&gt;Laravel&lt;/a&gt;, выбирая &lt;a href=&quot;https://timeweb.com/ru/help/pages/viewpage.action?pageId=4358256&quot;&gt;нужную&lt;/a&gt; версию PHP:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/opt/php73/bin/php composer.phar create-project laravel/laravel&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Устанавливается без каких-либо проблем. Важно знать, что к &lt;code&gt;artisan&lt;/code&gt; обращаться надо также:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/opt/php73/bin/php artisan optimize&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;У проектов в таймвебе паблик-директория — &lt;code&gt;./public_html&lt;/code&gt;. А Laravel торчит наружу из &lt;code&gt;./public&lt;/code&gt; в корне файловой структуры. Чтобы это просто завести на таймвебе — можно обойтись симлинком:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; ~/site.tld/public ~/site.tld/public_html&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;GitHub Actions&lt;/h2&gt;
&lt;p&gt;В &lt;a href=&quot;https://github.com/marketplace?type=actions&quot;&gt;Marketplace&lt;/a&gt; GitHub Actions есть уже куча пакетов для Laravel. Моя задача была простой и я обошёлся &lt;a href=&quot;https://github.com/Burnett01/rsync-deployments&quot;&gt;rsync-deployments&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# .github/workflows/timeweb-deploy.yml&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Deployment site.tld

&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; main

&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest
    &lt;span class=&quot;token key atrule&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;!contains(github.event.head_commit.message, &#39;skip ci&#39;)&quot;&lt;/span&gt;

    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Загрузка актуальной кодовой базы
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v2
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/setup&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;node@v2
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;node-version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;14&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Создаёт .env&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;файл
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; echo &quot;$&quot; &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt; &quot;.env&quot;
      &lt;span class=&quot;token comment&quot;&gt;# Install Сomposer&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Установка Сomposer&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;зависимостей
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; composer install &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;optimize&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;autoloader &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;no&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;dev
      &lt;span class=&quot;token comment&quot;&gt;# Artisan cli commands&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Трудится&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; artisan
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
          php artisan clear-compiled
          php artisan optimize
          php artisan migrate&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# Install NPM&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Установка NPM&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;зависимостей и сборка статики
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
          npm ci
          npm run prod&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# Deploy&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Публикация проекта site.tld
        &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; burnett01/rsync&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;deployments@4.1
        &lt;span class=&quot;token key atrule&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;switches&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;az &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;delete &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;exclude&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;from=&quot;rsync&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;excludes.txt&quot;
          &lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; .
          &lt;span class=&quot;token key atrule&quot;&gt;remote_path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $
          &lt;span class=&quot;token key atrule&quot;&gt;remote_host&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $
          &lt;span class=&quot;token key atrule&quot;&gt;remote_user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $
          &lt;span class=&quot;token key atrule&quot;&gt;remote_key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Все параметры, как и &lt;code&gt;.env&lt;/code&gt;-конфиг для production-окружения, будут взяты из Actions secrets.&lt;/p&gt;
&lt;div class=&quot;wide&quot;&gt;
&lt;h2&gt;Ссылки на справочный центр таймвеба&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://timeweb.com/ru/help/pages/viewpage.action?pageId=4358256&quot;&gt;Изменение версии PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://timeweb.com/ru/help/display/DOC/Laravel&quot;&gt;Размещения сайта на Laravel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

        </content><category term="Laravel, PHP" /></entry><entry><title>Убирать модификаторы скрытия, а не добавлять модификаторы показа</title><link href="https://sglazov.ru/notes/remove-not-add-for-hide/"/><published>2021-09-10T00:00:00Z</published><updated>2021-09-10T00:00:00Z</updated><id>https://sglazov.ru/notes/remove-not-add-for-hide/</id><media:thumbnail url="https://sglazov.ru/notes/remove-not-add-for-hide/images/covers/og.png" /><content type="html">
          &lt;p&gt;Вот представим. Вы верстаете. И есть штука, которая должна показаться/скрываться по клику на какой-либо элемент. Не модалка, а клик-подсказки или кнопка-меню.&lt;/p&gt;
&lt;p&gt;Конструкция, упрощённо (но обязательно с &lt;code&gt;aria&lt;/code&gt;-атрибутами!), такая:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- контрол --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ui-button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ui-menu&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;aria-haspopup&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;aria-expanded&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  Добавить в...
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- 
    нечто, что реагирует на действие 
    с контролом. и оно скрыто
--&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ui-menu is-hidden&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;aria-labelledby&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ui-menu&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  Меню с пунктами...
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;И вот самое важное как раз в классе &lt;code&gt;is-hidden&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Исходим всегда из того, что в начальном состоянии элемент всегда скрыт. А действие с контролом — его показывает.&lt;/p&gt;
&lt;p&gt;Нужно &lt;mark&gt;удалять модификатор скрытия&lt;/mark&gt;, а не добавлять модификатор показа.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ready&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.ui-button&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;click&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.ui-menu&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;is-hidden&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Разметка — чище. Из разметки сразу понятно базовое состояние «всё скрыто». Проще дебажить.&lt;/p&gt;
&lt;p&gt;Стили также пишутся исходя из мысли, что элемент всегда виден, а модификатор — скрывает. С анимацией там или ещё с чем угодно.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.ui-menu &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;visibility&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; visible&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// скрывалка&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token parent important&quot;&gt;&amp;amp;&lt;/span&gt;.is-hidden &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;visibility&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;wide&quot;&gt;
&lt;h2&gt;Ещё всяких ссылок про то, как скрывать/показывать элементы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ishadeed.com/article/hiding-web/&quot;&gt;Hiding Elements On The Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CSS-live, &lt;a href=&quot;https://css-live.ru/articles/eshhyo-chetyre-sposoba-skryt-i-pokazat-elementy-pri-pomoshhi-html-i-css.html&quot;&gt;Ещё четыре способа скрыть и показать элементы при помощи HTML и CSS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

        </content><category term="CSS" /></entry><entry><title>Как сделать автоматическую выгрузку транзакций из CloudPayments в CSV-файл</title><link href="https://sglazov.ru/notes/cloudpayments-payments-list/"/><published>2021-06-30T00:00:00Z</published><updated>2021-06-30T00:00:00Z</updated><id>https://sglazov.ru/notes/cloudpayments-payments-list/</id><media:thumbnail url="https://sglazov.ru/notes/cloudpayments-payments-list/images/covers/og.png" /><content type="html">
          &lt;h2&gt;Что происходит&lt;/h2&gt;
&lt;p&gt;Есть прекрасный CloudPayments для приёма платежей. Он умеет в выгрузку списка транзакций из интерфейса. В разделе «Транзакции» (в меню слева) над списком есть кнопка «Экспорт транзакций», по клику вам отправят на почту &lt;code&gt;*.csv&lt;/code&gt;-файл за месяц.&lt;/p&gt;
&lt;p&gt;Это такой ручной вариант: надо авторизоваться в личном кабинете, запросить файл, забрать его из почты, куда-то там загрузить. Долго и сложно. И это нужно делать бухгалтерии, им итак несладко, а тут ещё это.&lt;/p&gt;
&lt;p&gt;Хочется автоматического варианта. Чаще для автоматизации 1С (или любого интегратора) + CloudPayments.&lt;/p&gt;
&lt;h2&gt;Тезисно, идеальный вариант работы&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Есть &lt;code&gt;csv&lt;/code&gt;-файл (он прост, с ним легко работать и его понимают все), надо его как-то создавать&lt;/li&gt;
&lt;li&gt;Файл создаётся по расписанию&lt;/li&gt;
&lt;li&gt;Кладётся куда-то на сервер&lt;/li&gt;
&lt;li&gt;Есть FTP-доступ на этот сервер&lt;/li&gt;
&lt;li&gt;Доступ указывается где-то в 1С&lt;/li&gt;
&lt;li&gt;Бухгалтерия получает актуальную информацию по транзакциям, всё происходит автоматически&lt;/li&gt;
&lt;li&gt;Все радуются, занимаются другими полезными делами (считают деньги?)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Как сделать автоматическую выгрузку транзакций из CloudPayments&lt;/h2&gt;
&lt;p&gt;Через API от CloudPayments, конечно. Документация прекрасна. То, что нам нужно описано тут: https://developers.cloudpayments.ru/#vygruzka-spiska-tranzaktsiy&lt;/p&gt;
&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * Выгрузка списка транзакций
 *
 * https://developers.cloudpayments.ru/#vygruzka-spiska-tranzaktsiy
 *
 * API Lib: https://github.com/flowwow/cloudpayments-php-client
 */&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$today&lt;/span&gt;    &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;Y-m-d&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$publicId&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$pass&lt;/span&gt;     &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$apiClient&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name class-name-fully-qualified&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Flowwow&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Cloudpayments&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Library&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$publicId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$pass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token variable&quot;&gt;$response&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$apiClient&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getListPayment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name class-name-fully-qualified&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Flowwow&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Cloudpayments&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Request&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;PaymentsList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;2021-06-05&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;MSK&#39;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token variable&quot;&gt;$list&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$response&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;$publicId&lt;/code&gt; и &lt;code&gt;$pass&lt;/code&gt; — ваши «секреты» из настроек сайта в личном кабинете.&lt;/p&gt;
&lt;p&gt;В общем-то, это всё. Спасибо за лёгкость библиотеке для работы с API. Люблю прям опенсорс за такое.&lt;/p&gt;
&lt;p&gt;Вы получите &lt;code&gt;json&lt;/code&gt; со списком транзакций за сутки.&lt;/p&gt;
&lt;p&gt;Дальше нужно из этого ответа собрать &lt;code&gt;csv&lt;/code&gt;-файл. По пути можно чего-то там отфильтровать (например, собрать формат только сумма + название платежа, всё остальное неинтересно). Так вот, собрать файл и его куда-то положить. Ещё настроить автозапуск скрипта, чтобы файл создавался каждый день.&lt;/p&gt;

        </content><category term="PHP, CloudPayments, CSV" /></entry><entry><title>Организация шрифтов в проекте</title><link href="https://sglazov.ru/notes/fonts-in-project/"/><published>2020-09-30T00:00:00Z</published><updated>2020-09-30T00:00:00Z</updated><id>https://sglazov.ru/notes/fonts-in-project/</id><media:thumbnail url="https://sglazov.ru/notes/fonts-in-project/images/covers/og.png" /><content type="html">
          &lt;p&gt;Чаше всего я &lt;a href=&quot;https://github.com/sglazov/spt/blob/master/app/src/styles/variables/constants.scss#L2&quot;&gt;использую&lt;/a&gt; в проектах стандартный набор системных шрифтов:&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -apple-system&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; BlinkMacSystemFont&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&#39;Segoe UI&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Roboto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&#39;Helvetica Neue&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Helvetica&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
             Ubuntu&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
             Cantarell&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
             Arial&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&#39;Apple Color Emoji&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Segoe UI Emoji&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Segoe UI Symbol&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Один из них точно «попадёт» и текст на сайте будет выглядеть привычно для посетителя, как в его операционной системе.&lt;/p&gt;
&lt;p&gt;А нестандартные шрифты чаще всего рутина и боль. Я стараюсь организовать свой процесс, рассказываю, как.&lt;/p&gt;
&lt;h2&gt;Скачать и удобно переименовать&lt;/h2&gt;
&lt;aside&gt;
  &lt;figure&gt;
      &lt;img src=&quot;https://sglazov.ruundefinedimages/google-fonts-download-button.png&quot; width=&quot;281&quot; height=&quot;161&quot; alt=&quot;Кнопка «Download family» есть на большинстве страниц шрифтов в Google Fonts&quot;&gt;
      &lt;figcaption&gt;
          Пример кнопки на &lt;a href=&quot;https://fonts.google.com/specimen/Alegreya+Sans&quot;&gt;странице шрифта&lt;/a&gt; Alegreya Sans в Google Fonts, сентябрь 2020.
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/aside&gt;
&lt;p&gt;Для начала нужно скачать нужные начертания и положить к себе так, чтобы потом ими было удобно манипулировать.&lt;/p&gt;
&lt;p&gt;Google Fonts позволяет скачивать шрифты со страницы описания и отдаёт &lt;code&gt;*.ttf&lt;/code&gt;-вариант. Вверху справа есть кнопка «Download family».&lt;/p&gt;
&lt;p&gt;Далее каждую гарнитуру размещаю в папке с названием, соответствующим имени гарнитуры. Внутри папки — файлы с именем по начертанию. Стандартные имена файлов шрифтов с начертаниям сложны и многословны.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;├── fonts
│   └── alegreya-sans
│       ├── &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
│       ├── AlegreyaSans-Regular.ttf       &lt;span class=&quot;token comment&quot;&gt;# → normal.ttf&lt;/span&gt;
│       ├── AlegreyaSans-MediumItalic.ttf  &lt;span class=&quot;token comment&quot;&gt;# → 500-italic.ttf&lt;/span&gt;
│       ├── AlegreyaSans-Medium.ttf        &lt;span class=&quot;token comment&quot;&gt;# → 500.ttf&lt;/span&gt;
│       ├── AlegreyaSans-Bold.ttf          &lt;span class=&quot;token comment&quot;&gt;# → bold.ttf&lt;/span&gt;
│       ├── AlegreyaSans-BlackItalic.ttf   &lt;span class=&quot;token comment&quot;&gt;# → 900-italic.ttf&lt;/span&gt;
│       ├── AlegreyaSans-Black.ttf         &lt;span class=&quot;token comment&quot;&gt;# → 900.ttf&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Обычно &lt;code&gt;bold&lt;/code&gt; и &lt;code&gt;normal&lt;/code&gt; оставляю в буквенном варианте. И в CSS использую также буквенный вариант.&lt;/p&gt;
&lt;p&gt;После переименования нужно сконвертировал «тяжёлый» &lt;code&gt;*.ttf&lt;/code&gt; в лёгкие &lt;code&gt;*.woff&lt;/code&gt; и &lt;code&gt;*.woff2&lt;/code&gt;, которые являются архивами.&lt;/p&gt;
&lt;p&gt;В редких случаях лучше использовать &lt;a href=&quot;https://github.com/majodev/google-webfonts-helper/&quot;&gt;google-webfonts-helper&lt;/a&gt; — там есть все нужные и правильные варианты.&lt;/p&gt;
&lt;h2&gt;Генерация &lt;code&gt;*.woff/2&lt;/code&gt; из &lt;code&gt;*.ttf&lt;/code&gt;-файлов&lt;/h2&gt;
&lt;p&gt;Раньше я пользовался разными онлайн-инструментами, но &lt;a href=&quot;https://youtu.be/uI3Q5m9xkkw?t=997&quot;&gt;увидев консольный способ в докладе&lt;/a&gt; Вадима Макеева «_ ___ ______?», стал использовать только его:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# поставить пакет&lt;/span&gt;
brew tap bramstein/webfonttools
brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; woff2 sfnt2woff-zopfli

&lt;span class=&quot;token comment&quot;&gt;# перейти в папку со шрифтами&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; app/src/fonts/

&lt;span class=&quot;token comment&quot;&gt;# сконвертировать ttf&lt;/span&gt;
woff2_compress &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;.ttf     &lt;span class=&quot;token comment&quot;&gt;# → 500.woff2&lt;/span&gt;
sfnt2woff-zopfli &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;.ttf   &lt;span class=&quot;token comment&quot;&gt;# → 500.woff&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Увы, &lt;a href=&quot;https://github.com/bramstein/homebrew-webfonttools&quot;&gt;инструменты&lt;/a&gt; &lt;code&gt;@bramstein/webfonttools&lt;/code&gt; для генерации не умеют работать пакетно или по маске типа/имени файла. Каждый &lt;code&gt;*.ttf&lt;/code&gt;-файл нужно указать в ручном режиме. Дважды.&lt;/p&gt;
&lt;h2&gt;Подключение в стилях: SCSS, карты и @each&lt;/h2&gt;
&lt;p&gt;Всё, что нужно для подключения шрифта в стилях — это имя шрифта и набор его начертаний. Именно это я и указываю в карте шрифтов.&lt;/p&gt;
&lt;p&gt;Из имени шрифта &lt;a href=&quot;https://github.com/sglazov/spt/blob/master/app/src/styles/variables/functions-and-mixins.scss#L13-L31&quot;&gt;получается&lt;/a&gt; имя директории со шрифтом — пробелы заменяются на дефисы и регистр меняется на строчные. Всё это происходит в функции &lt;code&gt;slug(string)&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$global-font-path&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/fonts/&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// где вообще все шрифты в проекте&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// имя шрифтов и их начертания&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$fonts&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;Alegreya Sans&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; 300&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 500&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bold &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;Fira Code&quot;&lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; 100&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bold &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;@mixin&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;font-face&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$font&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// каждый стиль: обычный и курсив&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@each&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$style&lt;/span&gt; in &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;normal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; italic&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$font&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// если курсив, то добавить суффикс&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$font-file&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$style&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; italic&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$weight&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;-italic&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// повторить этот блок&lt;/span&gt;
    &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@font-face&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$font&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;font-display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; swap&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// это важно для отрисовки&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token url&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#{$global-font-path}#{$path}/#{$font-file}.woff2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;woff2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token url&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#{$global-font-path}#{$path}/#{$font-file}.woff&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;woff&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// для каждого шрифта и начертаний..&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;@each&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$font&lt;/span&gt;, &lt;span class=&quot;token variable&quot;&gt;$weight&lt;/span&gt; in &lt;span class=&quot;token variable&quot;&gt;$fonts&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// при разном количестве указания начертаний меняется тип переменной в SCSS o_O&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// проверяем это и если &gt; 1, list — проходим по всем в цикле...&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;@if&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;type-of&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;== list &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;@each&lt;/span&gt; &lt;span class=&quot;token selector&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$weight&lt;/span&gt; in &lt;span class=&quot;token variable&quot;&gt;$weight&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;font-face&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$font&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// если =1, используем это значение&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;@else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;@include&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;font-face&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$font&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;aside&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/sglazov/15333433c113c2fc729f972da9da2880&quot;&gt;GitHub Gist с результатом&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;Разумеется, подключаются только современные форматы. И используется &lt;code&gt;font-display: swap;&lt;/code&gt;, чтобы шрифт отображался сразу.&lt;/p&gt;
&lt;p&gt;Как только возникает необходимость подключить какой-то шрифт:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;генерируем &lt;code&gt;*.woff2&lt;/code&gt;- и &lt;code&gt;*.woff&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;добавляем в общую папку шрифтов: &lt;code&gt;./app/src/fonts/&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;в переменной &lt;code&gt;$fonts&lt;/code&gt; добавляем имя шрифта и необходимые начертания.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Предзагрузка шрифтов&lt;/h2&gt;
&lt;p&gt;Я предзагружаю файлы базовых начертаний только на главной странице через &lt;code&gt;preload&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;preload&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/fonts/alegreya-sans/normal.woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font/woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;preload&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/fonts/alegreya-sans/bold.woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;font/woff2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Не забывайте про атрибут &lt;code&gt;crossorigin&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Подробнее о предзагрузке любых ресурсов — в &lt;a href=&quot;https://3perf.com/blog/link-rels/&quot;&gt;посте&lt;/a&gt; Ивана Акулова: «Preload, prefetch and other &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tags» &lt;em&gt;(английский, или &lt;a href=&quot;https://habr.com/ru/post/445264/&quot;&gt;на русском на Хабре&lt;/a&gt;)&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Выводы, тезисно&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Скачивать и конвертировать. Лучше с надёжных источников;&lt;/li&gt;
&lt;li&gt;Переименовывать по начертанию, хранить в папке с именем шрифта;&lt;/li&gt;
&lt;li&gt;Максимально упросить подключение в стилях. Я использовал &lt;a href=&quot;https://sass-lang.com/documentation/values/maps&quot;&gt;SCSS Maps&lt;/a&gt; для указания шрифтов/начертаний, &lt;a href=&quot;http://www.sass-lang.com/documentation/at-rules/mixin&quot;&gt;&lt;code&gt;@mixin&lt;/code&gt;&lt;/a&gt; и &lt;a href=&quot;http://www.sass-lang.com/documentation/at-rules/control/each&quot;&gt;&lt;code&gt;@each&lt;/code&gt;&lt;/a&gt; для генерации нужных правил &lt;code&gt;@font-face&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Не забывать про предзагрузку;&lt;/li&gt;
&lt;li&gt;Часть работы можно автоматизировать на этапе сборки.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;wide&quot;&gt;
&lt;h2&gt;Ещё всякие ссылки про шрифты&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devhints.io/css-system-font-stack&quot;&gt;Расшифровка списка базовых шрифтов&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight#Common_weight_name_mapping&quot;&gt;Common weight name mapping&lt;/a&gt; в описании свойства font-weight на MDN&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caniuse.com/woff2&quot;&gt;Can I use... WOFF 2.0 &lt;/a&gt; &lt;span class=&quot;separator&quot;&gt;и&lt;/span&gt; &lt;a href=&quot;https://caniuse.com/woff&quot;&gt;Can I use... WOFF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://htmlacademy.ru/blog/boost/frontend/fonts-loading&quot;&gt;«Как подключить и оптимизировать нестандартные шрифты»&lt;/a&gt; — статья в блоге HTML Academy&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yoksel.github.io/easy-css/custom-fonts/&quot;&gt;Простые правила написания CSS — Кастомные шрифты&lt;/a&gt; от Йоксель&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://youtu.be/uI3Q5m9xkkw&quot;&gt;Доклад Вадима Макеева про шрифты&lt;/a&gt;: история, современное подключение, оптимизация, инструменты, форматы&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/majodev/google-webfonts-helper/&quot;&gt;google-webfonts-helper&lt;/a&gt; для того, чтобы скачать архив шрифтов с Google Fonts&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.fontsquirrel.com/tools/webfont-generator&quot;&gt;Font Squirrel Webfont Generator&lt;/a&gt; — старинный монструозный конвертер всего во всё — смотреть, как на музейный экспонат&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/funbox/beatrix#readme&quot;&gt;Beatrix&lt;/a&gt; — инструмент от ребят из FunBox для формирования сабсетов на этапе сборки и конвертации файлов шрифтов&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://csswizardry.com/2020/05/the-fastest-google-fonts/&quot;&gt;The Fastest Google Fonts&lt;/a&gt; от Гарри Робертса&lt;/li&gt;
&lt;li&gt;Сара Суайдан делится &lt;a href=&quot;https://www.sarasoueidan.com/blog/glyphhanger/&quot;&gt;инструкцией&lt;/a&gt;, как установить и настроить утилиту &lt;code&gt;glyphhanger&lt;/code&gt; для конвертации и сабсеттинга веб-шрифтов из командной строки&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://matthiasott.com/notes/woff-has-left-the-building&quot;&gt;WOFF Has Left the Building&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;mark&gt;Обновлено 22.09.2023&lt;/mark&gt;: добавлена ссылка на &lt;a href=&quot;https://matthiasott.com/notes/woff-has-left-the-building&quot;&gt;WOFF Has Left the Building&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;

        </content><category term="CSS, Fonts" /></entry><entry><title>Как настроить динамический ретаргетинг ВКонтакте (про JavaScript тоже)</title><link href="https://sglazov.ru/notes/vk-retargeting/"/><published>2019-10-13T00:00:00Z</published><updated>2019-10-13T00:00:00Z</updated><id>https://sglazov.ru/notes/vk-retargeting/</id><media:thumbnail url="https://sglazov.ru/notes/vk-retargeting/images/covers/og.png" /><content type="html">
          &lt;h2&gt;Чё делать-то?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Поставить пиксель на сайт. Просто скопируйте js-код и установите;&lt;/li&gt;
&lt;li&gt;Опишите события и вызовите их асинхронно, то есть гарантировано после того, как vk-пиксель инициализирован;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Как описывают события?&lt;/h2&gt;
&lt;p&gt;Всего событий сейчас 12 &lt;em&gt;(актуально на октябрь 2018 года)&lt;/em&gt;. Полный список можно найти по ссылкам-первоисточникам в разделе чуть ниже. У людей много вопросов появляется в духе, что именно за код, как его добавить, что делать, причём тут пример для Google Tag Manager и т.п.&lt;/p&gt;
&lt;p&gt;Всё проще, чем кажется.&lt;/p&gt;
&lt;p&gt;Вам важно знать &lt;code&gt;id&lt;/code&gt; товара из прайс-листа. Его видно в меню «Ретаргетинг» рекламных кампаний в ВК.&lt;/p&gt;
&lt;p&gt;В примерах ниже цифры &lt;code&gt;15901&lt;/code&gt; — это и есть &lt;code&gt;id&lt;/code&gt; прайс-листа. Замените на свой.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;view_home&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;vkAsyncInit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;VK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Retargeting&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ProductEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15901&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;view_home&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;VK pixel event send: view_home&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;view_search&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;vkAsyncInit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;VK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Retargeting&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ProductEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15901&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;view_search&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string-property property&quot;&gt;&quot;search_string&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ПОИСКОВЫЙ ЗАПРОС&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;VK pixel event send: view_search&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;view_category&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;vkAsyncInit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;VK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Retargeting&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ProductEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15901&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;view_category&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;VK pixel event send: view_category&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;view_other&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;vkAsyncInit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;VK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Retargeting&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ProductEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15901&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;view_other&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;VK pixel event send: view_other&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;add_payment_info&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;vkAsyncInit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;VK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Retargeting&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ProductEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15901&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;add_payment_info&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;VK pixel event send: add_payment_info&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;purchase&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;vkAsyncInit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;VK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Retargeting&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ProductEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15901&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;purchase&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;VK pixel event send: purchase&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;add_payment_info&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;vkAsyncInit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;VK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Retargeting&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ProductEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15901&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;add_payment_info&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;VK pixel event send: add_payment_info&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;init_checkout&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;vkAsyncInit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;VK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Retargeting&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ProductEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15901&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;init_checkout&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;VK pixel event send: init_checkout&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;view_product&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;vkAsyncInit&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;token constant&quot;&gt;VK&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Retargeting&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ProductEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15901&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;view_product&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string-property property&quot;&gt;&quot;products&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string-property property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ID ИЛИ АРТИКУЛ ПРОДУКТА&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;VK pixel event send: view_product&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;add_to_cart&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;onclick&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;VK.Retargeting.ProductEvent(15901, &quot;&lt;/span&gt;add_to_cart&lt;span class=&quot;token string&quot;&gt;&quot;, {&quot;&lt;/span&gt;products&lt;span class=&quot;token string&quot;&gt;&quot;: [{&quot;&lt;/span&gt;id&lt;span class=&quot;token string&quot;&gt;&quot;: &quot;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ID&lt;/span&gt; ИЛИ АРТИКУЛ ПРОДУКТА&lt;span class=&quot;token string&quot;&gt;&quot;}]});return false;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;remove_from_cart&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;onclick&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;VK.Retargeting.ProductEvent(15901, &quot;&lt;/span&gt;remove_from_cart&lt;span class=&quot;token string&quot;&gt;&quot;, {&quot;&lt;/span&gt;products&lt;span class=&quot;token string&quot;&gt;&quot;: [{&quot;&lt;/span&gt;id&lt;span class=&quot;token string&quot;&gt;&quot;: &quot;&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ID&lt;/span&gt; ИЛИ АРТИКУЛ ПРОДУКТА&lt;span class=&quot;token string&quot;&gt;&quot;}]});return false;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Особенности&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Если вы используете шаблонизатор &lt;code&gt;Smarty&lt;/code&gt;, то не забывайте &lt;a href=&quot;https://www.smarty.net/docsv2/ru/language.function.literal&quot;&gt;оборачивать&lt;/a&gt; JS-код в шаблонах в теги &lt;code&gt;{literal}...{/literal}&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Ещё на эту тему 🔥 🔥 🔥 🔥 🔥&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://vk.com/faq12164&quot;&gt;Настройка пикселя для динамического ретаргетинга&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vk.com/pages?oid=-19542789&amp;amp;p=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%80%D0%B5%D1%82%D0%B0%D1%80%D0%B3%D0%B5%D1%82%D0%B8%D0%BD%D0%B3&quot;&gt;Страница «Динамический ретаргетинг» во «ВКонтакте для бизнеса»&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vk.com/pages?oid=-19542789&amp;amp;p=%D0%9F%D0%B8%D0%BA%D1%81%D0%B5%D0%BB%D1%8C_%D0%B4%D0%BB%D1%8F_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%80%D0%B5%D1%82%D0%B0%D1%80%D0%B3%D0%B5%D1%82%D0%B8%D0%BD%D0%B3%D0%B0&quot;&gt;Пиксель для динамического ретаргетинга&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Куча сайтов в своих статьях, по сути, ссылается на эти материалы и/или пересказываю их, но не отвечают на вопрос &lt;em&gt;«как?»&lt;/em&gt;.&lt;/p&gt;

        </content><category term="VK, JS" /></entry></feed>
