За обновлениями можно следить в telegram-канале https://t.me/quasiart

Формат AMP создан компанией Google для отображения лёгких версий страниц сайта. Такие страницы оптимизированы для более быстрой загрузки страницы, особенно при медленном интернете. Такой формат подходит для новостных и контентных сайтов, предоставляющих в основном содержимое для чтения.

Google при определённых условиях будет ранжировать AMP-версии страниц выше, поэтому внедрение AMP хорошо скажется на SEO сайта.

В этой статье я расскажу, как сделать AMP-версию любой страницы сайта в MODX Revolution, хотя подход можно применить и для других CMS.

0 Сниппет

Нужно создать сниппет, который собирает информацию о странице и кладёт её в плейсхолдеры (заголовок, содержимое и так далее). Я назвал сниппет GoogleAmp.

<?php
$site_url = MODX_SITE_URL;
$base_url = MODX_BASE_PATH;
$get = modX::sanitize($_GET, $modx->sanitizePatterns);
$alias = urldecode($get['page']);
$resource = $modx->getObject('modResource', [
    'alias'=>$alias,
    'class_key'=>'modDocument'
]);
$prefix = 'amp.';

if ($resource) {
    $placeholders = [
        'pagetitle' => $resource->get('pagetitle'),
        'content' => $resource->get('content'),
        'canonical' => $modx->makeUrl($resource->get('id'), '', '', 'full'),
        'published' => $resource->get('publishedon'),
        'edited' => $resource->get('editedon'),
    ];
    
    $tvName = 'image';
    $tvValue = $resource->getTVValue($tvName);
    if (!empty($tvValue)) {
        $image_url = $site_url.$tvValue;
        $image_base = $base_url.$tvValue;
        list($width, $height) = getimagesize($image_base);
        $placeholders[$tvName] = $tvValue;
        $placeholders[$tvName.'_width'] = $width;
        $placeholders[$tvName.'_height'] = $height;
    }
    
    $modx->setPlaceholders($placeholders, $prefix);
}

Дополнительно я создал небольшой сниппет ampCodeEntities:

<?php
$input = str_replace('<link ', '&lt;link ', $input);
$input = str_replace(' />', ' /&gt;', $input);
return $input;

1 Шаблон

Далее создаём новый шаблон, можно назвать как угодно, я назвал AMP. Он нужен для отображения ресурса в формате AMP.

[[!GoogleAmp]]<!doctype html>
<html amp lang="en">
[[$AMPHead]]
<body>
<h1>[[+amp.pagetitle]]</h1>
<article>
	[[+amp.content:ampCodeEntities]]
</article>
</body>
</html>

2 Чанк

Раздел head с различными meta-тегами и прочим для AMP-страницы отличается от традиционного, его тоже необходимо создать. Чанк я назвал AMPHead.

<head>
    <meta charset="utf-8" />

    <title>[[+amp.pagetitle:htmlentities]]</title>
    <meta itemprop="name" content="[[+amp.pagetitle:htmlentities]]" />
    <meta itemprop="description" content="[[+amp.description:htmlentities]]" />
    <meta itemprop="image" content="[[!++site_url]][[+amp.image:default=`assets/templates/main/images/touch-icon-ipad-retina.png`]]" />
    
    <meta name="mobile-web-app-capable" content="yes" />
    <meta name="theme-color" content="#233539" />
    <meta name="application-name" content="quasi-art.ru" />
        
    <link rel="canonical" href="[[+amp.canonical]]" />
    <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1" />
    <script type="application/ld+json">
      {
        "@context": "http://schema.org",
        "@type": "NewsArticle",
        "headline": "[[+amp.pagetitle]]",
        "datePublished": "[[+amp.published]]",
        "dateModified": "[[+amp.edited]]",
        "author": "[[++site_name]]",
        "mainEntityOfPage": {
         "@type": "WebPage",
         "@id": "[[++site_url]]"
        },
        "publisher": {
         "@type": "Organization",
         "name": "quasi-art.ru",
         "logo": {
            "@type": "ImageObject",
            "width": "152",
            "height": "152",
            "url":"[[!++site_url]]assets/templates/main/images/touch-icon-ipad-retina.png"
         }
        },
        "image": {
            "@type": "ImageObject",
            "width": "[[+amp.image_width:default=`152`]]",
            "height": "[[+amp.image_height:default=`152`]]",
            "url":"[[!++site_url]][[+amp.image:default=`assets/templates/main/images/touch-icon-ipad-retina.png`]]"
        }
      }
    </script>

3 Ресурс

Далее нужно создать универсальный ресурс, который будет служить входной точкой для всех AMP-страниц. Можно назвать его как угодно, главное — указать у него шаблон AMP.

Это входная точка у всех AMP-страниц. Этой странице будет передаваться GET-параметр, содержащий псевдоним (alias) страницы, например:

https://quasi-art.ru/amp?page=modx-and-amp

Например, AMP-версия этой статьи: https://quasi-art.ru/amp?page=modx-and-amp

4 Шаблон оригинальной версии

В шаблоны оригинальных версий страниц (у меня он называется Article) нужно добавить мета-тег, указывающий на адрес AMP-версию текущей страницы:

<link rel="amphtml" href="[[~350? &scheme=`[[++server_protocol]]` &page=`[[*alias]]`]]" />

, где 350 — это id ресурса AMP, созданного в третьем пункте.

В итоге это должно выглядеть примерно так:

<link rel="amphtml" href="https://quasi-art.ru/amp?page=modx-and-amp" />

Как проверить AMP-страницу

Для валидации AMP-страниц есть сервис: https://search.google.com/test/amp.