Files
profile/clear-functions.php
2026-01-12 13:37:40 +03:00

1434 lines
40 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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' ),
]
);
add_theme_support( 'post-thumbnails', ['post', 'profile_article', 'anew', 'guest-author', 'yellow', 'journal_issue'] );
}
/**
* Добавление в 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";
//$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);
$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
{
$post_id = get_the_ID();
$days = get_post_meta(get_the_ID(),'_hide_thumbnail_countdown', true);
if ($days == 0){ // если ноль - показывать всегда
return true;
}
if( hide_thumbnail_by_countdown() ) {
return false;
}
//if ( is_single() || is_feed() ) {
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;
//}
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
*/
require_once get_theme_file_path('/inc/compress-html.php');
//require_once 'inc/compress-html.php';
//require_once __DIR__ . "/inc/compress-html.php";
/**
* Добавляет в крон хук, который сбрасывает кеш 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);