Files
profile/clear-functions.php

1434 lines
40 KiB
PHP
Raw Permalink Normal View History

2025-07-09 21:21:17 +03:00
<?php
/**
* TODO: Перед следующим релизом добавить фильтры:
* _hide_on_mainpage -- тут не забыть is_front_page() и https://connekthq.com/plugins/ajax-load-more/docs/filter-hooks/#alm_query_args
* _hide_on_website
* _only_link_access
*
* tax_query, который скроет с главной агрегатор
*
*
* TODO: Для мамлеева сделать отдельный cell (но обозвать его не мамлеев, а cell-only-title)
*
*
* TODO: Вывод галереи
*
*
*/
/**
* Подключение кастомных таблиц стилей (TODO: когда Ильгиз доделает, скачать, пока по ссылке)
*/
add_action( 'wp_enqueue_scripts', 'register_theme_styles' );
function register_theme_styles() : void
{
wp_register_style("main-styles", get_template_directory_uri() . "/assets/css/app.css", [], wp_get_theme()->Version, "all");
wp_enqueue_style("main-styles");
wp_register_style("desktop-styles", get_template_directory_uri() . "/assets/css/app-desktop.css", [], wp_get_theme()->Version, "(min-width: 992px)");
wp_enqueue_style("desktop-styles");
wp_register_style("mobile-styles", get_template_directory_uri() . "/assets/css/app-mobile.css", [], wp_get_theme()->Version, "(max-width: 992px)");
wp_enqueue_style("mobile-styles");
wp_register_style("roboto-font", "https://fonts.googleapis.com/css2?family=PT+Sans:wght@400;700&family=Roboto:wght@400;700&display=swap");
wp_enqueue_style("roboto-font");
wp_register_style("advtoken-styles", get_template_directory_uri() . "/assets/css/app-advtoken.css", [], wp_get_theme()->Version, "all");
wp_enqueue_style("advtoken-styles");
}
/**
* Подключение кастомных скриптов (TODO: когда Ильгиз доделает, скачать, пока по ссылке)
*/
add_action( 'wp_enqueue_scripts', 'register_theme_scripts' );
function register_theme_scripts() : void
{
wp_register_script("main-scripts", get_template_directory_uri() . "/assets/js/app-min.js", [], wp_get_theme()->Version, true);
wp_enqueue_script("main-scripts");
if( wp_is_mobile() ) {
if($_SERVER['HTTP_SIDE'] === 'gprofile') {
wp_register_script("doubleclick", "https://securepubads.g.doubleclick.net/tag/js/gpt.js");
wp_enqueue_script("doubleclick");
} else {
wp_register_script("adfox", "https://yandex.ru/ads/system/context.js");
wp_enqueue_script("adfox");
}
}
}
/**
* Отключение лишних стилей
*/
add_action( 'wp_enqueue_scripts', 'clear_scripts_styles', 999 );
function clear_scripts_styles() : void
{
foreach ([
"wp-block-library",
"elasticpress-related-posts-block",
"classic-theme-styles",
"global-styles",
"ajax-load-more-filters",
"ajax-load-more-layouts",
"ajax-load-more-paging",
"searchterm-highlighting"
] as $item) {
wp_dequeue_style($item);
wp_deregister_style($item);
}
}
/**
* Инициализация свойств темы
*/
add_action( 'after_setup_theme', 'theme_setup' );
function theme_setup() : void
{
set_post_thumbnail_size( 782, 440, true );
add_image_size( 'thumb-1200', 1200, 675, true );
add_image_size( 'thumb-782', 782, 440, true );
add_image_size( 'thumb-590', 590, 332, true );
add_image_size( 'thumb-500', 500, 281, true );
add_image_size( 'thumb-400', 400, 225, true );
add_image_size( 'thumb-345', 345, 213, true );
add_image_size( 'thumb-320', 320, 180, true );
add_image_size( 'thumb-290', 290, 179, true );
add_image_size( 'thumb-264', 264, 172, true );
add_image_size( 'thumb-224', 224, 138, true );
/**
* https://wordpress.org/plugins/wp-retina-2x/
* https://www.wpbeginner.com/wp-tutorials/how-to-create-additional-image-sizes-in-wordpress/
*/
register_nav_menus (
[
'header_menu' => __( 'Меню в шапке', 'profilemagazine' ),
'burger_menu_1' => __( 'Меню в бургере 1', 'profilemagazine' ),
'burger_menu_2' => __( 'Меню в бургере 2', 'profilemagazine' ),
'other_categories' => __( 'Другие рубрики', 'profilemagazine' ),
'footer_menu' => __( 'Меню в подвале', 'profilemagazine' ),
]
);
2026-01-12 13:37:40 +03:00
add_theme_support( 'post-thumbnails', ['post', 'profile_article', 'anew', 'guest-author', 'yellow', 'journal_issue'] );
2025-07-09 21:21:17 +03:00
}
/**
* Добавление в head стилей для брендированных рубрик
*/
add_action('wp_head', 'branding_styles');
function branding_styles() : void
{
if ( is_branding() ) {
get_template_part("template-parts/header/branding");
}
}
/**
* Проверка брендирования
* @return bool
*/
function is_branding() : bool
{
if( is_tag() || is_category() ) {
return
get_term_meta( get_queried_object_id(), "type", true ) === "branding"
||
get_term_meta( get_queried_object()->parent, "type", true ) === "branding";
}
if ( is_single() ) {
return
get_term_meta( get_the_category( get_queried_object_id() )[0]->term_id, 'type', true) === "branding"
||
get_term_meta( get_the_category( get_queried_object_id() )[0]->parent, 'type', true) === "branding";
}
return false;
}
/**
* Возвращает значение мета-поля брендированной рубрики
* @return string
* TODO:Заменить дефолтную мету
*/
function get_branding_meta(string $meta = 'taxonomy_logo_image') : string
{
if( is_category() ) {
$term_id = get_term_meta( get_queried_object_id(), 'type', true) === "branding" ? get_queried_object_id() : get_queried_object()->parent;
} else {
$term_id = get_term_meta( get_the_category( get_queried_object_id() )[0]->term_id, 'type', true) === "branding" ? get_the_category( get_queried_object_id() )[0]->term_id : get_the_category( get_queried_object_id() )[0]->parent;
}
return get_term_meta( $term_id, $meta, true );
}
/**
* Возвращает идентификатор рубрики для текущей страницы, если это архив рубрики или страница материала,
* идентификатор термина другой таксономии в архиве таксономии
* @param int $id
* @return int
*/
function get_current_page_main_taxonomy_term_id( int $id = 0 ) : ?int
{
if( ( is_category() || is_tag() || is_author() ) && !$id ) {
return get_queried_object_id();
} else {
$id = $id ? $id : get_queried_object_id();
return get_the_category( $id )[0]->term_id;
}
return 0;
}
/**
* Выводит в теге style критические стили для текущего шаблона
*/
function current_template_stylesheet() : void
{
}
/**
* Возвращает html баннера локальной рекламной системы по идентификатору
* @param int $zone_id
* @return string
*/
function get_banner_by_zone_id( int $zone_id = 0, bool $show_on_mobile = false ) : string
{
if( !$zone_id || ( wp_is_mobile() && !$show_on_mobile ) ) {
return "";
}
if ( @include_once("/var/www/revive/www/delivery/alocal.php") ) {
if ( !isset($phpAds_context) ) {
$phpAds_context = [];
}
$phpAds_raw = view_local("", $zone_id, 0, 0, "", "", "0", $phpAds_context, "");
return $phpAds_raw["html"];
}
return "";
}
/**
* Walker для главного меню, добавляет классов элементам списка
*/
class Profile_Menu_Walker extends Walker_Nav_Menu {
const menu_classes = [
"header_menu" => [
"li_class" => "nav-item",
"a_class" => "nav-link nav-link--color"
],
"burger_menu_1" => [
"li_class" => "burger-menu burger-menu__color",
"a_class" => ""
],
"burger_menu_2" => [
"li_class" => "burger-menu burger-menu__bn",
"a_class" => ""
],
"other_categories" => [
"li_class" => "burger-menu__sub",
"a_class" => ""
],
"footer_menu" => [
"li_class" => "nav-footer-item",
"a_class" => "nav-footer-item__link"
],
];
function start_el( &$output, $data_object, $depth = 0, $args = null, $current_object_id = 0 ) {
$color = get_post_meta($data_object->ID, "_menu_item_color", true);
$color = $color ? $color : "black";
2026-01-12 13:37:40 +03:00
//$li_class = self::menu_classes[$args->theme_location]["li_class"] . implode(" ", $data_object->classes);
$li_class = self::menu_classes[$args->theme_location]["li_class"] ?? '';
$classes_part = '';
if (is_array($data_object->classes)) {
$classes_part = implode(" ", $data_object->classes);
} else {
$classes_part = $data_object->classes ?? '';
}
$li_class .= ' ' . trim($classes_part);
2025-07-09 21:21:17 +03:00
$a_class = self::menu_classes[$args->theme_location]["a_class"];
$link_attr = ! empty( $data_object->attr_title ) ? ' title="' . esc_attr( $data_object->attr_title ) .'"' : '';
$link_attr .= ! empty( $data_object->target ) ? ' target="' . esc_attr( $data_object->target ) .'"' : '';
$link_attr .= ! empty( $data_object->xfn ) ? ' rel="' . esc_attr( $data_object->xfn ) .'"' : '';
$link_attr .= ! empty( $data_object->url ) ? ' href="' . esc_attr( $data_object->url ) .'"' : '';
$link_attr .= " class=\"" . ( $current_object_id == $data_object->ID ? " active " : "" ) . str_replace( "color", $color, $a_class ) . "\" ";
$output .= "<li class=\"" . ( $current_object_id == $data_object->ID ? " active " : "" ) . str_replace("color", $color, $li_class) . "\">";
$item_output = sprintf( '%1$s<a%2$s>%3$s%4$s%5$s</a>%6$s',
$args->before,
$link_attr,
$args->link_before,
apply_filters( 'the_title', $data_object->title, $data_object->ID ),
$args->link_after,
$args->after
);
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $data_object, $depth, $args );
}
}
/**
* Проверяет наличие элементов массива в строке
* @param string $str
* @param array $arr
* @return bool
*/
function array_contains(string $str, array $arr) : bool
{
foreach ($arr as $a) {
if ( stripos($str, $a) !== false ) return true;
}
return false;
}
function replace_extension(string $filename, string $new_extension) : string
{
$info = pathinfo($filename);
return $info["dirname"] . "/" . $info["filename"] . "." . $new_extension;
}
/**
* Проверяет, установлен ли таймер и не истекло ли время показа заходного фото
* @param WP_Post|int|null $post
* @return bool
*/
function hide_thumbnail_by_countdown(WP_Post|int $post = null) : bool
{
$days = get_post_meta(get_the_ID(),'_hide_thumbnail_countdown', true);
if ( $days == NULL || $days <= 0 ) {
return false;
}
if( date("U") - get_the_date("U") > $days * 24 * 60 * 60 ) {
return true;
}
return false;
}
/**
* Проверяет, нужно ли показывать заходное фото
* @param WP_Post|int|null $post
* @return bool
*/
function show_post_thumbnail(WP_Post|int $post = null) : bool
{
2025-08-27 00:00:02 +03:00
$post_id = get_the_ID();
$days = get_post_meta(get_the_ID(),'_hide_thumbnail_countdown', true);
if ($days == 0){ // если ноль - показывать всегда
return true;
}
2025-07-09 21:21:17 +03:00
if( hide_thumbnail_by_countdown() ) {
return false;
}
2025-08-27 00:00:02 +03:00
//if ( is_single() || is_feed() ) {
2025-07-09 21:21:17 +03:00
if ( in_array( get_post_type(), ['anew', 'yellow'] ) && get_the_date("U") < 1719187200 ) {
$allow = [
"ТАСС",
"TASS",
"Профиль",
"Shutterstock"
];
$copyright = wp_get_attachment_caption( get_post_thumbnail_id() );
foreach ($allow as $c) {
if(str_contains($copyright, $c)) {
return true;
}
}
return false;
}
if ( get_post_type() === 'profile_article' && get_the_date("U") > 1577836800 ) {
return true;
}
$terms = get_the_category();
$term = array_shift($terms);
if(
$term->category_parent == 11430 ||
$term->term_id == 11430 ||
get_post_meta(get_the_ID(), 'event', true) == 1
) {
return true;
}
$allow = [
"Global Look Press",
"ТАСС",
"TASS",
"AFP",
"«Профиль»",
"kremlin.ru",
"president.gov.ua",
"president.gov.by",
"NASA",
"АГН «Москва»",
"АГН Москва",
"Агентство «Москва»",
"Авгурова",
"mil.ru",
"roscosmos.ru",
"mid.ru",
"vostock photo",
"duma.gov.ru",
"Пресс-служба"
];
$copyright = wp_get_attachment_caption( get_post_thumbnail_id() );
if( array_contains($copyright, $allow) ) {
return true;
}
if( date("U") - ( get_the_date("U") ) > 10 * 24 * 60 * 60 ) {
return false;
}
return true;
2025-08-27 00:00:02 +03:00
//}
2025-07-09 21:21:17 +03:00
return true;
}
/**
* * TODO:Зарефакторить
* Переписывает html вывода заходного фото постов
* @param string $html
* @param int $post_id
* @param int $post_thumbnail_id
* @return string
*/
function post_thumbnail_html_override( string $html, int $post_id, int $post_thumbnail_id, $size = "post-shumbnail", array|string $attr = "") : string
{
if( is_admin() || !in_array( get_post_type( $post_id ), ["anew", "yellow", "profile_article"] ) ) {
return $html;
}
return wp_get_attachment_image_html($post_thumbnail_id, true, true);
}
add_filter( 'post_thumbnail_html', 'post_thumbnail_html_override', 999, 5 );
/**
* * TODO:Зарефакторить
* Переписывает html вывода аватара автора
* @param string $html
* @param int $post_id
* @param int $post_thumbnail_id
* @return string
*/
function author_thumbnail_html_override( string $html, int $post_id, int $post_thumbnail_id, array|int|string $size = "post-shumbnail", array|string $attr = "") : string
{
if( is_admin() || !in_array( get_post_type( $post_id ), ["guest-author"] ) ) {
return $html;
}
$html = "<figure itemprop=\"image\" itemscope itemtype=\"https://schema.org/ImageObject\">";
$html .= "<picture class=\"onenews__picture\">";
$src = wp_get_attachment_image_src($post_thumbnail_id, "thumbnail")[0];
$src = $src ? $src : get_template_directory_uri() . "/assets/img/placeholder-264-264.png";
$mime = wp_get_image_mime($src);
$html .= "<source srcset=\"" . $src . "\" type=\"" . $mime . "\" media=\"all\" />";
$html .= "
<img
class=\"d-inline author__img\"
loading=\"lazy\"
width=\"264\"
height=\"264\"
src=\"" . $src . "\"
alt=\"" . get_post_meta($post_id, '_wp_attachment_image_alt', true) . "\" />
";
$html .= "<link itemprop=\"url\" href=\"" . $src . "\" />";
$html .= "<link itemprop=\"contentUrl\" href=\"" . $src . "\" />";
$html .= "</picture>";
$html .= "</figure>";
return $html;
}
add_filter( 'post_thumbnail_html', 'author_thumbnail_html_override', 998, 5 );
/**
* TODO:Зарефакторить
* Изменение html для изображений
* @param WP_Post|int $attachment
* @param bool $caption
* @param bool $copyright
* @param int $max_size
* @return string
*/
function wp_get_attachment_image_html_720( WP_Post|int $attachment = 0, bool $caption = false, bool $copyright = false, int $max_size = 782 ) : string
{
$post = get_post($attachment);
$html = "<figure itemprop=\"image\" itemscope itemtype=\"https://schema.org/ImageObject\">";
$html .= "<picture class=\"onenews__picture\">";
$sizes = [
320 => 350,
400 => 430,
500 => 530,
590 => 620,
782 => 768,
1200 => 768
];
foreach ($sizes as $size => $media) {
if($size > $max_size) { continue; }
$media = "(" . ($size < $max_size ? "max" : "min") . "-width: " . $media . ")";
$src = wp_get_attachment_image_src($attachment, "thumb-".$size)[0];
$src = $src ? $src : get_template_directory_uri() . "/assets/img/placeholder-782-440.png";
$mime = wp_get_image_mime($src);
$html .= "<source srcset=\"" . $src . "\" type=\"" . $mime . "\" media=\"" . $media . "\" />";
}
$html .= "
<img
class=\"d-block\"
width=\"" . ( wp_is_mobile() ? 500 : 1200 ) . "\"
height=\"" . ( wp_is_mobile() ? 281 : 675 ) . "\"
src=\"" . ( wp_is_mobile() ? wp_get_attachment_image_src($attachment, "thumb-500")[0] : $src ) . "\"
alt=\"" . get_post_meta($attachment, '_wp_attachment_image_alt', true) . "\" />
";
$html .= "<link itemprop=\"url\" href=\"" . $src . "\" />";
$html .= "<link itemprop=\"contentUrl\" href=\"" . $src . "\" />";
$html .= "</picture>";
if ( $caption || $copyright ) {
$html .= "<figcaption>";
if ( $caption ) {
$html .= "<p>" . $post->post_content . "</p>";
}
if ( $copyright ) {
$html .= "<span>" . wp_get_attachment_caption($attachment) . "</span>";
}
$html .= "</figcaption>";
}
$html .= "</figure>";
return $html;
}
/**
* * TODO:Зарефакторить
* Добавляем <link rel="preload" as="image" href="" /> в head
*/
add_action("wp_head", function() {
if( !is_single() || !has_post_thumbnail() ) {
return;
}
$post = get_post();
$attachment = get_post_thumbnail_id( $post );
$sizes = [
320 => 350,
400 => 430,
500 => 530,
590 => 620,
782 => 768,
1200 => 768
];
foreach ($sizes as $size => $media) {
$src = wp_get_attachment_image_src($attachment, "thumb-".$size)[0];
$src = $src ? $src : get_template_directory_uri() . "/assets/img/placeholder-782-440.png";
echo "<link rel=\"preload\" as=\"image\" href=\"" . $src . "\" media=\"" . $media . "\" />";
}
});
function wp_get_attachment_image_html( WP_Post|int $attachment = 0, bool $caption = false, bool $copyright = false, int $max_size = 1200 ) : string
{
$post = get_post($attachment);
// Получаем изображение 1200px
$img_1200 = wp_get_attachment_image_src($attachment, 'thumb-1200');
$img_1200_src = $img_1200 ? $img_1200[0] : get_template_directory_uri() . "/assets/img/placeholder-1200-675.png";
$img_alt = esc_attr(get_post_meta($attachment, '_wp_attachment_image_alt', true));
$html = "<figure itemprop=\"image\" itemscope itemtype=\"https://schema.org/ImageObject\">";
$html .= "<picture class=\"onenews__picture\">";
// Массив размеров для <source>
$sizes = [
320 => 350,
400 => 430,
500 => 530,
590 => 620,
782 => 768,
1200 => 1024 // media breakpoint, не обязательно точно 1200px
];
foreach ($sizes as $size => $media_width) {
if ($size > $max_size) {
continue;
}
$media_query = "(" . ($size < $max_size ? "max" : "min") . "-width: " . $media_width . "px)";
$source_img = wp_get_attachment_image_src($attachment, "thumb-" . $size);
$src = $source_img ? $source_img[0] : get_template_directory_uri() . "/assets/img/placeholder-{$size}.png";
$mime = wp_get_image_mime($src);
$html .= "<source srcset=\"" . esc_url($src) . "\" type=\"" . esc_attr($mime) . "\" media=\"" . esc_attr($media_query) . "\" />";
}
// Основное изображение на desktop — 1200px
$html .= "
<img
class=\"d-block\"
width=\"1200\"
height=\"675\"
src=\"" . esc_url($img_1200_src) . "\"
alt=\"" . $img_alt . "\" />
";
$html .= "<link itemprop=\"url\" href=\"" . esc_url($img_1200_src) . "\" />";
$html .= "<link itemprop=\"contentUrl\" href=\"" . esc_url($img_1200_src) . "\" />";
$html .= "</picture>";
// Добавим caption и/или copyright
if ( $caption || $copyright ) {
$html .= "<figcaption>";
if ( $caption ) {
$html .= "<p>" . esc_html($post->post_content) . "</p>";
}
if ( $copyright ) {
$html .= "<span>" . esc_html(wp_get_attachment_caption($attachment)) . "</span>";
}
$html .= "</figcaption>";
}
$html .= "</figure>";
return $html;
}
/**
* Добавляет символ © к подписи к фотографии
* @param string $caption
* @return string
*/
function add_copyright_to_caption( string $caption ) : string
{
return "©" . str_replace("©", "", $caption);
}
add_filter("wp_get_attachment_caption", "add_copyright_to_caption", 20, 1);
/**
* Фильтр для depositphotos, превращает строку depositphotos в ссылку на depositphotos.com в соответствии с условиями пользовательского соглашения
* @param string $caption
* @return string
*/
function depositphotos_link_to_caption( string $caption ) : string
{
return str_ireplace('depositphotos.com', '<a target="_blank" href="https://depositphotos.com/">depositphotos.com</a>', $caption);
}
add_filter("wp_get_attachment_caption", "depositphotos_link_to_caption", 30, 1);
/**
* Проверяет, относится ли страница к спецпроекту
* @return bool
*/
function is_special() : bool
{
if( is_tag() || is_category() ) {
return
get_term_meta( get_queried_object_id(), "type", true ) === "special"
||
get_term_meta( get_queried_object()->parent, "type", true ) === "special";
}
if ( is_single() ) {
return
get_term_meta( get_the_category( get_queried_object_id() )[0]->term_id, 'type', true) === "special"
||
get_term_meta( get_the_category( get_queried_object_id() )[0]->parent, 'type', true) === "special";
}
return false;
}
/**
* Возвращает строку со слагом категории-спецпроекта
* @return string
*/
function get_special_slug() : string
{
if( is_tag() || is_category() ) {
return get_queried_object()->slug;
}
if ( is_single() ) {
return get_the_category( get_queried_object_id() )[0]->slug;
}
return "";
}
/**
* Генерирует и возвращает идентификатор кеша ajax-load-mode
* @return int
*/
function get_alm_cache_id( mixed $after = "" ) : int
{
$current_id = get_queried_object_id();
$mobile = (int)wp_is_mobile();
$last_id = 0;
$last_id_query = new WP_Query(
[
"ignore_sticky_posts" => true,
"suppress_filters" => true,
"post_type" => ["profile_article", "anew", "yellow", "page", "archive", "guest-author"],
"posts_per_page" => 1,
"orderby" => "id",
"order" => "DESC"
]
);
if( $last_id_query->have_posts() ) {
while( $last_id_query->have_posts() ) {
$last_id_query->the_post();
$last_id = get_the_ID();
}
}
wp_reset_postdata();
return (int)( $current_id.$mobile.$last_id.$after );
//return (int) ( date("U") . $current_id.$mobile.$last_id.$after );
}
/**
* Регистрирует адресное пространство /events/?..., добавляет правило рерайта для него и переменную is_event
* @return void
*/
function register_events_slug() : void
{
add_rewrite_tag( '%is_event%', '([^&]+)' );
add_rewrite_rule( '^/(events)?','index.php?post_type=anew&is_event=true', 'top' );
flush_rewrite_rules();
}
add_action("init", "register_events_slug");
/**
* Проверка нахождения в индексе событий
* @return bool
*/
function is_events() : bool
{
return !!get_query_var("is_event");
}
/**
* Фильтр и сортировка для страницы событий
* @param WP_Query|null $query
* @return WP_Query
*/
function filter_events( WP_Query $query = null ) : WP_Query
{
if( is_events() && $query->is_main_query() ) {
$query->set(
"meta_query",
[
"relation" => "AND",
"order_clause" => [
"key" => "event_date",
"type" => "DATE"
],
"key_clause" => [
"key" => "event",
"value" => "1",
"compare" => "="
]
]
);
$query->set( "order", "DESC" );
$query->set( "orderby", "order_clause" );
}
return $query;
}
add_filter("pre_get_posts", "filter_events", 20, 1);
/**
* Добавляет микроразметку в хлебные крошки rank math
* @param string $html
* @param array $crumbs
* @return string
*/
function breadcrumbs_microdata(string $html, array $crumbs) : string
{
$html = "<ol class=\"d-none\" itemscope itemtype=\"https://schema.org/BreadcrumbList\">";
foreach ( $crumbs as $i => $crumb ) {
$html .= "<li itemprop=\"itemListElement\" itemscope itemtype=\"https://schema.org/ListItem\">";
$html .= "<a itemprop=\"item\" href=\"" . str_replace("admin.", "", $crumb[1]) . "\">";
$html .= "<span itemprop=\"name\">" . $crumb[0] . "</span>";
$html .= "<meta itemprop=\"position\" content=\"" . ( $i + 1 ) . "\" />";
$html .= "</a>";
$html .= "</li>";
}
$html .= "</ol>";
return $html;
}
add_filter( "rank_math/frontend/breadcrumb/html", "breadcrumbs_microdata", 10, 2);
/**
* Возвращает html-код дисклеймера, если он был указан в свойствах термина таксономии
* @return string
*/
function get_disclaimer() : string
{
$disclaimers = [];
$html = "";
foreach ( wp_get_post_terms( get_the_ID(), ["post_tag", "category"] ) as $term ) {
$meta = get_term_meta( $term->term_id, "disclaimer", true );
if ( $meta ) {
$disclaimers[] = $meta;
}
}
array_unique( $disclaimers );
foreach ( $disclaimers as $disclaimer ) {
$html .= "<p class=\"attention\">" . $disclaimer . "</p>";
}
return $html;
}
/**
* Возвращает запрос WP_Query с выборкой для "читайте также"
* @return WP_Query
*/
function read_another_posts() : WP_Query
{
$current_post_terms = wp_get_post_terms( get_the_ID(), ["post_tag", "category"], ["fields" => "id=>slug"] );
return new WP_Query(
[
"post_type" => ["anew", "yellow"],
"ignore_sticky_posts" => true,
"posts_per_page" => 3,
"order" => "DESC",
"orderby" => "post_date",
"post__not_in" => [ get_the_ID() ],
"tax_query" => [
"relation" => "AND",
[
"taxonomy" => "post_tag",
"field" => "slug",
"terms" => [ "aggregator" ],
"operator" => in_array( "aggregator", $current_post_terms ) ? "IN" : "NOT IN"
]
]
]
);
}
/**
* Возвращает html блока "Читайте также"
* @return string
*/
function read_another_posts_block() : string
{
$posts = read_another_posts();
$html = "";
if( $posts->have_posts() ) {
$html .= "<div id=\"readanother\">";
$html .= "<strong>Читайте также:</strong>";
$html .= "<ul>";
while( $posts->have_posts() ) {
$posts->the_post();
$html .= "<li>";
$html .= "<a href=\"" . get_the_permalink() . "?utm_from=readmore\">" . get_the_title() . "</a>";
$html .= "</li>";
}
$html .= "</ul>";
$html .= "</div>";
}
wp_reset_postdata();
return $html;
}
/**
* Вставляет в тело материала блок "Читайте также"
* @param string $content
* @return string
*/
function insert_read_another_posts_block( string $content ) : string
{
if ( wp_is_mobile() && !is_admin() && in_array( get_post_type() , ['anew', 'profile_article'] ) ) {
$pharagraphs = explode("</p>", $content);
$html = "<p>" . read_another_posts_block();
array_splice($pharagraphs, 4, 0, $html);
$content = implode( "</p>", $pharagraphs );
}
return $content;
}
add_filter("the_content", "insert_read_another_posts_block", 99, 1);
/**
* Вставляет рекламные блоки в текст материала
* @param string $content
* @return string
*/
function insert_ads_to_post(string $content) : string
{
if ( is_single() && wp_is_mobile() && !get_post_gallery( get_queried_object_id() ) && !get_field("remove_ads") ) {
$pharagraphs = explode("</p>", $content);
if ( get_post_type() === "profile_article" ) {
$pharagraphs = array_reduce(
array_map(
function($i) {
$html = load_template_part("template-parts/ad/adfox/ad-inread-" . rand(1, 3));
return count($i) == 3 ? array_merge($i, [$html]) : $i;
},
array_chunk($pharagraphs, 3)
),
function($r, $i) {
return array_merge($r, $i);
},
[]
);
} else {
$html = load_template_part("template-parts/ad/adfox/ad-inread-1");
array_splice($pharagraphs, 3, 0, $html);
}
return implode( "</p>", $pharagraphs );
}
return $content;
}
add_filter("the_content", "insert_ads_to_post", 99, 1);
/**
* Возвращает код темплейта
* @param string $template_name
* @param string $part_name
* @param array $args
* @return string
*/
function load_template_part( string $template_name = "", string $part_name = "", array $args = [] ) : string
{
ob_start();
get_template_part($template_name, $part_name, $args);
return ob_get_clean();
}
/**
* Убирает первый параграф из текста материала
* @param string $content
* @return string
*/
function remove_first_pharagraph( string $content ) : string
{
if ( is_single() ) {
$pharagraphs = explode("</p>", $content);
array_shift( $pharagraphs );
return implode( "</p>", $pharagraphs );
}
return $content;
}
/**
* Вовзращает первый параграф материала
* @param string $content
* @return string
*/
function get_first_pharagraph( string $content ) : string
{
$content = wpautop( $content );
$pharagraphs = explode("</p>", $content);
$dom = new DOMDocument();
$dom->loadHTML('<?xml encoding="utf-8" ?>' . array_shift( $pharagraphs ) . "</p>");
$links = $dom->getElementsByTagName('a');
foreach ($links as $link) {
if ($link->getAttribute("redirect") == "true" && mb_strlen($link->getAttribute("href")) > 0) {
$link->setAttribute("href", 'https://profile.ru/redirection?url=' . urlencode($link->getAttribute("href")));
$link->setAttribute("target", '_blank');
}
}
return str_replace(['<body>', '</body>'], '', $dom->saveHTML($dom->getElementsByTagName('body')->item(0)));
}
/**
* Сжатие html
*/
2026-01-12 13:37:40 +03:00
require_once get_theme_file_path('/inc/compress-html.php');
//require_once 'inc/compress-html.php';
2025-08-27 00:00:02 +03:00
//require_once __DIR__ . "/inc/compress-html.php";
2025-07-09 21:21:17 +03:00
/**
* Добавляет в крон хук, который сбрасывает кеш ALM на CDN
* @param int $post_id
* @return void
*/
function enqueue_purge_alm_cdn_cache( int $post_id ) : void
{
if( get_post_status() === "publish" && in_array( get_post_type(), ["anew", "profile_article", "yellow"] ) ) {
wp_schedule_single_event( date("U"), "purge_alm_cdn_cache_action" );
}
}
add_action("save_post", "enqueue_purge_alm_cdn_cache", 999, 1);
/**
* Хук и функция сброса кеша ALM на CDN
* @return void
*/
function purge_alm_cdn_cache () : void
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.selectel.ru/cdn/v2/projects/79a59227-6d80-4e33-863e-436820bf80ba/resources/20db689a-01bd-400d-b079-650896785b46/purge');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
$headers = [];
$headers[] = 'X-Token: Cw2bGev0itdax2l6OUN3Ro3Aa_82810';
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
error_log( 'Error:' . curl_error($ch) );
}
curl_close($ch);
}
add_action("purge_alm_cdn_cache_action", "purge_alm_cdn_cache");
add_action("admin_init", "pauser");
/**
* @return void
* Привет соколову с его жирным "опять"!
*/
function pauser() : void
{
if(get_current_user_id() == 78 && $_SERVER["REMOTE_ADDR"] != "195.9.141.2") {
sleep(3);
}
}
/**
* Проверяет, является ли строка валидным json
*
* @param $string
* @return bool
*/
function isStringJson($string) {
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
}
add_filter("the_content", function($content){
if(is_feed()){
$url = $_SERVER["REQUEST_URI"];
$params = explode("/", $url);
$params = array_filter($params);
$gn = array_pop($params);
if($gn === "gn"){
$content = "<h1>" . get_the_title( get_the_ID() ) . "</h1>" . $content;
}
}
return $content;
}, PHP_INT_MAX);
add_filter("pre_get_posts", function($query){
if(is_feed() && str_contains($_SERVER["REQUEST_URI"], "/zen")){
$query->set(
"meta_query", [
"relation" => "AND",
[
"meta_key" => "yzrssenabled_meta_value",
"meta_value" => "yes",
"compare" => "!="
]
]
);
}
return $query;
}, PHP_INT_MAX);