Commit 675756d64b4bc893b56f3cf35a6498edbea87496
1 parent
4a98a44b
исправление микроразметки на blog/index 1
Showing
3 changed files
with
363 additions
and
7 deletions
Show diff stats
frontend/views/blog/_article.php
@@ -27,7 +27,7 @@ $imageHeight=240; | @@ -27,7 +27,7 @@ $imageHeight=240; | ||
27 | 27 | ||
28 | <div itemtype="http://schema.org/Article" itemscope class="blog-list-wr"> | 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 | <meta itemprop="url" content="<?=($model->image) ? $model->image->getPath() : null;?>"> | 32 | <meta itemprop="url" content="<?=($model->image) ? $model->image->getPath() : null;?>"> |
33 | <meta itemprop="height" content="<?=$imageWidth;?>"/> | 33 | <meta itemprop="height" content="<?=$imageWidth;?>"/> |
@@ -48,9 +48,10 @@ $imageHeight=240; | @@ -48,9 +48,10 @@ $imageHeight=240; | ||
48 | </div> | 48 | </div> |
49 | 49 | ||
50 | <div class="blog-all-date-views"> | 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 | <div class="blog-views-comments-ico"> | 55 | <div class="blog-views-comments-ico"> |
55 | <div class="blog-comments-ico"><?=count($model->comments)?></div> | 56 | <div class="blog-comments-ico"><?=count($model->comments)?></div> |
56 | <div class="blog-views-ico"><?=$model->views?></div> | 57 | <div class="blog-views-ico"><?=$model->views?></div> |
@@ -64,6 +65,8 @@ $imageHeight=240; | @@ -64,6 +65,8 @@ $imageHeight=240; | ||
64 | 65 | ||
65 | 66 | ||
66 | <meta itemprop="name" content="<?= \Yii::t('app', 'ABC short'); ?>"> | 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 | </div> | 71 | </div> |
69 | 72 | ||
@@ -77,7 +80,8 @@ $imageHeight=240; | @@ -77,7 +80,8 @@ $imageHeight=240; | ||
77 | 80 | ||
78 | <div itemprop="image" itemscope itemtype="https://schema.org/ImageObject"> | 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 | <meta itemprop="height" content="<?= $imageHeight; ?>"/> | 86 | <meta itemprop="height" content="<?= $imageHeight; ?>"/> |
83 | 87 |
frontend/views/blog/index.php
@@ -6,7 +6,7 @@ | @@ -6,7 +6,7 @@ | ||
6 | use yii\web\View; | 6 | use yii\web\View; |
7 | use yii\widgets\ActiveForm; | 7 | use yii\widgets\ActiveForm; |
8 | use yii\widgets\ListView; | 8 | use yii\widgets\ListView; |
9 | - | 9 | +use frontend\widgets\SeoLinks; |
10 | /** | 10 | /** |
11 | * @var View $this | 11 | * @var View $this |
12 | * @var ActiveDataProvider $dataProvider | 12 | * @var ActiveDataProvider $dataProvider |
@@ -94,4 +94,10 @@ | @@ -94,4 +94,10 @@ | ||
94 | </div> | 94 | </div> |
95 | </div> | 95 | </div> |
96 | </div> | 96 | </div> |
97 | -</section> | ||
98 | \ No newline at end of file | 97 | \ No newline at end of file |
98 | +</section> | ||
99 | +<?php SeoLinks::widget( | ||
100 | + [ | ||
101 | + 'pagination' => $dataProvider->pagination, | ||
102 | + 'seo' => $seo, | ||
103 | + ] | ||
104 | +) ?> | ||
99 | \ No newline at end of file | 105 | \ No newline at end of file |
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 | + |