Commit 675756d64b4bc893b56f3cf35a6498edbea87496

Authored by alex
1 parent 4a98a44b

исправление микроразметки на blog/index 1

frontend/views/blog/_article.php
... ... @@ -27,7 +27,7 @@ $imageHeight=240;
27 27  
28 28 <div itemtype="http://schema.org/Article" itemscope class="blog-list-wr">
29 29  
30   - <div itemprop="logo" itemscope itemtype="https://schema.org/ImageObject" class="img-blog-list">
  30 + <div itemscope itemtype="https://schema.org/ImageObject" class="img-blog-list">
31 31  
32 32 <meta itemprop="url" content="<?=($model->image) ? $model->image->getPath() : null;?>">
33 33 <meta itemprop="height" content="<?=$imageWidth;?>"/>
... ... @@ -48,9 +48,10 @@ $imageHeight=240;
48 48 </div>
49 49  
50 50 <div class="blog-all-date-views">
51   - <?php #die(var_dump($model)); ?>
52   - <metacontent="<?=date('d.m.Y', $model->created_at);?>"/>
53   - <div itemprop="datePublished" class="blog-date"><?=date('d.m.Y', $model->created_at)?></div>
  51 +
  52 + <metacontent
  53 + ="<?= date('d-m-Y', $model->created_at); ?>"/>
  54 + <div itemprop="datePublished" class="blog-date"><?= date('d-m-Y', $model->created_at) ?></div>
54 55 <div class="blog-views-comments-ico">
55 56 <div class="blog-comments-ico"><?=count($model->comments)?></div>
56 57 <div class="blog-views-ico"><?=$model->views?></div>
... ... @@ -64,6 +65,8 @@ $imageHeight=240;
64 65  
65 66  
66 67 <meta itemprop="name" content="<?= \Yii::t('app', 'ABC short'); ?>">
  68 + <meta itemprop="logo"
  69 + content="<?= 'https://as01.epimg.net/epik/imagenes/2018/03/10/portada/1520705351_010030_1520705450_noticia_normal.jpg'; ?>">
67 70  
68 71 </div>
69 72  
... ... @@ -77,7 +80,8 @@ $imageHeight=240;
77 80  
78 81 <div itemprop="image" itemscope itemtype="https://schema.org/ImageObject">
79 82  
80   - <meta itemprop="url" content="<?= ($model->image !== null) ? $model->image->getPath() : ''; ?>">
  83 + <meta itemprop="url"
  84 + content="<?= 'https://as01.epimg.net/epik/imagenes/2018/03/10/portada/1520705351_010030_1520705450_noticia_normal.jpg'; ?>">
81 85  
82 86 <meta itemprop="height" content="<?= $imageHeight; ?>"/>
83 87  
... ...
frontend/views/blog/index.php
... ... @@ -6,7 +6,7 @@
6 6 use yii\web\View;
7 7 use yii\widgets\ActiveForm;
8 8 use yii\widgets\ListView;
9   -
  9 +use frontend\widgets\SeoLinks;
10 10 /**
11 11 * @var View $this
12 12 * @var ActiveDataProvider $dataProvider
... ... @@ -94,4 +94,10 @@
94 94 </div>
95 95 </div>
96 96 </div>
97   -</section>
98 97 \ No newline at end of file
  98 +</section>
  99 +<?php SeoLinks::widget(
  100 + [
  101 + 'pagination' => $dataProvider->pagination,
  102 + 'seo' => $seo,
  103 + ]
  104 +) ?>
99 105 \ No newline at end of file
... ...
frontend/widgets/SeoLinks.php 0 → 100644
  1 +<?php
  2 +/**
  3 + * ====================================================================================================================|
  4 + * @author artbox Khonko Alex
  5 + * Виджет, полностью копирует \artbox\artbox-core\widgets\SeoWidget
  6 + * Примечание:
  7 + * Я не смог чисто унаследовать виджет, потому что в основу его ложится родительский вариант
  8 + * SeoWidget::run -> parent::run
  9 + * При наследовании у меня выдавалось по 2 одинаковых link prev/link next
  10 + * Поэтому ядро виджета я вернул в исходное состояние, поменял use во всех местах на свой, мой является
  11 + * как минимум на 50% дописанным/переписанным вариантом для линии
  12 + * ====================================================================================================================|
  13 + */
  14 +
  15 +namespace frontend\widgets;
  16 +
  17 +use Yii;
  18 +use common\components\Substringer;
  19 +use yii\helpers\Url;
  20 +use yii\base\Widget;
  21 +use yii\data\Pagination;
  22 +use yii\helpers\VarDumper as d;
  23 +
  24 +class SeoLinks extends Widget
  25 +{
  26 +
  27 + /**
  28 + * @var null | Pagination
  29 + * @var null | \common\components\SeoComponent
  30 + */
  31 + public $pagination = null;
  32 +
  33 + public $canonical = true;
  34 +
  35 + public $firstpageWithoutParameter = false;
  36 +
  37 + public $seo = null;
  38 + /**
  39 + * @inheritdoc
  40 + */
  41 +
  42 + /**
  43 + * ============================================================================================================|
  44 + * Правка от Саши
  45 + * 1) Если есть параметры в урле, Canonical должен вести на страницу без параметров,
  46 + * за исключением Пагинации и сортировки. И next/prev чтобы были без этих параметров
  47 + * Пример страницы
  48 + * https://www.linija-svitla.ua/catalog/ulichnoe-osveshchenie?page_num=3&fcatlist=3268%2C&sort=test_test&3269%2C3270%2C3272%2C3273%2C3274%2C3275&page=50&per-page=18
  49 + * ************************************************************************************************************
  50 + * 2) link prev со 2й страницы должен ссылатся на первую, НО ,
  51 + * a) там должна отсутствовать пагинация б) должна остатся сортировка
  52 + * Прим
  53 + * Было https://www.linija-svitla.ua/catalog/ulichnoe-osveshchenie?page=1&per=page=18&sort=title_asc
  54 + * Стало https://www.linija-svitla.ua/catalog/ulichnoe-osveshchenie?sort=title_asc
  55 + * ============================================================================================================|
  56 + * 3) При 301 редирректе от НеЧПУ продуктам/фильтрам к ЧПУ, теги prev/next ссылаются на старые НеЧПУ
  57 + * страницы
  58 + * ============================================================================================================|
  59 + */
  60 + public function run()
  61 + {
  62 +
  63 + # 0 изменяем ссылку, оставляя в ней только пагинацию и сортировку
  64 + $firstRegex = '/(\??|&?)page=\d{1,5}&per-page=\d{1,5}/';
  65 + $secondRegex = '/(\?|&)sort=[a-zA-z_]+/';
  66 + $requiredDelimiter = '?';
  67 + $firstConcatenateSymbol = '?';
  68 + $secondConcatenateSymbol = '&';
  69 +
  70 + $links = $this->pagination->getLinks();
  71 +
  72 + if ($this->canonical and ($this->seo->getRobots() != 'noindex,nofollow' and $this->seo->getRobots() != 'noindex,follow' and $this->seo->getRobots() != 'noindex, nofollow' and $this->seo->getRobots() != 'noindex, follow')
  73 + ) {
  74 + # 0
  75 + $cannonicalLink = Substringer::changeStringByRegex(
  76 + Yii::$app->request->getAbsoluteUrl(),
  77 + $firstRegex,
  78 + $secondRegex,
  79 + $requiredDelimiter,
  80 + $firstConcatenateSymbol,
  81 + $secondConcatenateSymbol
  82 + );
  83 + # 1 В канониклах должна присутствовать только пагинация, удаляю всё, что не есть пагинацией
  84 + if ((strpos($cannonicalLink, '?page'))) {
  85 + $cannonicalLink = Substringer::simpleStringSubstring($cannonicalLink, '&sort');
  86 + } else {
  87 + $cannonicalLink = Substringer::changeStringByRegex(
  88 + Yii::$app->request->getAbsoluteUrl(),
  89 + $firstRegex,
  90 + $secondRegex,
  91 + $requiredDelimiter,
  92 + $firstConcatenateSymbol,
  93 + $secondConcatenateSymbol
  94 + );
  95 + $cannonicalLink = Substringer::simpleStringSubstring($cannonicalLink, '&sort');
  96 + /**
  97 + * Сейчас ссылка имеет вид: www.siteName.com?page=X&per-page=X
  98 + */
  99 +
  100 + # 1.1 Если в результате у нас остается URL вида www.siteName.com?
  101 + # обрезаем этот ?
  102 + if (strpos($cannonicalLink, '?') && !strpos($cannonicalLink, '?page')) {
  103 + $cannonicalLink = stristr($cannonicalLink, '?', true);
  104 + }
  105 +
  106 + # 1.2 если ссылка содержит в себе пагинацию, НО она по каким-то причинам не первая,
  107 + # удаляем все GET параметры до неё, и заменяем & на ?
  108 + if (strpos($cannonicalLink, '?page') !== false) {
  109 + $cannonicalLinkRigth = stristr($cannonicalLink, '&page');
  110 + $cannonicalLinkRigth = substr($cannonicalLinkRigth, 1);
  111 + $cannonicalLinkRigth = '?' . $cannonicalLinkRigth;
  112 +
  113 + $cannonicalLink = stristr($cannonicalLink, '?', true);
  114 + $cannonicalLink .= $cannonicalLinkRigth;
  115 + }
  116 +
  117 + }
  118 + # если нашем очищенном каноникле есть ? в конце(www.siteName.com?page=X&per-page=X?), убираем его
  119 + $cannonicalLink = ($cannonicalLink[strlen($cannonicalLink) - 1] !== '?') ? $cannonicalLink : rtrim(
  120 + $cannonicalLink,
  121 + '?'
  122 + );
  123 +
  124 + # 1.3 в каноникле должна сохранятся очередность нужных GET параметров
  125 + # берём финальную ссылку и если нужно, перерисовываем её
  126 + $seoCuttedLink = $this->changeLinksToRequestView($cannonicalLink, Yii::$app->request->getAbsoluteUrl());
  127 + $this->view->registerLinkTag(
  128 + [
  129 + 'rel' => 'canonical',
  130 + 'href' => $cannonicalLink,
  131 + ]
  132 + );
  133 + }
  134 +
  135 + /**
  136 + * =========================================================================================================
  137 + * То же самое для тега next
  138 + * =========================================================================================================
  139 + */
  140 +
  141 + if (key_exists('next', $links)) {
  142 + #2.1 Обрезаем ссылку справа по заданным GET regexp-ам
  143 + $nextPageGetQueryString = stristr(
  144 + Substringer::changeStringByRegex(
  145 + $links['next'],
  146 + $firstRegex,
  147 + $secondRegex,
  148 + $requiredDelimiter,
  149 + $firstConcatenateSymbol,
  150 + $secondConcatenateSymbol
  151 + ),
  152 + '?'
  153 + );
  154 + # 2.2 сливаем левую и правую часть
  155 + $nextLinkTitle = Substringer::simpleStringSubstring(
  156 + Yii::$app->request->url,
  157 + '?'
  158 + ) . $nextPageGetQueryString;
  159 +
  160 + # 2.3 перестраиваем сслыку согласно входящему стилю
  161 + $nextLinkTitle = $this->changeLinksToRequestView($nextLinkTitle, Yii::$app->request->url);
  162 +
  163 + $this->view->registerLinkTag(
  164 + [
  165 + 'rel' => 'next',
  166 + 'href' => $nextLinkTitle,
  167 + ]
  168 + );
  169 + }
  170 +
  171 + if ($this->firstpageWithoutParameter and $this->pagination->page == 1) {
  172 + if (key_exists('prev', $links)) {
  173 + $link = stristr(\Yii::$app->request->url, '?', true);
  174 + /**
  175 + * @var \artbox\catalog\models\Filter $filter
  176 + */
  177 + $filter = \Yii::$app->get('filter')->filterObj;
  178 + if (key_exists($link, $filter->getReplacedFilters())) {
  179 + $link = $filter->getReplacedFilters()[$link];
  180 + }
  181 +
  182 + $seoCuttedLink = $this->changeLinksToRequestView($link, Yii::$app->request->url);
  183 + $this->view->registerLinkTag(
  184 + [
  185 + 'rel' => 'prev',
  186 + 'href' => $seoCuttedLink,
  187 +
  188 + ]
  189 + );
  190 + }
  191 + } else {
  192 + if (key_exists('prev', $links)) {
  193 +
  194 + # правка 3 Я не ломаю старых наработок, а просто прокидываю новый(если был редирект) URL prev для
  195 + // предыдущих правок
  196 + $prevPageGetQueryString = stristr(
  197 + Substringer::changeStringByRegex(
  198 + $links['prev'],
  199 + $firstRegex,
  200 + $secondRegex,
  201 + $requiredDelimiter,
  202 + $firstConcatenateSymbol,
  203 + $secondConcatenateSymbol
  204 + ),
  205 + '?'
  206 + );
  207 + $prevLinkTitle = Substringer::simpleStringSubstring(
  208 + Yii::$app->request->url,
  209 + '?'
  210 + ) . $prevPageGetQueryString;
  211 + # правка 2
  212 + $seoStringStart = $prevLinkTitle;
  213 + $seoCuttedLink = $seoStringStart;
  214 + $seoCuttedLink = Substringer::changeStringByRegex(
  215 + $seoCuttedLink,
  216 + $firstRegex,
  217 + $secondRegex,
  218 + $requiredDelimiter,
  219 + $firstConcatenateSymbol,
  220 + $secondConcatenateSymbol
  221 + );
  222 +
  223 + if (strpos($seoStringStart, '?page=1')) {
  224 +
  225 + /**
  226 + * Правка для категории/блога
  227 + * У них разное к-во страниц, поэтому на замену конкретной срезки URL(?page=1&per-page=18) как было раньше,
  228 + * я буду автоматически пересматривать currentPageSizeParam для странички
  229 + */
  230 + $perPageParam = false;
  231 +
  232 + # если в $seoCuttredLink уже есть пагинация, то паршу строку и достаю реальное к-во записей для страницы
  233 + if (strpos($seoCuttedLink, 'per-page')) {
  234 + $perPageParam = parse_str($seoCuttedLink, $params);
  235 + $perPageParam = (isset ($params['per-page'])) ? $params['per-page'] : false;
  236 + }
  237 + # или же ставлю размер как в frontend/views/category,
  238 + # потому что большая часть кода здесь заточена именно под currentPerPageSizeParam=18
  239 + $perPageParam = ($perPageParam === false) ? 18 : $perPageParam;
  240 + $seoCuttedLink = str_replace('?page=1&per-page=' . $perPageParam, '?', $seoCuttedLink);
  241 + $seoCuttedLink = str_replace('&', '', $seoCuttedLink);
  242 + $strlen = mb_strlen($seoCuttedLink);
  243 + if ($seoCuttedLink[$strlen - 1] == '?') {
  244 + $seoCuttedLink = str_replace('?', '', $seoCuttedLink);
  245 + }
  246 +
  247 + } else {
  248 + $seoCuttedLink = $seoStringStart;
  249 + }
  250 +
  251 + # правка 2
  252 +
  253 + if (strpos($seoCuttedLink, '?sort')) {
  254 + if (strpos($seoCuttedLink, '&page=1')) {
  255 + $seoCuttedLink = Substringer::simpleStringSubstring($seoCuttedLink, '&page=1&per-page');
  256 + }
  257 +
  258 + }
  259 +
  260 + $seoCuttedLink = Substringer::changeStringByRegex(
  261 + $seoCuttedLink,
  262 + $firstRegex,
  263 + $secondRegex,
  264 + $requiredDelimiter,
  265 + $firstConcatenateSymbol,
  266 + $secondConcatenateSymbol
  267 + );
  268 + # поправляем URL выдачи, если он после всего имеет такой вид: <link href="/catName/subCatName?page=Xper-page=Xsort=param1_val1" rel="prev">
  269 + if (preg_match('/\d+sort=/', $seoCuttedLink) != false) {
  270 + $seoCuttedLinkRigth = stristr($seoCuttedLink, 'sort=');
  271 + $seoCuttedLink = stristr($seoCuttedLink, 'sort=', true) . '&' . $seoCuttedLinkRigth;
  272 + }
  273 + # то же самое, если в пагинации URL пропущен & ==> www.site.com?page=Xper-page=X
  274 + if (preg_match('/\d+per-page=/', $seoCuttedLink) != false) {
  275 + $seoCuttedLinkRigth = stristr($seoCuttedLink, 'per-page=');
  276 + $seoCuttedLink = stristr($seoCuttedLink, 'per-page=', true) . '&' . $seoCuttedLinkRigth;
  277 + }
  278 +
  279 + $seoCuttedLink = $this->changeLinksToRequestView($seoCuttedLink, Yii::$app->request->url);
  280 +
  281 + $this->view->registerLinkTag(
  282 + [
  283 + 'rel' => 'prev',
  284 + 'href' => $seoCuttedLink,
  285 + ]
  286 + );
  287 + }
  288 + }
  289 +
  290 + parent::run();
  291 + }
  292 +
  293 + /**
  294 + * @param string $link
  295 + * @param string $requestUrl
  296 + * =========================================================================================================
  297 + * Метод, который берет строку(URL), и преобразовывает его в вид, в котором он поступал. Написан для тегов
  298 + * next/prev/cannonical
  299 + * =========================================================================================================
  300 + * К нам приходит сюда(в данный виджет) URL, из которого нужно сформировать данные 3 линка. По всем Саниным
  301 + * правкам, они должны быть в одном из форматов:
  302 + * + новенькийЧпу?page=X&per-page=X&sort=param_val
  303 + * + новенькийЧпу?sort=param_val&page=X&per-page=X
  304 + * Метод берет текущий URL, смотрит какая из 2 вариаций пришла, и не меняя уже написанной логики
  305 + * возвращает обработанную конечтную строку,идентичную входящей
  306 + *Если в текущем URL отсутствует погинация, НО присутствует сортировка,
  307 + * делает ссылку типа www.siteName.com?sort=var_param&page=X&per-page=X
  308 + * =========================================================================================================
  309 + *
  310 + * @return string
  311 + */
  312 + private function changeLinksToRequestView(string $link, string $requestUrl)
  313 + {
  314 + $positionSort = (strpos($requestUrl, 'sort=') !== false) ? strpos($requestUrl, 'sort=') : 0;
  315 + $positionPagination = (strpos($requestUrl, 'page=') !== false) ? strpos($requestUrl, 'page=') : 0;
  316 +
  317 + $regex1 = '/(\??|&?)page=\d{1,5}&per-page=\d{1,5}/';
  318 + $regex2 = '/(\??|&)sort=[a-zA-z_]+&?/';
  319 +
  320 + /*
  321 + * У нас 5 вариантов:
  322 + * sort>page ===> пагинация идёт первой
  323 + * sort<page ===> перввая сортировка
  324 + * !sort
  325 + * !page
  326 + * !sort !page
  327 + */
  328 + $option = $positionSort - $positionPagination;
  329 + if ($option > 0 && $positionPagination != 0)// первая пагинация
  330 + {
  331 + $link = Substringer::changeStringByRegex($link, $regex1, $regex2, '?', '?', '&');
  332 + } elseif ($option > 0 && $positionPagination == 0)//есть сортировка, но нету пагинации
  333 + {
  334 + $link = Substringer::changeStringByRegex($link, $regex2, $regex1, '?', '?', '&');
  335 + } elseif ($option < 0)// page>sort
  336 + {
  337 + $link = Substringer::changeStringByRegex($link, $regex2, $regex1, '?', '?', '&');
  338 + } else // нету ни сортировки, ни пагинации
  339 + {
  340 + $link = Substringer::changeStringByRegex($link, $regex2, $regex1, '?', '?', '&');
  341 + }
  342 + $result = $link;
  343 + return $result;
  344 + }
  345 +}
  346 +
... ...