RSS for Yandex Turbo - Version 1.31

Version Description

(04.02.2022) =

  • ajax- ( ).
  • .
  • php 7.4 .
  • .
  • "yturbo_thumb_imgurl" "yturbo_thumb_caption" , , "" WordPress ( FAQ).
  • .
  • js- .
Download this release

Release Info

Developer Flector
Plugin Icon 128x128 RSS for Yandex Turbo
Version 1.31
Comparing to
See all releases

Code changes from version 1.30 to 1.31

inc/Contents.php CHANGED
@@ -174,7 +174,7 @@ class YTurbo_Contents {
174
  $class_patt = $tag_patt = $level_tags = array();
175
  foreach( $tags as $tag ){
176
  // class
177
- if( $tag{0} == '.' ){
178
  $tag = substr( $tag, 1 );
179
  $link = & $class_patt;
180
  }
174
  $class_patt = $tag_patt = $level_tags = array();
175
  foreach( $tags as $tag ){
176
  // class
177
+ if( $tag[0] == '.' ){
178
  $tag = substr( $tag, 1 );
179
  $link = & $class_patt;
180
  }
inc/yturbo-css.css CHANGED
@@ -136,6 +136,18 @@ td table {
136
  .hide {
137
  display:none;
138
  }
 
 
 
 
 
 
 
 
 
 
 
 
139
  .list_terms_scroll_wrapper {
140
  overflow: auto;
141
  min-height: 25px;
@@ -143,11 +155,12 @@ td table {
143
  max-width: 650px;
144
  vertical-align: middle;
145
  border: 1px solid #c4bfbf;
146
- padding: 3px 6px 2px 6px;
147
  border-radius: 3px;
148
  }
149
  .list_terms_scroll_wrapper ul{
150
- margin: 4px 2px 0 2px;
 
151
  }
152
  .list_terms_scroll_wrapper li{
153
  width: auto;
136
  .hide {
137
  display:none;
138
  }
139
+ .list_terms_scroll_wrapper::-webkit-scrollbar {
140
+ width: 11px;
141
+ }
142
+ .list_terms_scroll_wrapper::-webkit-scrollbar-track {
143
+ background: #f0f0f1;
144
+ }
145
+ .list_terms_scroll_wrapper::-webkit-scrollbar-thumb {
146
+ background-color: #c4bfbf;
147
+ border-radius: 6px;
148
+ border: 3px solid #f0f0f1;
149
+ min-height: 50px;
150
+ }
151
  .list_terms_scroll_wrapper {
152
  overflow: auto;
153
  min-height: 25px;
155
  max-width: 650px;
156
  vertical-align: middle;
157
  border: 1px solid #c4bfbf;
158
+ padding: 3px 0px 2px 6px;
159
  border-radius: 3px;
160
  }
161
  .list_terms_scroll_wrapper ul{
162
+ margin: 4px 0px 0 2px;
163
+ display: inline-block;
164
  }
165
  .list_terms_scroll_wrapper li{
166
  width: auto;
inc/yturbo-script.js CHANGED
@@ -679,7 +679,7 @@ jQuery(document).ready(function($) {
679
  load_disallow(taxonomy);
680
  $('#exclude_' + taxonomy).parent('.list_terms_scroll_wrapper').scroll(function() {
681
  var parent = $(this),
682
- content = parent.children('div');
683
  if (parent.scrollTop() + parent.height() > content.height() - 10)
684
  load_disallow(taxonomy);
685
  })
679
  load_disallow(taxonomy);
680
  $('#exclude_' + taxonomy).parent('.list_terms_scroll_wrapper').scroll(function() {
681
  var parent = $(this),
682
+ content = parent.children('ul');
683
  if (parent.scrollTop() + parent.height() > content.height() - 10)
684
  load_disallow(taxonomy);
685
  })
readme.txt CHANGED
@@ -3,9 +3,9 @@ Contributors: Flector
3
  Donate link: https://money.yandex.ru/to/41001443750704/200
4
  Tags: yandex, turbo, yandex turbo, rss, feed, турбо, яндекс турбо, яндекс
5
  Requires at least: 4.4
6
- Tested up to: 5.7
7
  Requires PHP: 5.3
8
- Stable tag: 1.30
9
 
10
  Создание RSS-ленты для сервиса Яндекс.Турбо.
11
 
@@ -50,6 +50,16 @@ RSS-лента для Яндекс.Турбо никогда не сможет
50
 
51
  Проверять RSS-ленты надо в Яндекс.Вебмастере, в разделе "Турбо-страницы\Источники". После добавления RSS-ленты Яндекс через пару минут выдаст свой "диагноз".
52
 
 
 
 
 
 
 
 
 
 
 
53
  = Яндекс сильно нагружает сервер, что делать? =
54
 
55
  Установите любой из плагинов кэширования. Они все умеют кэшировать RSS-ленты.
@@ -422,6 +432,29 @@ add_filter( 'yturbo_tags_list', 'my_custom_tags_list' );`
422
 
423
  В список можно включать только парные теги (имеющие тег закрытия). Самозакрывающиеся теги фильтром будут проигнорированы.
424
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
425
 
426
  == Screenshots ==
427
 
@@ -431,6 +464,16 @@ add_filter( 'yturbo_tags_list', 'my_custom_tags_list' );`
431
 
432
  == Changelog ==
433
 
 
 
 
 
 
 
 
 
 
 
434
  = 1.30 (19.04.2021) =
435
 
436
  * исправлена js-уязвимость на странице настроек плагина.
3
  Donate link: https://money.yandex.ru/to/41001443750704/200
4
  Tags: yandex, turbo, yandex turbo, rss, feed, турбо, яндекс турбо, яндекс
5
  Requires at least: 4.4
6
+ Tested up to: 5.9
7
  Requires PHP: 5.3
8
+ Stable tag: 1.31
9
 
10
  Создание RSS-ленты для сервиса Яндекс.Турбо.
11
 
50
 
51
  Проверять RSS-ленты надо в Яндекс.Вебмастере, в разделе "Турбо-страницы\Источники". После добавления RSS-ленты Яндекс через пару минут выдаст свой "диагноз".
52
 
53
+ = Нет ни одного элемента item, что делать? =
54
+
55
+ Убедитесь, что вы выбрали хотя бы один тип записей и не перемудрили с настройками исключений. Если проблема не в этом, то откройте RSS-ленту в браузере и визуально убедитесь, что она открывается. Зачастую начинающие вебмастера отключают RSS-ленты (вручную или плагинами типа Clearfy), а потом удивляются тому, что RSS-ленты на сайте не работают.
56
+
57
+ = Cодержимое Турбо-страницы не соответствует оригинальной версии (в содержимом тега <![CDATA[]]> найдены закодированные символы) =
58
+
59
+ Опытным путем установлено, что Яндекс ругается на стрелочки < и > (&amp;lt; и &amp;gt;), причем неважно закодированные они или нет. На вопрос, как это исправить Платоны посоветовали просто "забить". Цитата:
60
+
61
+ "Такие предупреждения носят, в первую очередь, информационный характер. Насколько я вижу, в обоих случаях эти символы отображаются на Турбо-страницах корректно, поэтому подобные предупреждения можно игнорировать, они никак не повлияют на Турбо-версии страниц вашего сайта в выдаче."
62
+
63
  = Яндекс сильно нагружает сервер, что делать? =
64
 
65
  Установите любой из плагинов кэширования. Они все умеют кэшировать RSS-ленты.
432
 
433
  В список можно включать только парные теги (имеющие тег закрытия). Самозакрывающиеся теги фильтром будут проигнорированы.
434
 
435
+ = Как вывести изображение записи, записанное в произвольном поле? =
436
+
437
+ В некоторых темах (особенно старых) изображение записи может храниться в своем собственном произвольном поле. Чтобы вывести его на турбо-страницах надо использовать примерно такой код:
438
+
439
+ `function my_yturbo_thumb_imgurl($imgurl) {
440
+ //вместо 'url-image' подставьте название вашего произвольного
441
+ //поля с ссылкой на изображение
442
+ $imgurl = get_post_meta( get_the_ID(), 'url-image', true);
443
+ return $imgurl;
444
+ }
445
+ add_filter('yturbo_thumb_imgurl', 'my_yturbo_thumb_imgurl');
446
+
447
+ function my_yturbo_thumb_caption($caption) {
448
+ //вместо 'caption-image' подставьте название вашего произвольного
449
+ //поля, где хранится подпись к изображению
450
+ $caption = get_post_meta( get_the_ID(), 'caption-image', true);
451
+ return $caption;
452
+ }
453
+ add_filter('yturbo_thumb_caption', 'my_yturbo_thumb_caption');`
454
+
455
+ Подпись к изображению необязательна и не будет выведена, если ее нет.
456
+
457
+ Важно! Изображение из произвольного поля будет выводиться только, если включен вывод "Миниатюр в RSS" (любого размера, это не важно) и только если не установлено изображение через "родной" функционал WordPress.
458
 
459
  == Screenshots ==
460
 
464
 
465
  == Changelog ==
466
 
467
+ = 1.31 (04.02.2022) =
468
+
469
+ * исправлена ajax-подгрузка терминов таксономий (настройки исключений).
470
+ * в очередной раз переписаны регулярки обработки изображений.
471
+ * исправлена ошибка с выводом блока содержания на php 7.4 и выше.
472
+ * добавлен вывод подписи для главного изображения записи.
473
+ * добавлены фильтры "yturbo_thumb_imgurl" и "yturbo_thumb_caption" для вывода главного изображения записи в случае, если используется собственное произвольное поле для хранения изображения записи, а не "родной" функционал WordPress (читайте FAQ).
474
+ * исправление мелких ошибок.
475
+ * исправлены js-уязвимости на странице настроек плагина.
476
+
477
  = 1.30 (19.04.2021) =
478
 
479
  * исправлена js-уязвимость на странице настроек плагина.
rss-for-yandex-turbo.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: RSS for Yandex Turbo
4
  Plugin URI: https://wordpress.org/plugins/rss-for-yandex-turbo/
5
  Description: Создание RSS-ленты для сервиса Яндекс.Турбо.
6
- Version: 1.30
7
  Author: Flector
8
  Author URI: https://profiles.wordpress.org/flector#content-plugins
9
  Text Domain: rss-for-yandex-turbo
@@ -20,14 +20,14 @@ function yturbo_add_notice_ads() {
20
  ->rawHtml(__('<p>Для плагина <strong>RSS for Yandex Turbo</strong> появилось премиум-дополнение <strong><a target="_blank" href="https://wpcase.ru/wpcase-turbo-ads/">WPCase: Turbo Ads</a></strong>, которое позволит <br />вам добавить на турбо-страницы неограниченное количество рекламных блоков в нужных вам местах.</p>', 'rss-for-yandex-turbo'))
21
  ->show();
22
  }
23
- add_action( 'admin_notices', 'yturbo_add_notice_ads' );
24
  //вывод admin notice с рекламкой (для админов) end
25
 
26
  //проверка версии плагина (запуск функции установки новых опций) begin
27
  function yturbo_check_version() {
28
  $yturbo_options = get_option('yturbo_options');
29
  if (!isset($yturbo_options['version'])){$yturbo_options['version']='1.00';update_option('yturbo_options',$yturbo_options);}
30
- if ( $yturbo_options['version'] != '1.30' ) {
31
  yturbo_set_new_options();
32
  }
33
  }
@@ -184,7 +184,7 @@ function yturbo_set_new_options() {
184
 
185
  if (!isset($yturbo_options['ytextendedhtml'])) {$yturbo_options['ytextendedhtml']='disabled';}
186
 
187
- $yturbo_options['version'] = '1.30';
188
  update_option('yturbo_options', $yturbo_options);
189
  }
190
  //функция установки новых опций при обновлении плагина у пользователей end
@@ -192,7 +192,7 @@ function yturbo_set_new_options() {
192
  //функция установки значений по умолчанию при активации плагина begin
193
  function yturbo_init() {
194
  $yturbo_options = array();
195
- $yturbo_options['version'] = '1.30';
196
  $yturbo_options['ytrssname'] = 'turbo';
197
  $yturbo_options['yttitle'] = esc_html(yturbo_remove_emoji(strip_tags(get_bloginfo_rss('title'))));
198
  $yturbo_options['ytlink'] = get_bloginfo_rss('url');
@@ -432,7 +432,7 @@ if ( ! wp_verify_nonce( $_POST['yturbo_nonce'], plugin_basename(__FILE__) ) || !
432
 
433
  $yturbo_options['yttype'] = '';
434
  $checkboxes = isset($_POST['types']) ? $_POST['types'] : array();
435
- foreach($checkboxes as $value) {$yturbo_options['yttype'] .= $value . ',';}
436
  $yturbo_options['yttype'] = sanitize_text_field($yturbo_options['yttype']);
437
 
438
  $yturbo_options['ytfigcaption'] = sanitize_text_field($_POST['ytfigcaption']);
@@ -545,12 +545,15 @@ if ( ! wp_verify_nonce( $_POST['yturbo_nonce'], plugin_basename(__FILE__) ) || !
545
  $taxonomies = get_taxonomies( array('public'=>true,'show_ui'=>true,), 'objects', 'and' );
546
  foreach ($taxonomies as $taxonomy) {
547
  $temp = $taxonomy->name . ':';
548
- if ( isset($_POST['exclude-'.$taxonomy->name]) ) :
549
  foreach ( $_POST['exclude-'.$taxonomy->name] as $exclude ) {
550
- if( ! next( $_POST['exclude-'.$taxonomy->name] ) ) {
551
- $temp .= $exclude;
552
- } else {
553
- $temp .= $exclude . ',';
 
 
 
554
  }
555
  }
556
  $yturbo_options['exclude-'.$taxonomy->name] = $temp;
@@ -601,9 +604,10 @@ if ( ! wp_verify_nonce( $_POST['yturbo_nonce'], plugin_basename(__FILE__) ) || !
601
  $yturbo_options['ytfeedbacktelegram'] = sanitize_text_field($_POST['ytfeedbacktelegram']);
602
 
603
  if(isset($_POST['ytexcludeshortcodes'])){$yturbo_options['ytexcludeshortcodes'] = sanitize_text_field($_POST['ytexcludeshortcodes']);}else{$yturbo_options['ytexcludeshortcodes'] = 'disabled';}
 
604
  $yturbo_options['ytexcludeshortcodeslist'] = '';
605
  $checkboxes = isset($_POST['shortcodes']) ? $_POST['shortcodes'] : array();
606
- foreach($checkboxes as $value) {$yturbo_options['ytexcludeshortcodeslist'] .= $value . ',';}
607
 
608
  $types = explode(",", $yturbo_options['yttype']);
609
  $types = array_diff($types, array(''));
@@ -628,7 +632,7 @@ if ( ! wp_verify_nonce( $_POST['yturbo_nonce'], plugin_basename(__FILE__) ) || !
628
  if(isset($_POST['yttoc'])){$yturbo_options['yttoc'] = sanitize_text_field($_POST['yttoc']);}else{$yturbo_options['yttoc'] = 'disabled';}
629
  $yturbo_options['yttype2'] = '';
630
  $checkboxes = isset($_POST['types2']) ? $_POST['types2'] : array();
631
- foreach($checkboxes as $value) {$yturbo_options['yttype2'] .= $value . ',';}
632
  $yturbo_options['yttype2'] = sanitize_text_field($yturbo_options['yttype2']);
633
  $yturbo_options['yttoczag'] = sanitize_text_field($_POST['yttoczag']);
634
  $yturbo_options['yttocmesto'] = sanitize_text_field($_POST['yttocmesto']);
@@ -709,7 +713,7 @@ if (closedonat == 'yes') {
709
 
710
  <div class="xyztabs">
711
 
712
- <input style="left:-2000px;position: absolute;" type="text" name="yttab" id="yttab" size="30" value="<?php echo stripslashes($yturbo_options['yttab']); ?>" />
713
  <ul class="xyztabs__caption">
714
  <li <?php if($yturbo_options['yttab']=='RSS-лента'){echo 'class="active"';} ?>><?php _e('RSS-лента', 'rss-for-yandex-turbo'); ?></li>
715
  <li <?php if($yturbo_options['yttab']=='Оформление'){echo 'class="active"';} ?>><?php _e('Оформление', 'rss-for-yandex-turbo'); ?></li>
@@ -744,7 +748,7 @@ if (closedonat == 'yes') {
744
  <tr class="trbordertop">
745
  <th><?php _e('Заголовок:', 'rss-for-yandex-turbo'); ?></th>
746
  <td>
747
- <input type="text" name="yttitle" size="40" value="<?php echo stripslashes($yturbo_options['yttitle']); ?>" />
748
  <br /><small><?php _e('Название RSS-ленты. Если экспортируется содержимое всего сайта, укажите название сайта.', 'rss-for-yandex-turbo'); ?><br />
749
  <?php _e('Если экспортируется раздел сайта, укажите только название раздела.', 'rss-for-yandex-turbo'); ?><br />
750
  </small>
@@ -753,14 +757,14 @@ if (closedonat == 'yes') {
753
  <tr>
754
  <th><?php _e('Ссылка:', 'rss-for-yandex-turbo'); ?></th>
755
  <td>
756
- <input type="text" name="ytlink" size="40" value="<?php echo stripslashes($yturbo_options['ytlink']); ?>" />
757
  <br /><small><?php _e('URL сайта, данные которого экспортируются в RSS-ленту.', 'rss-for-yandex-turbo'); ?> </small>
758
  </td>
759
  </tr>
760
  <tr>
761
  <th><?php _e('Описание:', 'rss-for-yandex-turbo'); ?></th>
762
  <td>
763
- <input type="text" name="ytdescription" size="40" value="<?php echo stripslashes($yturbo_options['ytdescription']); ?>" />
764
  <br /><small><?php _e('Описание RSS-ленты одним предложением. Не используйте HTML-разметку.', 'rss-for-yandex-turbo'); ?> </small>
765
  </td>
766
  </tr>
@@ -1133,8 +1137,8 @@ if (closedonat == 'yes') {
1133
  <tr class="ytsharechildtr" <?php if ($yturbo_options['ytshare'] == 'disabled') echo 'style="display:none;"'; ?>>
1134
  <th><?php _e('Порядок:', 'rss-for-yandex-turbo'); ?></th>
1135
  <td>
1136
- <input style="" type="text" name="ytnetw" id="ytnetw" size="62" value="<?php echo $yturbo_options['ytnetw']; ?>" disabled="disabled" />
1137
- <input type="text" style="display:none;" name="ytnetwspan" id="ytnetwspan" value="<?php echo $yturbo_options['ytnetw']; ?>"/>
1138
  <br /><small style=""><?php _e('Для сортировки иконок сначала снимите все чекбоксы, а потом снова их выберите в нужном вам порядке.', 'rss-for-yandex-turbo'); ?></small>
1139
  </td>
1140
  </tr>
@@ -1247,8 +1251,8 @@ if (closedonat == 'yes') {
1247
  <tr class="ytfeedbackchildtr" <?php if ($yturbo_options['ytfeedback'] == 'disabled') echo 'style="display:none;"'; ?>>
1248
  <th><?php _e('Порядок кнопок:', 'rss-for-yandex-turbo'); ?></th>
1249
  <td>
1250
- <input style="" type="text" name="ytfeedbacknetw" id="ytfeedbacknetw" size="62" value="<?php echo $yturbo_options['ytfeedbacknetw']; ?>" disabled="disabled" />
1251
- <input type="text" style="display:none;" name="ytfeedbacknetwspan" id="ytfeedbacknetwspan" value="<?php echo $yturbo_options['ytfeedbacknetw']; ?>"/>
1252
  <br /><small style=""><?php _e('Для сортировки иконок сначала снимите все чекбоксы, а потом снова их выберите в нужном вам порядке.', 'rss-for-yandex-turbo'); ?></small>
1253
  </td>
1254
  </tr>
@@ -1319,7 +1323,7 @@ if (closedonat == 'yes') {
1319
  <tr class="ytfeedbackmailtr" style="display:none;">
1320
  <th><?php _e('E-mail:', 'rss-for-yandex-turbo'); ?></th>
1321
  <td>
1322
- <input type="text" name="ytfeedbackmail" size="40" value="<?php echo esc_attr(stripslashes($yturbo_options['ytfeedbackmail'])) ?>" />
1323
  <br /><small><?php _e('Укажите адрес e-mail (пример: <tt>mail@test.ru</tt>).', 'rss-for-yandex-turbo'); ?></small>
1324
  </td>
1325
  </tr>
@@ -1509,8 +1513,8 @@ if (closedonat == 'yes') {
1509
  <tr class="ytratingchildtr" <?php if ($yturbo_options['ytrating'] == 'disabled') echo 'style="display:none;"'; ?>>
1510
  <th><?php _e('Диапазон оценок:', 'rss-for-yandex-turbo'); ?></th>
1511
  <td>
1512
- <?php _e('От:', 'rss-for-yandex-turbo'); ?> <input style="max-width: 60px;margin-right:10px;" name="ytratingmin" type="number" min="1" max="5" step="0.01" value="<?php echo $yturbo_options['ytratingmin']; ?>" />
1513
- <?php _e('До:', 'rss-for-yandex-turbo'); ?> <input style="max-width: 60px;" name="ytratingmax" type="number" min="1" max="5" step="0.01" value="<?php echo $yturbo_options['ytratingmax']; ?>" />
1514
  <br /><small><?php _e('Укажите минимальную и максимальную оценку.', 'rss-for-yandex-turbo'); ?><br />
1515
  <?php _e('Каждой записи будет присвоена случайная оценка в указанном диапазоне.', 'rss-for-yandex-turbo'); ?><br />
1516
  <?php _e('Этот рейтинг будет выведен сразу после заголовка с миниатюрой записи.', 'rss-for-yandex-turbo'); ?><br />
@@ -1887,7 +1891,7 @@ if (closedonat == 'yes') {
1887
  if ( $exclude_term_ids ) {
1888
  $terms = get_terms( $taxonomy->name, array('include'=>$exclude_term_ids,'hide_empty'=>false,'hierarchical'=>false) );
1889
  foreach ( $terms as $term ) {
1890
- echo "<li><input type='checkbox' name='exclude-{$taxonomy->name}[{$term->term_taxonomy_id}]' id='exclude_{$term->term_taxonomy_id}' value='{$term->term_taxonomy_id}' checked='checked' /> <label for='exclude_{$term->term_taxonomy_id}'>" . esc_html($term->name) . "</label></li> ";
1891
  }
1892
  }
1893
  ?>
@@ -2076,9 +2080,9 @@ if (closedonat == 'yes') {
2076
  <tr class="ytexcludetagslisttr" <?php if ($yturbo_options['ytexcludetags'] == 'disabled') echo 'style="display:none;"'; ?>>
2077
  <th style="padding-top: 5px;"><?php _e('Теги для удаления:', 'rss-for-yandex-turbo'); ?></th>
2078
  <td style="padding-top: 5px;">
2079
- <input style="display:none;" name="ytexcludetagslist-input" class="ytexcludetagslist-input" placeholder="" value="<?php echo stripslashes($yturbo_options['ytexcludetagslist']); ?>" />
2080
  <input type="hidden" id="tags-list" value="<?php echo yturbo_tags_list(); ?>" />
2081
- <input type="hidden" name="ytexcludetagslist" id="ytexcludetagslist" value="<?php echo stripslashes($yturbo_options['ytexcludetagslist']); ?>" />
2082
  <small><?php _e('Список удаляемых html-тегов. Начните набирать нужный тег для подсказки.', 'rss-for-yandex-turbo'); ?><br />
2083
  <?php _e('Самозакрывающиеся теги вроде <tt>&lt;br /></tt> этим фильтром удалить нельзя.', 'rss-for-yandex-turbo'); ?><br />
2084
  <?php _e('Список возможных для удаления тегов можно <a target="_blank" href="https://ru.wordpress.org/plugins/rss-for-yandex-turbo/#%D0%BA%D0%B0%D0%BA%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D1%82%D0%B5%D0%B3%D0%BE%D0%B2%20%D0%B4%D0%BB%D1%8F%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%3F">переопределить</a>.', 'rss-for-yandex-turbo'); ?><br />
@@ -2095,9 +2099,9 @@ if (closedonat == 'yes') {
2095
  <tr class="ytexcludetagslist2tr" <?php if ($yturbo_options['ytexcludetags2'] == 'disabled') echo 'style="display:none;"'; ?>>
2096
  <th style="padding-top: 5px;"><?php _e('Теги для удаления:', 'rss-for-yandex-turbo'); ?></th>
2097
  <td style="padding-top: 5px;">
2098
- <input style="display:none;" name="ytexcludetagslist-input2" class="ytexcludetagslist-input2" placeholder="" value="<?php echo stripslashes($yturbo_options['ytexcludetagslist2']); ?>" />
2099
  <input type="hidden" id="tags-list2" value="<?php echo yturbo_tags_list(); ?>" />
2100
- <input type="hidden" name="ytexcludetagslist2" id="ytexcludetagslist2" value="<?php echo stripslashes($yturbo_options['ytexcludetagslist2']); ?>" />
2101
  <small><?php _e('Список удаляемых html-тегов. Начните набирать нужный тег для подсказки.', 'rss-for-yandex-turbo'); ?><br />
2102
  <?php _e('Самозакрывающиеся теги вроде <tt>&lt;br /></tt> этим фильтром удалить нельзя.', 'rss-for-yandex-turbo'); ?> <br />
2103
  <?php _e('Список возможных для удаления тегов можно <a target="_blank" href="https://ru.wordpress.org/plugins/rss-for-yandex-turbo/#%D0%BA%D0%B0%D0%BA%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D1%82%D0%B5%D0%B3%D0%BE%D0%B2%20%D0%B4%D0%BB%D1%8F%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%3F">переопределить</a>.', 'rss-for-yandex-turbo'); ?><br />
@@ -2291,7 +2295,7 @@ function yturbo_save_metabox( $post_id ) {
2291
  }
2292
 
2293
  if(isset($_POST['ytextendedhtmlmeta'])){
2294
- $selected = $_POST['ytextendedhtmlmeta'];
2295
  update_post_meta($post_id, 'ytextendedhtmlmeta', $selected);
2296
  }
2297
  }
@@ -2625,7 +2629,7 @@ if ( isset($_GET['lenta']) && $_GET['lenta'] == 'trash' ) {
2625
  }
2626
 
2627
  //если в настройках не выбраны типы записей, то отключаем дефолтный post_type равный 'post'
2628
- if($yttype[0]==''){$yttype[0]='trulala';}
2629
 
2630
  $args = array(
2631
  'paged' => $paged,
@@ -2653,9 +2657,9 @@ echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'.PHP_EO
2653
  version="2.0">
2654
  <channel>
2655
  <turbo:cms_plugin>C125AEEC6018B4A0EF9BF40E6615DD17</turbo:cms_plugin>
2656
- <title><?php echo stripslashes($yttitle); ?></title>
2657
  <link><?php echo esc_html($ytlink); ?></link>
2658
- <description><?php echo stripslashes($ytdescription); ?></description>
2659
  <?php if ($ytmetrika) { ?><turbo:analytics id="<?php echo $ytmetrika; ?>" type="Yandex"></turbo:analytics><?php echo PHP_EOL; ?><?php } ?>
2660
  <?php if ($ytliveinternet) { ?><turbo:analytics type="LiveInternet"></turbo:analytics><?php echo PHP_EOL; ?><?php } ?>
2661
  <?php if ($ytgoogle) { ?><turbo:analytics id="<?php echo $ytgoogle; ?>" type="Google"></turbo:analytics><?php echo PHP_EOL; ?><?php } ?>
@@ -2730,75 +2734,84 @@ echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'.PHP_EO
2730
  //удаляем unicode-символы (как невалидные в rss)
2731
  $content = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $content);
2732
 
 
 
 
 
 
 
 
 
 
2733
  //удаляем разметку движка при использовании шорткода с подписью [caption] (в html4 темах - classic editor)
2734
- $pattern = "/<div id=\"attachment(.*?)>(.*?)<img (.*?) \/>(.*?)<\/p>\n<p id=\"caption-attachment(.*?)\">(.*?)<\/p>\n<\/div>/i";
2735
- $replacement = '<img data-caption="$6" $3 />';
2736
  $content = preg_replace($pattern, $replacement, $content);
2737
  //разметка описания на случай, если тег div удаляется в настройках плагина
2738
- $pattern = "/<p><img(.*?) \/><\/p>\n<p id=\"caption-attachment(.*?)\">(.*?)<\/p>/i";
2739
- $replacement = '<img data-caption="$3"$1 />';
2740
  $content = preg_replace($pattern, $replacement, $content);
2741
 
2742
  //удаляем разметку движка при использовании шорткода с подписью [caption] (в html5 темах - classic editor)
2743
- $pattern = "/<figure id=\"attachment(.*?)\"(.*?)>(.*?)<img (.*?) \/>(.*?)<figcaption id=\"caption-attachment(.*?)\">(.*?)<\/figcaption><\/figure>/i";
2744
- $replacement = '<img data-caption="$7" $4 />';
2745
  $content = preg_replace($pattern, $replacement, $content);
2746
 
2747
  //удаляем <figure>, если они изначально присутствуют в контенте записи (с указанным caption - gutenberg)
2748
- $pattern = "/<figure(.*?)>(.*?)<img src=\"(.*?)\" \/>(.*?)<figcaption>(.*?)<\/figcaption><\/figure>/i";
2749
- $replacement = '<img data-caption="$5" src="$3" />';
2750
  $content = preg_replace($pattern, $replacement, $content);
2751
 
2752
  //удаляем <figure>, если они изначально присутствуют в контенте записи (без caption - gutenberg)
2753
  $pattern = "/<figure(.*?)>(.*?)<img(.*?)>(.*?)<\/figure>/i";
2754
- $replacement = '<img$3>';
2755
  $content = preg_replace($pattern, $replacement, $content);
2756
 
2757
- //удаляем <figure> вокруг всех элементов (яндекс такое не понимает)
2758
  $pattern = "/<figure(.*?)>/i";
2759
  $replacement = '';
2760
  $content = preg_replace($pattern, $replacement, $content);
2761
  $pattern = "/<\/figure>/i";
2762
  $replacement = '';
2763
  $content = preg_replace($pattern, $replacement, $content);
2764
- $pattern = "/<figcaption>(.*?)<\/figcaption>/i";
2765
  $replacement = '';
2766
  $content = preg_replace($pattern, $replacement, $content);
2767
 
2768
- //преобразуем iframe с видео
2769
- $pattern = "/<iframe title=\"(.*?)\"(.*?) allow=\"(.*?)\"(.*?)><\/iframe>/i";
2770
- $replacement = '<iframe$2 allowfullscreen="true"></iframe>';
2771
  $content = preg_replace($pattern, $replacement, $content);
2772
 
2773
- //удаляем <p> у отдельно стоящих изображений
2774
- $pattern = "/<p><img(.*?)><\/p>/i";
2775
- $replacement = '<img$1>';
2776
  $content = preg_replace($pattern, $replacement, $content);
2777
 
2778
- //добавляем data-caption если его вообще нет в теге img
2779
- $pattern = "/<img(?!([^>]*\b)data-caption=)([^>]*?)>/i";
2780
- $replacement = '<img data-caption=""$1$2>';
2781
- $content = preg_replace( $pattern, $replacement, $content );
2782
 
2783
- //обрабатываем img теги и оборачиваем их тегами figure
2784
- if ($ytfigcaption == 'Использовать подписи') {
2785
- //если описания нет
2786
- $pattern = "/<img data-caption=\"\" src=\"(.*?)\" \/>/i";
2787
- $replacement = '<figure><img src="$1" /></figure>';
2788
- $content = preg_replace($pattern, $replacement, $content);
2789
- //если описание есть
2790
- $pattern = "/<img data-caption=\"(.*?)\" src=\"(.*?)\" \/>/i";
2791
- $replacement = '<figure><img src="$2" /><figcaption>$1</figcaption></figure>';
2792
- $content = preg_replace($pattern, $replacement, $content);
2793
- }
2794
  if ($ytfigcaption == 'Отключить описания') {
2795
- $pattern = "/<img data-caption=\"(.*?)\" src=\"(.*?)\" \/>/i";
2796
- $replacement = '<figure><img src="$2" /></figure>';
2797
  $content = preg_replace($pattern, $replacement, $content);
2798
  }
2799
 
 
 
 
 
 
 
2800
  $purl = plugins_url('', __FILE__);
2801
 
 
 
 
 
 
2802
  //формируем video для mp4 файлов согласно документации яндекса (гутенберг)
2803
  $pattern = "/<video(.*?)src=\"(.*?).mp4\"><\/video>/i";
2804
  $replacement = '<figure><video><source src="$2.mp4" type="video/mp4" /></video><img src="'.$purl.'/img/video.png'.'" /></figure>';
@@ -2806,6 +2819,7 @@ echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'.PHP_EO
2806
 
2807
  //формируем video для mp4 файлов согласно документации яндекса (классический редактор)
2808
  $content = str_replace('<!--[if lt IE 9]><script>document.createElement(\'video\');</script><![endif]-->', '', $content);
 
2809
  $pattern = "/<video class=\"wp-video-shortcode\"(.*?)><source(.*?)src=\"(.*?).mp4(.*?)\"(.*?)\/>(.*?)<\/video>/i";
2810
  $replacement = '<figure><video><source src="$3.mp4" type="video/mp4" /></video><img src="'.$purl.'/img/video.png'.'" /></figure>';
2811
  $content = preg_replace($pattern, $replacement, $content);
@@ -2822,7 +2836,7 @@ echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'.PHP_EO
2822
  $content = preg_replace($pattern, $replacement, $content);
2823
 
2824
  //удаляем картинки из контента, если их больше 50 уникальных (ограничение яндекс.турбо)
2825
- if (preg_match_all("/<figure><img(.*?)>(.*?)<\/figure>/i", $content, $res)) {
2826
  $i = 0;
2827
  if ($ytrelated=='enabled' && $ytrelatednumber && $ytrelatedinfinity != 'enabled') $i = $ytrelatednumber;
2828
  if ($ytthumbnail=='enabled' && has_post_thumbnail(get_the_ID())) $i++;
@@ -2856,11 +2870,34 @@ echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'.PHP_EO
2856
  $content = apply_filters( 'yturbo_add_contents', $content );
2857
  ?>
2858
  <header>
2859
- <?php if ( $ytthumbnail=='enabled' && has_post_thumbnail(get_the_ID()) ) {
2860
- echo '<figure><img src="'. strtok(get_the_post_thumbnail_url(get_the_ID(),$ytselectthumb), '?') .'" /></figure>'.PHP_EOL; ?>
2861
- <?php } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2862
  <h1><?php echo get_the_title_rss(); ?></h1>
2863
- <?php if ($ytselectmenu!='Не использовать') {
2864
  echo '<menu>'.PHP_EOL;
2865
  $menu = wp_get_nav_menu_object( $ytselectmenu );
2866
  $menu_items = wp_get_nav_menu_items($menu->term_id);
@@ -3190,7 +3227,7 @@ echo '</ul>';
3190
  }
3191
  else :
3192
 
3193
- if($yttype[0]==''){$yttype[0]='trulala';}//если в настройках не выбраны типы записей, то отключаем дефолтный post_type равный 'post'
3194
  $args = array('ignore_sticky_posts' => 1, 'post_type' => $yttype, 'post_status' => 'publish', 'posts_per_page' => $ytnumber,'tax_query' => $tax_query,
3195
  'meta_query' => array('relation' => 'OR', array('key' => 'ytrssenabled_meta_value', 'compare' => 'NOT EXISTS',),
3196
  array('key' => 'ytrssenabled_meta_value', 'value' => 'yes', 'compare' => '!=',),));
@@ -3309,6 +3346,7 @@ function yturbo_strip_attributes( $s, $allowedattr = array() ) {
3309
  $rpl = str_replace($r[1], $attrs, $tag);
3310
  //заменяем одинарные кавычки на двойные
3311
  $rpl = str_replace("'", "\"", $rpl);
 
3312
  //добавляем закрывающий символ / если он отсутствует
3313
  $rpl = str_replace("\">", "\" />", $rpl);
3314
  //добавляем пробел перед закрывающим символом /
@@ -3413,21 +3451,32 @@ function yturbo_gallery( $output, $attr ) {
3413
  //функция преобразования стандартных галерей движка в турбо-галереи в гутенберге begin
3414
  function yturbo_do_gallery( $content ) {
3415
 
3416
- //удаляем ul разметку галерей в гутенберге (wordpress 5.3+)
3417
- $pattern = "/<ul class=\"blocks-gallery-grid(.*?)>(.*?)<\/ul>/s";
3418
  $replacement = '<div data-block="gallery">$2</div>';
3419
  $content = preg_replace($pattern, $replacement, $content);
3420
 
3421
- //удаляем ul разметку галерей в гутенберге (wordpress 5.2+)
3422
- $pattern = "/<ul class=\"wp-block-gallery(.*?)>(.*?)<\/ul>/s";
3423
  $replacement = '<div data-block="gallery">$2</div>';
3424
  $content = preg_replace($pattern, $replacement, $content);
3425
 
3426
  //удаляем li разметку галерей в гутенберге
3427
- $pattern = "/<li class=\"blocks-gallery-item\">\n<figure><img src=\"(.*?)\" \/>(.*?)<\/figure>\n<\/li>/i";
3428
- $replacement = '<img src="$1"/>';
 
 
 
 
3429
  $content = preg_replace($pattern, $replacement, $content);
3430
 
 
 
 
 
 
 
 
3431
  return $content;
3432
  }
3433
  //функция преобразования стандартных галерей движка в турбо-галереи в гутенберге end
@@ -3581,7 +3630,7 @@ function yturbo_widget_feedback() {
3581
  if ($yturbo_options['ytfeedbackcallback']) {
3582
  $content .= '<div data-type="callback" data-send-to="'.$yturbo_options['ytfeedbackcallback'].'"';
3583
  if ($yturbo_options['ytfeedbackcallback2'] && $yturbo_options['ytfeedbackcallback3']) {
3584
- $content .= ' data-agreement-company="'.stripslashes($yturbo_options['ytfeedbackcallback2']).'" data-agreement-link="'.$yturbo_options['ytfeedbackcallback3'].'"';
3585
  }
3586
  }
3587
  $content .= '></div>'.PHP_EOL;
@@ -3761,7 +3810,7 @@ function yturbo_toc( $content ) {
3761
  'to_menu' => false,
3762
  'title' => $yturbo_options['yttoczag'],
3763
  'min_found' => $yturbo_options['yttocnumber'],
3764
- 'min_length' => 100,
3765
  'page_url' => get_the_permalink(),
3766
  'selectors' => $selectors,
3767
  );
@@ -4011,6 +4060,7 @@ function yturbo_hide_custom_fields( $protected, $meta_key ){
4011
  'ytrssenabled_meta_value',
4012
  'template_meta',
4013
  'custom_template',
 
4014
  );
4015
  if ( in_array($meta_key, $hide_meta_keys) ) {
4016
  return true;
@@ -4046,8 +4096,8 @@ echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'.PHP_EO
4046
  <turbo:cms_plugin>C125AEEC6018B4A0EF9BF40E6615DD17</turbo:cms_plugin>
4047
  <title><?php echo stripslashes($yturbo_options['yttitle']); ?></title>
4048
  <link><?php echo esc_html($yturbo_options['ytlink']); ?></link>
4049
- <description><?php echo stripslashes($yturbo_options['ytdescription']); ?></description>
4050
- <language><?php echo $yturbo_options['ytlanguage']; ?></language>
4051
  <generator>RSS for Yandex Turbo v<?php echo $yturbo_options['version']; ?> (https://wordpress.org/plugins/rss-for-yandex-turbo/)</generator>
4052
  <?php if ( $yturbo_options['ytexcludeurlslist'] ) {
4053
  $textAr = explode("\n", str_replace(array("\r\n", "\r"), "\n", $yturbo_options['ytexcludeurlslist']));
@@ -4139,7 +4189,7 @@ function yturbo_ajax_display_exclude_terms() {
4139
  if ( ! isset($_REQUEST['taxonomy']) )
4140
  return;
4141
 
4142
- $taxonomy = (string) $_REQUEST['taxonomy'];
4143
 
4144
  header("HTTP/1.1 200");
4145
  header("Content-Type: text/html; charset=UTF-8");
@@ -4160,7 +4210,7 @@ function yturbo_ajax_display_exclude_terms() {
4160
  'hide_empty' => false,
4161
  'hierarchical' => false,
4162
  'number' => 100,
4163
- 'offset' => $_REQUEST['offset']
4164
  ));
4165
 
4166
  if ( ! $terms ) {
@@ -4169,7 +4219,7 @@ function yturbo_ajax_display_exclude_terms() {
4169
  }
4170
 
4171
  foreach ($terms as $term) {
4172
- echo "<li><input type='checkbox' name='exclude-{$taxonomy}[{$term->term_taxonomy_id}]' id='exclude_{$term->term_taxonomy_id}' value='{$term->term_taxonomy_id}' /> <label for='exclude_{$term->term_taxonomy_id}'>" . esc_html($term->name) . "</label></li>";
4173
  }
4174
  exit;
4175
  }
3
  Plugin Name: RSS for Yandex Turbo
4
  Plugin URI: https://wordpress.org/plugins/rss-for-yandex-turbo/
5
  Description: Создание RSS-ленты для сервиса Яндекс.Турбо.
6
+ Version: 1.31
7
  Author: Flector
8
  Author URI: https://profiles.wordpress.org/flector#content-plugins
9
  Text Domain: rss-for-yandex-turbo
20
  ->rawHtml(__('<p>Для плагина <strong>RSS for Yandex Turbo</strong> появилось премиум-дополнение <strong><a target="_blank" href="https://wpcase.ru/wpcase-turbo-ads/">WPCase: Turbo Ads</a></strong>, которое позволит <br />вам добавить на турбо-страницы неограниченное количество рекламных блоков в нужных вам местах.</p>', 'rss-for-yandex-turbo'))
21
  ->show();
22
  }
23
+ //add_action( 'admin_notices', 'yturbo_add_notice_ads' );
24
  //вывод admin notice с рекламкой (для админов) end
25
 
26
  //проверка версии плагина (запуск функции установки новых опций) begin
27
  function yturbo_check_version() {
28
  $yturbo_options = get_option('yturbo_options');
29
  if (!isset($yturbo_options['version'])){$yturbo_options['version']='1.00';update_option('yturbo_options',$yturbo_options);}
30
+ if ( $yturbo_options['version'] != '1.31' ) {
31
  yturbo_set_new_options();
32
  }
33
  }
184
 
185
  if (!isset($yturbo_options['ytextendedhtml'])) {$yturbo_options['ytextendedhtml']='disabled';}
186
 
187
+ $yturbo_options['version'] = '1.31';
188
  update_option('yturbo_options', $yturbo_options);
189
  }
190
  //функция установки новых опций при обновлении плагина у пользователей end
192
  //функция установки значений по умолчанию при активации плагина begin
193
  function yturbo_init() {
194
  $yturbo_options = array();
195
+ $yturbo_options['version'] = '1.31';
196
  $yturbo_options['ytrssname'] = 'turbo';
197
  $yturbo_options['yttitle'] = esc_html(yturbo_remove_emoji(strip_tags(get_bloginfo_rss('title'))));
198
  $yturbo_options['ytlink'] = get_bloginfo_rss('url');
432
 
433
  $yturbo_options['yttype'] = '';
434
  $checkboxes = isset($_POST['types']) ? $_POST['types'] : array();
435
+ foreach($checkboxes as $value) {$yturbo_options['yttype'] .= sanitize_text_field($value) . ',';}
436
  $yturbo_options['yttype'] = sanitize_text_field($yturbo_options['yttype']);
437
 
438
  $yturbo_options['ytfigcaption'] = sanitize_text_field($_POST['ytfigcaption']);
545
  $taxonomies = get_taxonomies( array('public'=>true,'show_ui'=>true,), 'objects', 'and' );
546
  foreach ($taxonomies as $taxonomy) {
547
  $temp = $taxonomy->name . ':';
548
+ if ( isset($_POST['exclude-'.$taxonomy->name])) :
549
  foreach ( $_POST['exclude-'.$taxonomy->name] as $exclude ) {
550
+ $exclude = sanitize_text_field($exclude);
551
+ if ( is_numeric($exclude) ) {
552
+ if( ! next( $_POST['exclude-'.$taxonomy->name] ) ) {
553
+ $temp .= $exclude;
554
+ } else {
555
+ $temp .= $exclude . ',';
556
+ }
557
  }
558
  }
559
  $yturbo_options['exclude-'.$taxonomy->name] = $temp;
604
  $yturbo_options['ytfeedbacktelegram'] = sanitize_text_field($_POST['ytfeedbacktelegram']);
605
 
606
  if(isset($_POST['ytexcludeshortcodes'])){$yturbo_options['ytexcludeshortcodes'] = sanitize_text_field($_POST['ytexcludeshortcodes']);}else{$yturbo_options['ytexcludeshortcodes'] = 'disabled';}
607
+
608
  $yturbo_options['ytexcludeshortcodeslist'] = '';
609
  $checkboxes = isset($_POST['shortcodes']) ? $_POST['shortcodes'] : array();
610
+ foreach ( $checkboxes as $value ) {$yturbo_options['ytexcludeshortcodeslist'] .= sanitize_text_field($value) . ',';}
611
 
612
  $types = explode(",", $yturbo_options['yttype']);
613
  $types = array_diff($types, array(''));
632
  if(isset($_POST['yttoc'])){$yturbo_options['yttoc'] = sanitize_text_field($_POST['yttoc']);}else{$yturbo_options['yttoc'] = 'disabled';}
633
  $yturbo_options['yttype2'] = '';
634
  $checkboxes = isset($_POST['types2']) ? $_POST['types2'] : array();
635
+ foreach ($checkboxes as $value) {$yturbo_options['yttype2'] .= sanitize_text_field($value) . ',';}
636
  $yturbo_options['yttype2'] = sanitize_text_field($yturbo_options['yttype2']);
637
  $yturbo_options['yttoczag'] = sanitize_text_field($_POST['yttoczag']);
638
  $yturbo_options['yttocmesto'] = sanitize_text_field($_POST['yttocmesto']);
713
 
714
  <div class="xyztabs">
715
 
716
+ <input style="left:-2000px;position: absolute;" type="text" name="yttab" id="yttab" size="30" value="<?php echo esc_attr(stripslashes($yturbo_options['yttab'])); ?>" />
717
  <ul class="xyztabs__caption">
718
  <li <?php if($yturbo_options['yttab']=='RSS-лента'){echo 'class="active"';} ?>><?php _e('RSS-лента', 'rss-for-yandex-turbo'); ?></li>
719
  <li <?php if($yturbo_options['yttab']=='Оформление'){echo 'class="active"';} ?>><?php _e('Оформление', 'rss-for-yandex-turbo'); ?></li>
748
  <tr class="trbordertop">
749
  <th><?php _e('Заголовок:', 'rss-for-yandex-turbo'); ?></th>
750
  <td>
751
+ <input type="text" name="yttitle" size="40" value="<?php echo esc_attr(stripslashes($yturbo_options['yttitle'])); ?>" />
752
  <br /><small><?php _e('Название RSS-ленты. Если экспортируется содержимое всего сайта, укажите название сайта.', 'rss-for-yandex-turbo'); ?><br />
753
  <?php _e('Если экспортируется раздел сайта, укажите только название раздела.', 'rss-for-yandex-turbo'); ?><br />
754
  </small>
757
  <tr>
758
  <th><?php _e('Ссылка:', 'rss-for-yandex-turbo'); ?></th>
759
  <td>
760
+ <input type="text" name="ytlink" size="40" value="<?php echo esc_attr(stripslashes($yturbo_options['ytlink'])); ?>" />
761
  <br /><small><?php _e('URL сайта, данные которого экспортируются в RSS-ленту.', 'rss-for-yandex-turbo'); ?> </small>
762
  </td>
763
  </tr>
764
  <tr>
765
  <th><?php _e('Описание:', 'rss-for-yandex-turbo'); ?></th>
766
  <td>
767
+ <input type="text" name="ytdescription" size="40" value="<?php echo esc_attr(stripslashes($yturbo_options['ytdescription'])); ?>" />
768
  <br /><small><?php _e('Описание RSS-ленты одним предложением. Не используйте HTML-разметку.', 'rss-for-yandex-turbo'); ?> </small>
769
  </td>
770
  </tr>
1137
  <tr class="ytsharechildtr" <?php if ($yturbo_options['ytshare'] == 'disabled') echo 'style="display:none;"'; ?>>
1138
  <th><?php _e('Порядок:', 'rss-for-yandex-turbo'); ?></th>
1139
  <td>
1140
+ <input style="" type="text" name="ytnetw" id="ytnetw" size="62" value="<?php echo esc_attr($yturbo_options['ytnetw']); ?>" disabled="disabled" />
1141
+ <input type="text" style="display:none;" name="ytnetwspan" id="ytnetwspan" value="<?php echo esc_attr($yturbo_options['ytnetw']); ?>"/>
1142
  <br /><small style=""><?php _e('Для сортировки иконок сначала снимите все чекбоксы, а потом снова их выберите в нужном вам порядке.', 'rss-for-yandex-turbo'); ?></small>
1143
  </td>
1144
  </tr>
1251
  <tr class="ytfeedbackchildtr" <?php if ($yturbo_options['ytfeedback'] == 'disabled') echo 'style="display:none;"'; ?>>
1252
  <th><?php _e('Порядок кнопок:', 'rss-for-yandex-turbo'); ?></th>
1253
  <td>
1254
+ <input style="" type="text" name="ytfeedbacknetw" id="ytfeedbacknetw" size="62" value="<?php echo esc_attr($yturbo_options['ytfeedbacknetw']); ?>" disabled="disabled" />
1255
+ <input type="text" style="display:none;" name="ytfeedbacknetwspan" id="ytfeedbacknetwspan" value="<?php echo esc_attr($yturbo_options['ytfeedbacknetw']); ?>"/>
1256
  <br /><small style=""><?php _e('Для сортировки иконок сначала снимите все чекбоксы, а потом снова их выберите в нужном вам порядке.', 'rss-for-yandex-turbo'); ?></small>
1257
  </td>
1258
  </tr>
1323
  <tr class="ytfeedbackmailtr" style="display:none;">
1324
  <th><?php _e('E-mail:', 'rss-for-yandex-turbo'); ?></th>
1325
  <td>
1326
+ <input type="text" name="ytfeedbackmail" size="40" value="<?php echo esc_attr(stripslashes($yturbo_options['ytfeedbackmail'])); ?>" />
1327
  <br /><small><?php _e('Укажите адрес e-mail (пример: <tt>mail@test.ru</tt>).', 'rss-for-yandex-turbo'); ?></small>
1328
  </td>
1329
  </tr>
1513
  <tr class="ytratingchildtr" <?php if ($yturbo_options['ytrating'] == 'disabled') echo 'style="display:none;"'; ?>>
1514
  <th><?php _e('Диапазон оценок:', 'rss-for-yandex-turbo'); ?></th>
1515
  <td>
1516
+ <?php _e('От:', 'rss-for-yandex-turbo'); ?> <input style="max-width: 60px;margin-right:10px;" name="ytratingmin" type="number" min="1" max="5" step="0.01" value="<?php echo esc_attr($yturbo_options['ytratingmin']); ?>" />
1517
+ <?php _e('До:', 'rss-for-yandex-turbo'); ?> <input style="max-width: 60px;" name="ytratingmax" type="number" min="1" max="5" step="0.01" value="<?php echo esc_attr($yturbo_options['ytratingmax']); ?>" />
1518
  <br /><small><?php _e('Укажите минимальную и максимальную оценку.', 'rss-for-yandex-turbo'); ?><br />
1519
  <?php _e('Каждой записи будет присвоена случайная оценка в указанном диапазоне.', 'rss-for-yandex-turbo'); ?><br />
1520
  <?php _e('Этот рейтинг будет выведен сразу после заголовка с миниатюрой записи.', 'rss-for-yandex-turbo'); ?><br />
1891
  if ( $exclude_term_ids ) {
1892
  $terms = get_terms( $taxonomy->name, array('include'=>$exclude_term_ids,'hide_empty'=>false,'hierarchical'=>false) );
1893
  foreach ( $terms as $term ) {
1894
+ echo "<li><input type='checkbox' name='exclude-{$taxonomy->name}[{$term->term_id}]' id='exclude_{$term->term_id}' value='{$term->term_id}' checked='checked' /> <label for='exclude_{$term->term_id}'>" . esc_html($term->name) . "</label></li> ";
1895
  }
1896
  }
1897
  ?>
2080
  <tr class="ytexcludetagslisttr" <?php if ($yturbo_options['ytexcludetags'] == 'disabled') echo 'style="display:none;"'; ?>>
2081
  <th style="padding-top: 5px;"><?php _e('Теги для удаления:', 'rss-for-yandex-turbo'); ?></th>
2082
  <td style="padding-top: 5px;">
2083
+ <input style="display:none;" name="ytexcludetagslist-input" class="ytexcludetagslist-input" placeholder="" value="<?php echo esc_attr(stripslashes($yturbo_options['ytexcludetagslist'])); ?>" />
2084
  <input type="hidden" id="tags-list" value="<?php echo yturbo_tags_list(); ?>" />
2085
+ <input type="hidden" name="ytexcludetagslist" id="ytexcludetagslist" value="<?php echo esc_attr(stripslashes($yturbo_options['ytexcludetagslist'])); ?>" />
2086
  <small><?php _e('Список удаляемых html-тегов. Начните набирать нужный тег для подсказки.', 'rss-for-yandex-turbo'); ?><br />
2087
  <?php _e('Самозакрывающиеся теги вроде <tt>&lt;br /></tt> этим фильтром удалить нельзя.', 'rss-for-yandex-turbo'); ?><br />
2088
  <?php _e('Список возможных для удаления тегов можно <a target="_blank" href="https://ru.wordpress.org/plugins/rss-for-yandex-turbo/#%D0%BA%D0%B0%D0%BA%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D1%82%D0%B5%D0%B3%D0%BE%D0%B2%20%D0%B4%D0%BB%D1%8F%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%3F">переопределить</a>.', 'rss-for-yandex-turbo'); ?><br />
2099
  <tr class="ytexcludetagslist2tr" <?php if ($yturbo_options['ytexcludetags2'] == 'disabled') echo 'style="display:none;"'; ?>>
2100
  <th style="padding-top: 5px;"><?php _e('Теги для удаления:', 'rss-for-yandex-turbo'); ?></th>
2101
  <td style="padding-top: 5px;">
2102
+ <input style="display:none;" name="ytexcludetagslist-input2" class="ytexcludetagslist-input2" placeholder="" value="<?php echo esc_attr(stripslashes($yturbo_options['ytexcludetagslist2'])); ?>" />
2103
  <input type="hidden" id="tags-list2" value="<?php echo yturbo_tags_list(); ?>" />
2104
+ <input type="hidden" name="ytexcludetagslist2" id="ytexcludetagslist2" value="<?php echo esc_attr(stripslashes($yturbo_options['ytexcludetagslist2'])); ?>" />
2105
  <small><?php _e('Список удаляемых html-тегов. Начните набирать нужный тег для подсказки.', 'rss-for-yandex-turbo'); ?><br />
2106
  <?php _e('Самозакрывающиеся теги вроде <tt>&lt;br /></tt> этим фильтром удалить нельзя.', 'rss-for-yandex-turbo'); ?> <br />
2107
  <?php _e('Список возможных для удаления тегов можно <a target="_blank" href="https://ru.wordpress.org/plugins/rss-for-yandex-turbo/#%D0%BA%D0%B0%D0%BA%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D1%82%D0%B5%D0%B3%D0%BE%D0%B2%20%D0%B4%D0%BB%D1%8F%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%3F">переопределить</a>.', 'rss-for-yandex-turbo'); ?><br />
2295
  }
2296
 
2297
  if(isset($_POST['ytextendedhtmlmeta'])){
2298
+ $selected = sanitize_text_field($_POST['ytextendedhtmlmeta']);
2299
  update_post_meta($post_id, 'ytextendedhtmlmeta', $selected);
2300
  }
2301
  }
2629
  }
2630
 
2631
  //если в настройках не выбраны типы записей, то отключаем дефолтный post_type равный 'post'
2632
+ if(!isset($yttype[0])){$yttype=array();$yttype[0]='trulala';}
2633
 
2634
  $args = array(
2635
  'paged' => $paged,
2657
  version="2.0">
2658
  <channel>
2659
  <turbo:cms_plugin>C125AEEC6018B4A0EF9BF40E6615DD17</turbo:cms_plugin>
2660
+ <title><?php echo esc_attr(stripslashes($yttitle)); ?></title>
2661
  <link><?php echo esc_html($ytlink); ?></link>
2662
+ <description><?php echo esc_attr(stripslashes($ytdescription)); ?></description>
2663
  <?php if ($ytmetrika) { ?><turbo:analytics id="<?php echo $ytmetrika; ?>" type="Yandex"></turbo:analytics><?php echo PHP_EOL; ?><?php } ?>
2664
  <?php if ($ytliveinternet) { ?><turbo:analytics type="LiveInternet"></turbo:analytics><?php echo PHP_EOL; ?><?php } ?>
2665
  <?php if ($ytgoogle) { ?><turbo:analytics id="<?php echo $ytgoogle; ?>" type="Google"></turbo:analytics><?php echo PHP_EOL; ?><?php } ?>
2734
  //удаляем unicode-символы (как невалидные в rss)
2735
  $content = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $content);
2736
 
2737
+ //убираем лишние figure вокруг галереи (на 5.9 изменилась разметка плюс лишние figure, если прописано описание галереи)
2738
+ //<tempgallery> будет убрано позже в yturbo_do_gallery
2739
+ $content = preg_replace_callback('#(<figure class=\"wp-block-gallery[^>]*>)(.+?)(</figure>\n</figure>|</figure><figcaption class="blocks-gallery-caption">(.*?)</figcaption></figure>)#is', function($m){
2740
+ $pattern = '/<figure(.*?)><img(.*?)>(.*?)<\/figure>/i';
2741
+ $replacement = '<img$2>';
2742
+ $m[2] = preg_replace($pattern, $replacement, $m[2]);
2743
+ return('<tempgallery>'.$m[2].'</tempgallery>');
2744
+ }, $content);
2745
+
2746
  //удаляем разметку движка при использовании шорткода с подписью [caption] (в html4 темах - classic editor)
2747
+ $pattern = "/<div(.*?)>(.*?)<img(.*?)\/>(.*?)<\/p>\n<p(.*?)>(.*?)<\/p>\n<\/div>/i";
2748
+ $replacement = '<tempfigure>$2<tempimg$3/>$4<tempfigcaption>$6</tempfigcaption></tempfigure>';
2749
  $content = preg_replace($pattern, $replacement, $content);
2750
  //разметка описания на случай, если тег div удаляется в настройках плагина
2751
+ $pattern = "/<p>(.*?)<img(.*?)\/>(.*?)<\/p>\n<p(.*?)class=\"wp-caption-text\">(.*?)<\/p>/i";
2752
+ $replacement = '<tempfigure>$1<tempimg$2/>$3<tempfigcaption>$5</tempfigcaption></tempfigure>';
2753
  $content = preg_replace($pattern, $replacement, $content);
2754
 
2755
  //удаляем разметку движка при использовании шорткода с подписью [caption] (в html5 темах - classic editor)
2756
+ $pattern = "/<figure(.*?)>(.*?)<img(.*?)\/>(.*?)<figcaption(.*?)>(.*?)<\/figcaption><\/figure>/i";
2757
+ $replacement = '<tempfigure>$2<tempimg$3/>$4<tempfigcaption>$6</tempfigcaption></tempfigure>';
2758
  $content = preg_replace($pattern, $replacement, $content);
2759
 
2760
  //удаляем <figure>, если они изначально присутствуют в контенте записи (с указанным caption - gutenberg)
2761
+ $pattern = "/<figure(.*?)>(.*?)<img(.*?)\/>(.*?)<figcaption(.*?)>(.*?)<\/figcaption><\/figure>/i";
2762
+ $replacement = '<tempfigure>$2<tempimg$3/>$4<tempfigcaption>$6</tempfigcaption></tempfigure>';
2763
  $content = preg_replace($pattern, $replacement, $content);
2764
 
2765
  //удаляем <figure>, если они изначально присутствуют в контенте записи (без caption - gutenberg)
2766
  $pattern = "/<figure(.*?)>(.*?)<img(.*?)>(.*?)<\/figure>/i";
2767
+ $replacement = '<tempfigure>$2<tempimg$3>$4</tempfigure>';
2768
  $content = preg_replace($pattern, $replacement, $content);
2769
 
2770
+ //удаляем <figure> вокруг всех остальных элементов (яндекс такое не понимает)
2771
  $pattern = "/<figure(.*?)>/i";
2772
  $replacement = '';
2773
  $content = preg_replace($pattern, $replacement, $content);
2774
  $pattern = "/<\/figure>/i";
2775
  $replacement = '';
2776
  $content = preg_replace($pattern, $replacement, $content);
2777
+ $pattern = "/<figcaption(.*?)>(.*?)<\/figcaption>/i";
2778
  $replacement = '';
2779
  $content = preg_replace($pattern, $replacement, $content);
2780
 
2781
+ //обрабатываем картинки в ссылках
2782
+ $pattern = "/<a(.*?)>(.*?)<img(.*?)>(.*?)<\/a>/i";
2783
+ $replacement = '<tempfigure><a$1><tempimg$3></a></tempfigure>';
2784
  $content = preg_replace($pattern, $replacement, $content);
2785
 
2786
+ //обрабатываем картинки без ссылок
2787
+ $pattern = "/<img(.*?)>/i";
2788
+ $replacement = '<tempfigure><tempimg$1></tempfigure>';
2789
  $content = preg_replace($pattern, $replacement, $content);
2790
 
2791
+ //удаляем лишние теги параграфов
2792
+ $pattern = "/<p><tempfigure>(.*?)<\/tempfigure><\/p>/i";
2793
+ $replacement = '<tempfigure>$1</tempfigure>';
2794
+ $content = preg_replace($pattern, $replacement, $content);
2795
 
 
 
 
 
 
 
 
 
 
 
 
2796
  if ($ytfigcaption == 'Отключить описания') {
2797
+ $pattern = "/<tempfigcaption>(.*?)<\/tempfigcaption>/i";
2798
+ $replacement = '';
2799
  $content = preg_replace($pattern, $replacement, $content);
2800
  }
2801
 
2802
+ $content = str_replace('<tempfigure', '<figure', $content);
2803
+ $content = str_replace('</tempfigure>', '</figure>', $content);
2804
+ $content = str_replace('<tempfigcaption>', '<figcaption>', $content);
2805
+ $content = str_replace('</tempfigcaption>', '</figcaption>', $content);
2806
+ $content = str_replace('<tempimg', '<img', $content);
2807
+
2808
  $purl = plugins_url('', __FILE__);
2809
 
2810
+ //преобразуем iframe с видео
2811
+ $pattern = "/<iframe title=\"(.*?)\"(.*?) allow=\"(.*?)\"(.*?)><\/iframe>/i";
2812
+ $replacement = '<iframe$2 allowfullscreen="true"></iframe>';
2813
+ $content = preg_replace($pattern, $replacement, $content);
2814
+
2815
  //формируем video для mp4 файлов согласно документации яндекса (гутенберг)
2816
  $pattern = "/<video(.*?)src=\"(.*?).mp4\"><\/video>/i";
2817
  $replacement = '<figure><video><source src="$2.mp4" type="video/mp4" /></video><img src="'.$purl.'/img/video.png'.'" /></figure>';
2819
 
2820
  //формируем video для mp4 файлов согласно документации яндекса (классический редактор)
2821
  $content = str_replace('<!--[if lt IE 9]><script>document.createElement(\'video\');</script><![endif]-->', '', $content);
2822
+ $content = str_replace('<!--[if lt IE 9]><![endif]-->', '', $content);
2823
  $pattern = "/<video class=\"wp-video-shortcode\"(.*?)><source(.*?)src=\"(.*?).mp4(.*?)\"(.*?)\/>(.*?)<\/video>/i";
2824
  $replacement = '<figure><video><source src="$3.mp4" type="video/mp4" /></video><img src="'.$purl.'/img/video.png'.'" /></figure>';
2825
  $content = preg_replace($pattern, $replacement, $content);
2836
  $content = preg_replace($pattern, $replacement, $content);
2837
 
2838
  //удаляем картинки из контента, если их больше 50 уникальных (ограничение яндекс.турбо)
2839
+ if (preg_match_all("/<figure(.*?)>(.*?)<img(.*?)>(.*?)<\/figure>/i", $content, $res)) {
2840
  $i = 0;
2841
  if ($ytrelated=='enabled' && $ytrelatednumber && $ytrelatedinfinity != 'enabled') $i = $ytrelatednumber;
2842
  if ($ytthumbnail=='enabled' && has_post_thumbnail(get_the_ID())) $i++;
2870
  $content = apply_filters( 'yturbo_add_contents', $content );
2871
  ?>
2872
  <header>
2873
+ <?php
2874
+ if ( $ytthumbnail == 'enabled' && has_post_thumbnail( get_the_ID() ) ) {
2875
+ $caption = ''; $imgurl = '';
2876
+ $caption = get_the_post_thumbnail_caption( get_the_ID() );
2877
+ $imgurl = strtok(get_the_post_thumbnail_url( get_the_ID(), $ytselectthumb), '?');
2878
+ if ( $caption && $ytfigcaption != 'Отключить описания' ) {
2879
+ $temp = '<figcaption>'.$caption.'</figcaption>';}
2880
+ else {
2881
+ $temp='';
2882
+ }
2883
+ echo '<figure><img src="'. strtok(get_the_post_thumbnail_url(get_the_ID(),$ytselectthumb), '?') .'" />'.$temp.'</figure>'.PHP_EOL;
2884
+ }
2885
+ if ( $ytthumbnail == 'enabled' && ! has_post_thumbnail( get_the_ID() ) ) {
2886
+ $caption = ''; $imgurl = '';
2887
+ $caption = apply_filters('yturbo_thumb_caption', $caption);
2888
+ $imgurl = apply_filters('yturbo_thumb_imgurl', $imgurl);
2889
+ if ( $caption && $ytfigcaption != 'Отключить описания' ) {
2890
+ $temp = '<figcaption>'.$caption.'</figcaption>';}
2891
+ else {
2892
+ $temp='';
2893
+ }
2894
+ if ( $imgurl ) {
2895
+ echo '<figure><img src="'. $imgurl .'" />'.$temp.'</figure>'.PHP_EOL;
2896
+ }
2897
+ }
2898
+ ?>
2899
  <h1><?php echo get_the_title_rss(); ?></h1>
2900
+ <?php if ( $ytselectmenu != 'Не использовать' ) {
2901
  echo '<menu>'.PHP_EOL;
2902
  $menu = wp_get_nav_menu_object( $ytselectmenu );
2903
  $menu_items = wp_get_nav_menu_items($menu->term_id);
3227
  }
3228
  else :
3229
 
3230
+ if(!isset($yttype[0])){$yttype=array();$yttype[0]='trulala';}//если в настройках не выбраны типы записей, то отключаем дефолтный post_type равный 'post'
3231
  $args = array('ignore_sticky_posts' => 1, 'post_type' => $yttype, 'post_status' => 'publish', 'posts_per_page' => $ytnumber,'tax_query' => $tax_query,
3232
  'meta_query' => array('relation' => 'OR', array('key' => 'ytrssenabled_meta_value', 'compare' => 'NOT EXISTS',),
3233
  array('key' => 'ytrssenabled_meta_value', 'value' => 'yes', 'compare' => '!=',),));
3346
  $rpl = str_replace($r[1], $attrs, $tag);
3347
  //заменяем одинарные кавычки на двойные
3348
  $rpl = str_replace("'", "\"", $rpl);
3349
+ $rpl = str_replace(" ", " ", $rpl);
3350
  //добавляем закрывающий символ / если он отсутствует
3351
  $rpl = str_replace("\">", "\" />", $rpl);
3352
  //добавляем пробел перед закрывающим символом /
3451
  //функция преобразования стандартных галерей движка в турбо-галереи в гутенберге begin
3452
  function yturbo_do_gallery( $content ) {
3453
 
3454
+ //удаляем ul разметку галерей в гутенберге (wordpress 5.0+)
3455
+ $pattern = "/<ul class=\"wp-block-gallery(.*?)>(.*?)<\/ul>/s";
3456
  $replacement = '<div data-block="gallery">$2</div>';
3457
  $content = preg_replace($pattern, $replacement, $content);
3458
 
3459
+ //удаляем ul разметку галерей в гутенберге (wordpress 5.3+)
3460
+ $pattern = "/<ul class=\"blocks-gallery-grid(.*?)>(.*?)<\/ul>/s";
3461
  $replacement = '<div data-block="gallery">$2</div>';
3462
  $content = preg_replace($pattern, $replacement, $content);
3463
 
3464
  //удаляем li разметку галерей в гутенберге
3465
+ $pattern = "/<li class=\"blocks-gallery-item\">\n<figure>(.*?)<img src=\"(.*?)\" \/>(.*?)<\/figure>\n<\/li>/i";
3466
+ $replacement = '<img src="$2"/>';
3467
+ $content = preg_replace($pattern, $replacement, $content);
3468
+
3469
+ $pattern = "/<li class=\"blocks-gallery-item\">\n<figure>(.*?)<img src=\"(.*?)\" \/>(.*?)<\/figure>\n<\/li>/i";
3470
+ $replacement = '<img src="$2"/>';
3471
  $content = preg_replace($pattern, $replacement, $content);
3472
 
3473
+ //удаляем двойную обертку (tempgallery)
3474
+ $content = str_replace('<tempgallery><div data-block="gallery">','<div data-block="gallery">',$content);
3475
+ $content = str_replace('</div></tempgallery>',PHP_EOL.'</div>',$content);
3476
+ //двойная оберка только на 5.8 и ниже, на 5.9 и выше убираем так
3477
+ $content = str_replace('<tempgallery>','<div data-block="gallery">',$content);
3478
+ $content = str_replace('</tempgallery>',PHP_EOL.'</div>',$content);
3479
+
3480
  return $content;
3481
  }
3482
  //функция преобразования стандартных галерей движка в турбо-галереи в гутенберге end
3630
  if ($yturbo_options['ytfeedbackcallback']) {
3631
  $content .= '<div data-type="callback" data-send-to="'.$yturbo_options['ytfeedbackcallback'].'"';
3632
  if ($yturbo_options['ytfeedbackcallback2'] && $yturbo_options['ytfeedbackcallback3']) {
3633
+ $content .= ' data-agreement-company="'.esc_attr(stripslashes($yturbo_options['ytfeedbackcallback2'])).'" data-agreement-link="'.$yturbo_options['ytfeedbackcallback3'].'"';
3634
  }
3635
  }
3636
  $content .= '></div>'.PHP_EOL;
3810
  'to_menu' => false,
3811
  'title' => $yturbo_options['yttoczag'],
3812
  'min_found' => $yturbo_options['yttocnumber'],
3813
+ 'min_length' => 10,
3814
  'page_url' => get_the_permalink(),
3815
  'selectors' => $selectors,
3816
  );
4060
  'ytrssenabled_meta_value',
4061
  'template_meta',
4062
  'custom_template',
4063
+ 'ytextendedhtmlmeta',
4064
  );
4065
  if ( in_array($meta_key, $hide_meta_keys) ) {
4066
  return true;
4096
  <turbo:cms_plugin>C125AEEC6018B4A0EF9BF40E6615DD17</turbo:cms_plugin>
4097
  <title><?php echo stripslashes($yturbo_options['yttitle']); ?></title>
4098
  <link><?php echo esc_html($yturbo_options['ytlink']); ?></link>
4099
+ <description><?php echo esc_attr(stripslashes($yturbo_options['ytdescription'])); ?></description>
4100
+ <language><?php echo esc_attr($yturbo_options['ytlanguage']); ?></language>
4101
  <generator>RSS for Yandex Turbo v<?php echo $yturbo_options['version']; ?> (https://wordpress.org/plugins/rss-for-yandex-turbo/)</generator>
4102
  <?php if ( $yturbo_options['ytexcludeurlslist'] ) {
4103
  $textAr = explode("\n", str_replace(array("\r\n", "\r"), "\n", $yturbo_options['ytexcludeurlslist']));
4189
  if ( ! isset($_REQUEST['taxonomy']) )
4190
  return;
4191
 
4192
+ $taxonomy = (string) sanitize_text_field($_REQUEST['taxonomy']);
4193
 
4194
  header("HTTP/1.1 200");
4195
  header("Content-Type: text/html; charset=UTF-8");
4210
  'hide_empty' => false,
4211
  'hierarchical' => false,
4212
  'number' => 100,
4213
+ 'offset' => sanitize_text_field($_REQUEST['offset'])
4214
  ));
4215
 
4216
  if ( ! $terms ) {
4219
  }
4220
 
4221
  foreach ($terms as $term) {
4222
+ echo "<li><input type='checkbox' name='exclude-{$taxonomy}[{$term->term_id}]' id='exclude_{$term->term_id}' value='{$term->term_id}' /> <label for='exclude_{$term->term_id}'>" . esc_html($term->name) . "</label></li>";
4223
  }
4224
  exit;
4225
  }