<?php
setlocale(LC_TIME, 'ru_RU.UTF-8');

require get_template_directory() . '/inc/rubrics-menu.php'; // Рубрики в меню
require get_template_directory() . '/inc/special.php'; // Подключаем спецпроекты
require get_template_directory() . '/inc/spravochniki.php'; // Подключаем справочники
require get_template_directory() . '/inc/avatar.php'; // Подключаем фото авторов

// Полностью отключить XML-RPC
add_filter( 'xmlrpc_enabled', '__return_false' );

// Отключение методов XML-RPC, требующих авторизации
add_filter( 'xmlrpc_methods', function( $methods ) {
    unset( $methods['pingback.ping'] );
    return $methods;
} );

// Полное отключение REST API
add_filter('rest_enabled', '__return_false');
add_filter('rest_jsonp_enabled', '__return_false');

function redirect_non_admin_users() {
    // Получаем текущего пользователя
    $current_user = wp_get_current_user();

    // Проверяем, если пользователь не является администратором
    if (in_array('subscriber', $current_user->roles)) {
        // Если это запрос к административной панели или если пользователь пытается получить доступ к wp-admin
        if (is_admin()) {
            // Перенаправляем на главную страницу сайта
            wp_redirect(home_url());
            exit;
        }
    }
}
add_action('admin_init', 'redirect_non_admin_users');


 //require_once get_template_directory() . '/filters/fix_agroexpert_links.php';


define('ENPART', 740);
define('EN_PARTS', '746,741,742,743,744,745');

// require get_template_directory().'/dzenews.php'; //add support dzen (добавляет поле Экслюзив)

function theme_setup()
{
    add_theme_support('menus');
    register_nav_menus(array(
        'primary' => __('Основное меню', 'your-theme-domain'),
        'socials' => __('Соцсети', 'your-theme-domain'),
        'footer-bottom' => __('Нижнее меню в подвале', 'your-theme-domain'),
    ));

    add_theme_support('custom-logo', array(
        'height'      => 100,
        'width'       => 400,
        'flex-height' => true,
        'flex-width'  => true,
    ));

    add_theme_support('post-thumbnails');
}
add_action('after_setup_theme', 'theme_setup');

function theme_enqueue_styles_scripts()
{
    // Enqueue Google Fonts
    wp_enqueue_style('google-fonts-raleway', 'https://fonts.googleapis.com/css2?family=Raleway:wght@400;500;600&display=swap', false);
    wp_enqueue_style('google-fonts-roboto', 'https://fonts.googleapis.com/css2?family=Roboto:wght@400&display=swap', false);

    wp_enqueue_style('google-fonts-Unbounded', 'https://fonts.googleapis.com/css2?family=Unbounded:wght@200..900&display=swap', false);
}
add_action('wp_enqueue_scripts', 'theme_enqueue_styles_scripts');

require_once 'vite.config.php';



add_filter('nav_menu_css_class', 'change_menu_item_css_class', 10, 4);
function change_menu_item_css_class($classes, $item, $args, $depth)
{
    // Удаляем нежелательные классы
    $classes = array_diff($classes, array('page_item', 'page-item-' . $item->ID));
    $classes = array_diff($classes, array('page_item', 'page-item-' . $item->ID));

    // Добавляем класс 'menu-item'
    $classes[] = 'menu-item';

    return $classes;
}

function get_asset(string $path)
{
    return get_template_directory_uri() . '/frontend/dist/' . $path;
}

function mytheme_widget_areas()
{
    // Регистрация левого сайдбара
    register_sidebar(array(
        'name'          => 'Левый сайдбар',
        'id'            => 'left-sidebar',
        'description'   => 'Виджеты в этой области будут показаны в левой части сайта.',
        'before_widget' => '<div id="%1$s" class="widget %2$s">',
        'after_widget'  => '</div>',
        'before_title'  => '<h3 class="widget-title">',
        'after_title'   => '</h3>',
    ));

    // Регистрация правого сайдбара
    register_sidebar(array(
        'name'          => 'Правый сайдбар',
        'id'            => 'right-sidebar',
        'description'   => 'Виджеты в этой области будут показаны в правой части сайта.',
        'before_widget' => '<div id="%1$s" class="widget %2$s">',
        'after_widget'  => '</div>',
        'before_title'  => '<h3 class="widget-title">',
        'after_title'   => '</h3>',
    ));
}
add_action('widgets_init', 'mytheme_widget_areas');


class Upcoming_Events_Widget extends WP_Widget
{
    function __construct()
    {
        parent::__construct(
            'upcoming_events_widget', // ID виджета
            'Upcoming Events', // Название виджета
            array('description' => 'Displays upcoming events') // Описание
        );
    }

    public function widget($args, $instance)
    {
        include get_template_directory() . '/widgets/upcoming-events-widget-template.php';
    }

    // Форма в админ-панели для настройки виджета
    public function form($instance)
    {
        $title = !empty($instance['title']) ? $instance['title'] : 'Новое название';
?>
        <p>
            <label for="<?php echo esc_attr($this->get_field_id('title')); ?>">Название:</label>
            <input class="widefat" id="<?php echo esc_attr($this->get_field_id('title')); ?>" name="<?php echo esc_attr($this->get_field_name('title')); ?>" type="text" value="<?php echo esc_attr($title); ?>">
        </p>
<?php
    }

    // Сохранение настроек виджета
    public function update($new_instance, $old_instance)
    {
        $instance = array();
        $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : '';
        return $instance;
    }
}

function register_upcoming_events_widget()
{
    register_widget('Upcoming_Events_Widget');
}
add_action('widgets_init', 'register_upcoming_events_widget');
add_action('widgets_init', 'register_upcoming_events_widget');

function format_event_date()
{
    $post_date = get_the_date('Y-m-d');
    $current_date = date('Y-m-d');
    $tomorrow_date = date('Y-m-d', strtotime('+1 day', strtotime($current_date)));

    if ($post_date == $current_date) {
        $date_text = 'сегодня';
    } elseif ($post_date == $tomorrow_date) {
        $date_text = 'завтра';
    } else {
        $date_text = get_the_date();
    }

    $time = get_the_time('H:i');

    return $date_text . ', ' . $time;
}

function get_published_date_in_english() {
    // Получение времени публикации поста
    $post_time = get_the_time('H:i');

    // Получение даты публикации поста на английском языке
    $post_date = get_post_time('F j, Y');

    // Формирование строки с датой и временем публикации
    return $post_time . ', ' . $post_date;
}



/**
 * Фильтр для изменения разметки хлебных крошек Yoast SEO.
 */
add_filter('wpseo_breadcrumb_output', 'custom_wpseo_breadcrumb_output');
function custom_wpseo_breadcrumb_output($output)
{
    // Заменяем начальный тег разметки.
    $output = str_replace('<span><span>', '', $output);
    $output = str_replace('</span></span>', '', $output);
    // Заменяем разделитель на нужный нам класс.
    $output = str_replace('»', '', $output);
    // Заменяем теги ссылок.
    $output = str_replace('<a', '<a class="breadcrumbs__item"', $output);
    // Заменяем тег последнего элемента (текущей страницы) на span с классом.
    $output = preg_replace('/<span class="breadcrumb_last"[^>]*>/', '<span class="breadcrumbs__item">', $output);

    return $output;
}



function custom_pagination($query = null, $class = "pagination")
{
    global $wp_query;
    
    $query = $query ?: $wp_query;
    $current_page = max(1, get_query_var('paged'));
    $total_pages = $query->max_num_pages;

    $show_items = 3; // Количество страниц для вывода в начале и в конце
    $range = 1; // Диапазон страниц вокруг текущей страницы

    if (1 == $total_pages) {
        return; // Если страница всего одна, пагинация не нужна
    }

    if ( defined('LANG') && LANG == 'en' ){
        $txt['back'] = 'Back';
        $txt['next'] = 'Next';
    } else {
        $txt['back'] = 'Назад';
        $txt['next'] = 'Далее';
    }

    echo '<div class="'.$class.'"><div class="pagination__list">';

    // Кнопка "Назад"
    if ($current_page > 1) {
        $prev_page_link = get_pagenum_link($current_page - 1);
        echo "<a href='" . esc_url($prev_page_link) . "' class=\"pagination__btn\">&laquo; ".$txt['back']."</a>";
    }

    // Начало пагинации
    for ($i = 1; $i <= $total_pages; $i++) {
        // Условие для предотвращения дублирования начальных страниц
        if ($total_pages > ($show_items * 2) && $i > $show_items && $i < $total_pages - $show_items + 1) {
            if ($i == $current_page - $range - 1 || $i == $current_page + $range + 1) {
                echo "<span class=\"pagination__item\">...</span>"; // Многоточие
                continue;
            }
        }

        if ($i == $current_page) {
            echo "<span class=\"pagination__item is-active\">$i</span>"; // Текущая страница
        } elseif ($i <= $show_items || ($i >= $total_pages - $show_items + 1) || ($i >= $current_page - $range && $i <= $current_page + $range)) {
            echo "<a href='" . get_pagenum_link($i) . "' class=\"pagination__item\">$i</a>";
        }
    }

    // Кнопка "Далее"
    if ($current_page < $total_pages) {
        $next_page_link = get_pagenum_link($current_page + 1);
        echo "<a href='" . esc_url($next_page_link) . "' class=\"pagination__btn\">".$txt['next']." &raquo;</a>";
    }

    echo '</div></div>';
}

function my_theme_scripts() {
    
    if (is_front_page() || (is_category() && !is_paged())) {
        wp_enqueue_script('my-load-more', get_template_directory_uri() . '/js/load-main-scroll.js', array('jquery'), '1.0.1', true);

        $query_vars = array('post_type' => 'post', 'posts_per_page' => 10);

        if (is_front_page()) {
            
            // Получаем ID категории, которую мы хотим исключить (например, категория с ID 740)
            $excluded_category_id = 740;
        
            // Получаем все подкатегории категории с ID 740
            $excluded_categories = get_categories(array(
                'child_of' => $excluded_category_id,
                'fields' => 'ids' // Получаем только ID подкатегорий
            ));
        
            // Включаем в запрос параметр, чтобы исключить категорию и её подкатегории
            $query_vars['category__not_in'] = array_merge(array($excluded_category_id), $excluded_categories);

        } elseif (is_category()) {
            $category = get_queried_object();
            $query_vars['cat'] = $category->term_id;
        }

        $query = new WP_Query($query_vars);

        wp_localize_script('my-load-more', 'my_load_more_params', array(
            'ajaxurl' => admin_url('admin-ajax.php'),
            'posts' => json_encode($query->query_vars),
            'current_page' => max(1, get_query_var('paged')), // Начальная страница
            'max_page' => $query->max_num_pages
        ));
    }
}
//add_action('wp_enqueue_scripts', 'my_theme_scripts');



function loadmore_ajax_handler() {
    $args = json_decode(stripslashes($_POST['query']), true);
    $args['paged'] = $_POST['page'] + 1;
    $args['post_status'] = 'publish';
    $args['posts_per_page'] = 12;

    // Проверка на категорию, если она есть в параметрах запроса
    if (isset($args['cat']) && !empty($args['cat'])) {
        $args['cat'] = $args['cat'];
    } else {
        $args['cat'] = [-17, -20, -21];
    }

    query_posts($args);

    if (have_posts()) :
        while (have_posts()) : the_post();
            get_template_part('content', 'post');
        endwhile;
    endif;
    die;
}
//add_action('wp_ajax_loadmore', 'loadmore_ajax_handler');
//add_action('wp_ajax_nopriv_loadmore', 'loadmore_ajax_handler');




/*
 * Фильтр добавлен для модификации стандартной формы плагина Contact Form ( Срезаем span элементы, в которые оборачивается input ).
 * Работает в связке с отключенными требованиями плагина - define( 'WPCF7_AUTOP', false );
 * В файле wp-config.php
 * */
add_filter('wpcf7_form_elements', function ($content) {
    $content = preg_replace('/<(span).*?class="\s*(?:.*\s)?wpcf7-form-control-wrap(?:\s[^"]+)?\s*"[^\>]*>(.*)<\/\1>/i', '\2', $content);
    return $content;
});

function show_post_image($post = null, $size = 'large')
{
    if (has_post_thumbnail($post)) {
        return get_the_post_thumbnail($post, $size);
    } else {
        return '<img src="' . get_template_directory_uri() . '/noimage.jpg">';
    }
}

add_action('rest_api_init', function () {
    register_rest_route('agroexpert/v1', '/posts-by-date/', array(
        'methods' => 'GET',
        'callback' => 'get_posts_by_date',
        'permission_callback' => '__return_true', // Доступно для чтения всеми
    ));
});


function get_posts_by_date($request)
{
    global $wpdb; // Глобальный объект базы данных WordPress

    // SQL-запрос для получения уникальных дат публикации постов
    $query = "
        SELECT DISTINCT DATE(post_date) as date
        FROM {$wpdb->posts}
        WHERE post_status IN ('publish', 'future')
        AND post_type = 'post'
        ORDER BY date DESC
    ";

    // Выполнение запроса
    $result = $wpdb->get_results($query);

    // Преобразование результатов в массив дат
    $dates = array_map(function ($item) {
        return $item->date;
    }, $result);

    return new WP_REST_Response($dates, 200);
}

function setup_future_hook()
{
    // Replace native future_post function with replacement
    remove_action('future_event', '_future_post_hook');
    add_action('future_event', 'publish_future_post_now');
}

function publish_future_post_now($id)
{
    // Set new post's post_status to "publish" rather than "future."
    wp_publish_post($id);
}

add_action('init', 'setup_future_hook');

add_action('restrict_manage_posts', 'add_author_filter_to_posts_admin');

function add_author_filter_to_posts_admin()
{
    global $post_type;

    // Убедитесь, что этот фильтр применяется только к типу поста 'post'
    if ('post' !== $post_type) {
        return;
    }

    // Получаем пользователей с ролью 'author'
    $authors = get_users(array('role' => '', 'orderby' => 'display_name', 'order' => 'ASC'));

    // Проверяем, установлен ли фильтр
    $selected = isset($_GET['custom_author']) ? $_GET['custom_author'] : '';

    // Начинаем выводить HTML выпадающего списка
    echo '<select name="custom_author">';
    echo '<option value="">Все авторы</option>';

    // Перебираем всех авторов и добавляем их в выпадающий список
    foreach ($authors as $author) {
        $display_name = $author->display_name; // Отображаемое имя для отображения
        $user_id = $author->ID; // ID пользователя для значения опции
        echo sprintf(
            '<option value="%s"%s>%s</option>',
            esc_attr($user_id),
            selected($selected, $user_id, false),
            esc_html($display_name)
        );
    }

    echo '</select>';
}

add_action('pre_get_posts', 'filter_posts_by_custom_author');

function filter_posts_by_custom_author($query)
{
    global $pagenow;

    // Применяем фильтр только в админ-панели и только для основного запроса на странице списка постов
    if (is_admin() && 'edit.php' === $pagenow && $query->is_main_query()) {
        // Проверяем, установлен ли наш фильтр
        if (!empty($_GET['custom_author'])) {
            $custom_author_id = $_GET['custom_author'];

            // Фильтруем посты по автору
            $query->set('author', $custom_author_id);
        }
    }
}


function custom_search_rewrite_rule()
{
    add_rewrite_rule(
        '^search/$',
        'index.php?s=' . get_query_var('s'),
        'top'
    );
    add_rewrite_rule('^search/?$', 'index.php?s=', 'top');

    add_rewrite_rule('^search/page/([0-9]+)/?$', 'index.php?s=&paged=$matches[1]', 'top');
}
add_action('init', 'custom_search_rewrite_rule');

add_filter('relevanssi_hits_filter', 'rlv_gather_categories', 99);
function rlv_gather_categories($hits)
{
    global $rlv_categories_present;
    $rlv_categories_present = array();
    foreach ($hits[0] as $hit) {
        $terms = get_the_terms($hit->ID, 'category');
        if (is_array($terms)) {
            foreach ($terms as $term) {
                $rlv_categories_present[$term->term_id] = $term->name;
            }
        }
    }
    asort($rlv_categories_present);
    return $hits;
}

function plural_form_extended($number, $forms, $additionalWord = '')
{
    $cases = array(2, 0, 1, 1, 1, 2);
    $index = ($number % 100 > 4 && $number % 100 < 20) ? 2 : $cases[min($number % 10, 5)];

    // Склонение дополнительного слова, если оно передано
    $additionalForm = '';
    if ($additionalWord) {
        $additionalIndex = $index > 0 ? 1 : 0; // Простая логика для "найдено"
        $additionalForm = $additionalWord[$additionalIndex] . ' ';
    }

    return $additionalForm . $number . ' ' . $forms[$index];
}

add_filter('wpseo_breadcrumb_links', 'custom_search_breadcrumbs');

function custom_search_breadcrumbs($links)
{
    if (is_search()) {
        // Получаем поисковый запрос
        $search_query = get_search_query();

        // Перебираем все ссылки, чтобы найти и изменить нужный элемент
        foreach ($links as &$link) {
            if (strpos($link['text'], 'Результаты поиска') !== false) {
                if ($search_query === "") {
                    $link['text'] = 'Поиск';
                } else {
                    $link['text'] = 'Результаты поиска для запроса "' . esc_html($search_query) . '"';
                }
                $link['url'] = home_url('/search/') . urlencode($search_query) . '/';
                break; // Прерываем цикл после изменения нужного элемента
            }
        }
        unset($link);
    }

    return $links;
}

function include_future_posts_in_date_archive($query)
{
    // Убедимся, что мы находимся в основном запросе и на странице архива по дате
    if ($query->is_main_query() && $query->is_date()) {
        // Изменяем запрос так, чтобы он включал посты с датой публикации в будущем
        $query->set('post_status', array('publish', 'future'));
    }
}
add_action('pre_get_posts', 'include_future_posts_in_date_archive');


function template_500_error($template)
{
    // Проверяем, является ли текущая страница страницей ошибки 500
    if (is_500()) {
        return get_stylesheet_directory() . '/500.php'; // Путь к вашему собственному шаблону 500 ошибки
    }
    return $template;
}
add_filter('template_include', 'template_500_error');

function is_500()
{
    // Проверяем, является ли текущий код состояния HTTP 500
    return get_query_var('error', false) === 500;
}

function change_image_size_dimensions()
{
    update_option('large_size_w', 1080);
    update_option('large_size_h', 0);

    update_option('medium_size_w', 400);
    update_option('medium_size_h', 0);
}

add_action('init', 'change_image_size_dimensions');

add_filter('big_image_size_threshold', '__return_false');

function auto_add_category_by_slug_to_new_post($post_ID, $post, $update)
{
    $category_slug = 'all-events'; // Slug рубрики для добавления
    $category = get_term_by('slug', $category_slug, 'category');

    // Если рубрика с таким slug существует
    if ($category && !has_category($category->term_id, $post_ID)) {
        wp_set_post_categories($post_ID,  array($category->term_id), true);
    }
}
//add_action('save_post', 'auto_add_category_by_slug_to_new_post', 10, 3);


function get_category_name($post = null)
{
    $categories = get_the_category($post);
    $categories = array_filter($categories, function (WP_Term $category) {
        return $category->slug !== 'all-events';
    });
    $categories = array_values($categories);
    $category_name = !empty($categories) ? esc_html($categories[0]->name) : 'Все события';

    return $category_name;
}


/**
 * Получает полный URL категории (с учётом иерархии)
 * 
 * @param int|WP_Post|null $post ID поста, объект или null (текущий пост)
 * @return string Полный URL категории (включая родительские) или URL архива по умолчанию
 */
function get_category_url($post = null) {
    // Получаем все категории поста
    $categories = get_the_category($post);

    if (empty($categories) || is_wp_error($categories)) {
        return '';
    }

    // Фильтруем категории, исключая слаг 'all-events'
    $filtered_categories = array_filter($categories, function ($category) {
        return $category instanceof WP_Term && $category->slug !== 'all-events';
    });

    if (!empty($filtered_categories)) {
        // Берём первую подходящую категорию
        $first_category = reset($filtered_categories);

        // Получаем ссылку по всем правилам WordPress
        $category_url = get_category_link($first_category->term_id);

        // Возвращаем безопасный URL
        return esc_url($category_url);
    }

    return '';
}


function get_category_name_en($post = null)
{
    $categories = get_the_category($post);
    $categories = array_filter($categories, function (WP_Term $category) {
        return $category->slug !== 'en';
    });
    $categories = array_values($categories);
    $category_name = !empty($categories) ? esc_html($categories[0]->name) : 'Все события';

    return $category_name;
}


function custom_meta_tags() {

    $sitename = get_bloginfo('name');
    $meta_tags = '';
    $og_tags = '';

    $og_tags .= '<meta property="og:locale" content="ru_RU">' . PHP_EOL;
    $og_tags .= '<meta property="og:site_name" content="' . esc_html($sitename) . '">' . PHP_EOL;

    $paged = get_query_var('paged') ? get_query_var('paged') : 1;

    if (is_home() || is_front_page()) {
        $title = 'Федеральное издание «Агроэксперт» - новости в сфере сельского хозяйства России';
        $description = get_bloginfo('description');

        $meta_tags .= '<title>' . esc_html($title) . '</title>' . PHP_EOL;
        $meta_tags .= '<meta itemprop="description" name="description" content="' . esc_attr($description) . '">' . PHP_EOL;
        $og_tags .= '<meta property="og:title" content="' . esc_html($title) . '" />' . PHP_EOL;
        $og_tags .= '<meta property="og:description" content="' . esc_attr($description) . '" />' . PHP_EOL;

    } elseif (is_category() || is_tag()) {
        $term = get_queried_object();
        $canonical_url = get_term_link($term);

        //if ($paged > 1) {
            $meta_tags .= '<link rel="canonical" href="' . esc_url($canonical_url) . '" />' . PHP_EOL;
       // }

        $title = $term->name . ' - ' . $sitename;
        $description = !empty(trim($term->description)) ? $term->description : $term->name;

        if ($paged > 1) {
            $title .= ', страница ' . $paged;
            $description .= '. Страница ' . $paged;
        }

        $og_tags .= '<meta property="og:url" content="' . esc_url($canonical_url) . '" />' . PHP_EOL;
        $meta_tags .= '<title itemprop="headline">' . esc_html($title) . '</title>' . PHP_EOL;
        $meta_tags .= '<meta itemprop="description" name="description" content="' . esc_attr($description) . '">' . PHP_EOL;
        $og_tags .= '<meta property="og:title" content="' . esc_html($title) . '" />' . PHP_EOL;
        $og_tags .= '<meta property="og:description" content="' . esc_attr($description) . '" />' . PHP_EOL;
        
    }   elseif (is_author()) {
            $author = get_queried_object();
            $author_name = $author->display_name;
            $author_description = get_the_author_meta('description', $author->ID);
            $canonical_url = get_author_posts_url($author->ID);
        
            $title = 'Материалы автора ' . $author_name . ' - ' . $sitename;
            $description = !empty($author_description) ? $author_description : 'Материалы, опубликованные автором ' . $author_name;
        
            $meta_tags .= '<title>' . esc_html($title) . '</title>' . PHP_EOL;
            $meta_tags .= '<meta itemprop="description" name="description" content="' . esc_attr($description) . '">' . PHP_EOL;
            $meta_tags .= '<meta name="author" content="' . esc_attr($author_name) . '">' . PHP_EOL;

            $meta_tags .= '<link rel="canonical" href="' . esc_url($canonical_url) . '" />' . PHP_EOL;
        
            $og_tags .= '<meta property="og:url" content="' . esc_url($canonical_url) . '" />' . PHP_EOL;
            $og_tags .= '<meta property="og:title" content="' . esc_html($title) . '" />' . PHP_EOL;
            $og_tags .= '<meta property="og:description" content="' . esc_attr($description) . '" />' . PHP_EOL;
     
    } elseif (is_single() || is_page()) {
        $post = get_queried_object();

        if (is_page('kontakty')) { //конкретные страницы
            $title = get_the_title($post).' '. $sitename;
        } else {
            $title = get_the_title($post) . ' - ' . $sitename;    
        }   
        
        $description = has_excerpt($post) ? get_the_excerpt($post) : wp_trim_words(strip_shortcodes($post->post_content), 30);

        $og_tags .= '<meta property="og:url" content="' . esc_url($canonical_url) . '" />' . PHP_EOL;
        $meta_tags .= '<title itemprop="headline">' . esc_html($title) . '</title>' . PHP_EOL;
        $meta_tags .= '<meta itemprop="description" name="description" content="' . esc_attr($description) . '">' . PHP_EOL;

        $custom_keywords = get_post_meta($post, 'meta_keywords', true);
        if ($custom_keywords) {
            $meta_tags .= '<meta itemprop="keywords" name="keywords" content="' . esc_attr($custom_keywords) . '">';
        }


        $og_tags .= '<meta property="og:title" content="' . esc_html($title) . '" />' . PHP_EOL;
        $og_tags .= '<meta property="og:description" content="' . esc_attr($description) . '" />' . PHP_EOL;

        // Добавляем изображение текущего поста
        if (has_post_thumbnail()) {

            $post_id = get_the_ID();
            $image_id = get_post_thumbnail_id($post_id);

            $image_data = wp_get_attachment_image_src($image_id, 'full');
            if ($image_data) {
                $og_tags .= '<meta property="og:image:width" content="' . esc_attr($image_data[1]) . '" />' . PHP_EOL;
                $og_tags .= '<meta property="og:image:height" content="' . esc_attr($image_data[2]) . '" />' . PHP_EOL;
            }

            $og_image = get_the_post_thumbnail_url($post_id, 'full');
            $og_tags .= '<meta property="og:image" content="' . esc_url($og_image) . '" />' . PHP_EOL;
            $og_tags .= '<meta name="twitter:card" content="summary_large_image">';
            $og_tags .= '<meta name="twitter:image" content="' . esc_url($og_image) . '">';

        }
    
    }

    echo $meta_tags;
    echo $og_tags;
}

add_action('wp_head', 'custom_meta_tags');




add_action('wpcf7_before_send_mail', 'my_custom_contact_form_handler', 10, 3);
function my_custom_contact_form_handler($contact_form, $abort, $submission) {



    // Получаем ID формы
    $form_id = $contact_form->id();


    if ( $form_id == '0ddb83c' ) {

        // Получаем данные формы
        $submission = WPCF7_Submission::get_instance();

        if ($submission) {

            $posted_data = $submission->get_posted_data();

            // Подключаемся к базе данных WordPress
            global $wpdb;

            // Определяем таблицу в базе данных WordPress в зависимости от ID формы
            $table_name = $wpdb->prefix . 'subusers';

            $wpdb->insert(
                $table_name,
                array(
                    'mail' =>  $posted_data['your-email'],
                    'status' => 0,
                    'date' => current_time('mysql')
                ),
                array(
                    '%s', // Формат для строкового поля
                    '%d', // Формат для цифрового поля
                    '%s' // Формат для поля с датой и временем
                )
            );

        }
    }

}

function last_sticky_post() {

    //$pinned_post = get_field('pinned_post', 'options');

    static $last = null; // array to pinned post

    if ( $last !== null){
        return $last;
    }

    $sticky_posts = array_reverse(get_option('sticky_posts'));

    $published_sticky_posts = array();

    foreach ($sticky_posts as $post_id) {
        $post = get_post($post_id);
        if ($post->post_status == 'publish') {
            //$published_sticky_posts[] = $post_id;
            $last = $post;
            break; // Выходим из цикла, так как нашли последний опубликованный закрепленный пост
        }
    }

    return $last;

}



function get_latest_sticky_post_by_category($category_id) {
    // Получение всех закрепленных постов
    $sticky_posts = get_option('sticky_posts');

    if (empty($sticky_posts)) {
        return null;
    }

    // Получение всех постов, которые включены в закрепленные посты
    $args = array(
        'post__in' => $sticky_posts,
        'posts_per_page' => -1, // Получаем все закрепленные посты
        'ignore_sticky_posts' => 1, // Игнорируем параметры отображения закрепленных постов
    );

    $posts = get_posts($args);

    // Получаем ID всех подрубрик рубрики
    $category_ids = get_term_children($category_id, 'category');
    $category_ids[] = $category_id; // Включаем основную рубрику

    // Фильтрация постов по категории и её подрубрикам
    $filtered_posts = array_filter($posts, function($post) use ($category_ids) {
        $post_categories = wp_get_post_categories($post->ID);
        return array_intersect($post_categories, $category_ids);
    });

    if (empty($filtered_posts)) {
        return null;
    }

    // Сортировка постов по дате в обратном порядке
    usort($filtered_posts, function($a, $b) {
        return strtotime($b->post_date) - strtotime($a->post_date);
    });

    // Возвращаем самый последний пост
    return $filtered_posts[0];
}

// отправка писем через свой почтовый сервис
function agroxpert_send_smtp_email( $phpmailer ) {

    $phpmailer->isSMTP();
    $phpmailer->Host       = 'mail.vetandlife.ru';
    $phpmailer->SMTPAuth   = true;
    $phpmailer->Port       = 465;
    $phpmailer->Username   = 'news@mail.agroexpert.press';
    $phpmailer->Password   = 'O6K!]aZDNJ';
    $phpmailer->SMTPSecure = 'ssl';
    $phpmailer->From       = 'news@mail.agroexpert.press';
    $phpmailer->FromName   = 'Агроэксперт';

}

add_action( 'phpmailer_init', 'agroxpert_send_smtp_email' );


// Принудительно меняем email отправителя
add_filter('wp_mail_from', function($email) {
    return 'news@mail.agroexpert.press';
});




function my_custom_mail_sent( $contact_form ){

    $log_file = WP_CONTENT_DIR . '/contact.log';

    $form_id = $contact_form->id();

    //if ( $form_id == '19' ) {

        $submission = WPCF7_Submission::get_instance();
        $posted_data = $submission->get_posted_data();

        $mail = $posted_data['your-email'];

        global $wpdb;
        $table_name = $wpdb->prefix . 'subusers';
        $hash = md5('775+'.$mail);

        $query = $wpdb->prepare("SELECT * FROM $table_name WHERE mail = %s", $mail);
        $result = $wpdb->get_row($query);

        if ( !$result ) {  //аdd to table

            $result = $wpdb->insert(
                $table_name,
                array(
                    'mail' => $mail,
                    'status' => 0,
                    'date' => current_time('mysql'),
                    'hash' => $hash,
                ),
                array(
                    '%s',
                    '%d',
                    '%s',
                    '%s'
                )
            );
        }


   // }


   $hash_link = home_url().'/subscript?id='.$hash;
    $subject = 'Подписка на рассылку АгроЭксперт';
   $message = "
Здравствуйте!\n
Для подтверждения подписки на рассылку издания «АгроЭксперт» перейдите по ссылке ниже:\n
$hash_link.\n\n
Если вы не отправляли заявку просто проигнорируйте это письмо.";

   $headers = array('Content-Type: text/plain; charset=UTF-8');

   // Отправка письма
   wp_mail($mail, $subject, $message, $headers);

    return;

}

add_action('wpcf7_mail_sent', 'my_custom_mail_sent' );

/**
 *
 */

 if (!function_exists('view')){
    function view ($view, $data = array(), $layer = null){

	ob_start();

    if (is_array($data))
        extract($data);
    	if ($layer !== null){
            $content = view($view, $data);
            require $layer;
        }
        else
            require $view;

    return trim(ob_get_clean());

    }
}


//все рубрики англ версии
function get_expression_en( $str = false ) {

    #cache result
    static $res = null;


    if ($res !== null) {
        return $res;
    }

    $parent_cat_id = 740;

    // Получаем все подрубрики данной рубрики
    $subcategories = get_terms(array(
        'taxonomy' => 'category',
        'child_of' => $parent_cat_id,
        'hide_empty' => false,
        'fields' => 'ids'
    ));

    // Добавляем ID родительской рубрики в начало массива подрубрик
    array_unshift($subcategories, $parent_cat_id);

    $res = $subcategories;

    return $res;


}



// возвращаем все исключенные рубрики
function get_expression_parts() {

    #cache result
    static $res = null;


    if ($res !== null) {
        return $res;
    }

    $subcategories_en = get_expression_en();
    $additional_excludes = [ '17', '20', '21', $parent_cat_id ];


    $all_excludes = array_merge( $additional_excludes, $subcategories_en );
    $res = implode(',', $all_excludes);

    // Преобразуем массив ID в строку, разделенную запятыми
    return  $res;

}


function get_priority_category_en($post_id = null) {

    if ($post_id === null) {
        $post_id = get_the_ID();
    }

    // Получаем массив категорий поста
    $categories = get_the_category($post_id);

    if (empty($categories)) {
        return null;
    }

    $en_category = null;

    // Проходим по всем категориям поста
    foreach ($categories as $category) {
        // Проверяем, содержит ли название категории 'en'
        if (stripos($category->name, 'en') !== false) {
            $en_category = $category->name;
        } else {
            // Если нашли категорию, не содержащую 'en', возвращаем её название
            return $category->name;
        }
    }

    // Если нет категорий, кроме 'en', возвращаем категорию 'en'
    return $en_category;
}



// рубрики английской версии
function use_custom_template_for_en_subcategories($template) {


    if (is_category()) {
        $category = get_queried_object();

        if ($category->term_id == 762) { //parthers
            $new_template = locate_template('en/category-partners-en.php');
            if ($new_template) {
                return $new_template;
            }
        }

        // Проверяем, является ли текущая категория подрубрикой "EN"
        $parent_id = $category->parent;
        if ($parent_id && $parent_id == get_cat_ID('EN')) {

            define('LANG', 'en');

            // Устанавливаем путь к вашему новому шаблону
            $new_template = locate_template('en/category-en-sub.php');
            if ($new_template) {
                return $new_template;
            }
        }
    } else if (is_single()) {
        $categories = get_the_category();

        foreach ($categories as $category) {
            // Проверяем, является ли текущая категория или ее родительская категория "EN"
            if ($category->term_id == get_cat_ID('EN') || $category->parent == get_cat_ID('EN')) {
                // Устанавливаем путь к вашему новому шаблону
                $new_template = locate_template('single-en.php');
                if ($new_template) {
                    return $new_template;
                }
            }
        }
    }

    return $template;
}

add_filter('template_include', 'use_custom_template_for_en_subcategories');


/**
 * update rubrics
*/

 function add_posts_to_category_744() {
    // Получаем ID рубрики 740 и всех ее подрубрик
    $parent_category_id = 740;
    $subcategories = get_categories(array(
        'child_of' => $parent_category_id,
        'hide_empty' => false
    ));

    // Массив ID всех подрубрик 740
    $subcategory_ids = wp_list_pluck($subcategories, 'term_id');
    $all_category_ids = array_merge(array($parent_category_id), $subcategory_ids);

    // Запрос для получения постов, которые имеют рубрику 740 или любую из ее подрубрик
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => -1,
        'tax_query' => array(
            array(
                'taxonomy' => 'category',
                'field' => 'term_id',
                'terms' => $all_category_ids,
                'operator' => 'IN'
            ),
        ),
    );

    // Получаем все посты с указанной рубрикой или ее подрубриками
    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();

            // Получаем ID текущего поста
            $post_id = get_the_ID();

            // Получаем все рубрики текущего поста
            $post_categories = wp_get_post_categories($post_id);

            // Проверяем, есть ли у поста только рубрика 740
            if (count($post_categories) == 1 && in_array($parent_category_id, $post_categories)) {
                // Добавляем пост в рубрику с ID 744
                wp_set_post_categories($post_id, array_merge($post_categories, array(744)));
            } else {
                // Проверяем, если у поста есть подрубрика 740, но нет основной рубрики 740
                $has_subcategory = array_intersect($post_categories, $subcategory_ids);
                if ($has_subcategory && !in_array($parent_category_id, $post_categories)) {
                    // Добавляем основную рубрику 740
                    wp_set_post_categories($post_id, array_merge($post_categories, array($parent_category_id)));
                }
            }
        }
        // Сбрасываем пост данные
        wp_reset_postdata();
    }
}


/**
function add_custom_admin_menu() {
    add_menu_page(
        'Update Posts Categories', // Заголовок страницы
        'Update Categories EN',       // Текст меню
        'manage_options',          // Возможность доступа (только администраторы)
        'update-categories',       // Уникальный идентификатор страницы
        'update_categories_callback' // Функция для отображения контента страницы
    );
}


add_action('admin_menu', 'add_custom_admin_menu');*/

function add_custom_admin_menu() {
    add_submenu_page(
        'tools.php',                 // Родительское меню (в данном случае "Инструменты")
        'Update Posts Categories',   // Заголовок страницы
        'Update Categories EN',      // Текст меню
        'manage_options',            // Возможность доступа (только администраторы)
        'update-categories',         // Уникальный идентификатор страницы
        'update_categories_callback' // Функция для отображения контента страницы
    );
}

add_action('admin_menu', 'add_custom_admin_menu');


function update_categories_callback() {
    if (isset($_POST['update_categories'])) {
        add_posts_to_category_744();
        echo '<div class="updated"><p>Posts have been updated successfully.</p></div>';
    }
    ?>
    <div class="wrap">
        <h1>Update Posts Categories</h1>
        <form method="post">
            <input type="hidden" name="update_categories" value="1">
            <p>
                <input type="submit" class="button-primary" value="Update Categories">
            </p>
        </form>
    </div>
    <?php
}

//скрываем рекламный аккаунт
function change_author_name($author) {
    $original_author = 'Анна Купровская'; //рекламный аккаунт
    $new_author = 'agroexpert.press';

    if ($author === $original_author) {
        echo $author;
        return $new_author;
    }

    return $author;
}
add_filter('the_author', 'change_author_name');

// подписчики на главную
//add_action('admin_init', 'restrict_subscriber_admin_access');
function restrict_subscriber_admin_access() {
    // Проверяем, что пользователь вошел в систему и имеет роль 'subscriber'
    if (current_user_can('subscriber')) {
        // Перенаправляем на главную страницу сайта
        wp_redirect(home_url());
        exit;
    }
}

//авторы только в черновики
function restrict_author_publish_posts( $data ) {
    // Проверяем, что текущий пользователь - автор
    if ( current_user_can( 'author' ) && $data['post_status'] == 'publish' ) {
        // Отключаем публикацию для авторов
        $data['post_status'] = 'draft'; // Сохраняем как черновик
    }
    return $data;
}
add_filter( 'wp_insert_post_data', 'restrict_author_publish_posts' );

function replace_first_figure_in_content($content) {
    
    global $post;

    if (!isset($post->ID)) {
        return $content;
    }

    $startPos = strpos($content, '<figure');
    if ($startPos === false) {
        return $content; // Если <figure> не найдено, возвращаем исходный контент
    }

    $endPos = strpos($content, '</figure>', $startPos);
    if ($endPos === false) {
        return $content; // Если </figure> не найдено, возвращаем исходный контент
    }

    // Рассчитываем длину части, которую нужно заменить
    $endPos += strlen('</figure>'); // Двигаем указатель на конец тега </figure>
    $figureHtml = substr($content, $startPos, $endPos - $startPos);


    // Генерируем HTML изображения
    $replacement = render_webp_picture_by_post($post->ID);

    // Ищем <figcaption> внутри исходного фрагмента
    $caption = '';
    if (preg_match('/<figcaption.*?>(.*?)<\/figcaption>/is', $content, $caption_match)) {
        $caption = '<div class="image-caption">'.$caption_match[1].'</div>'; // только содержимое
    }

    $replacement .= $caption;

    // Заменяем найденный кусок на новый HTML
    $newContent = substr_replace($content, $replacement, $startPos, $endPos - $startPos);


    return $newContent;

    
    // Ищем первое <figure>...</figure>
    if (preg_match('/<figure.*?>.*?<\/figure>/is', $content, $match)) {
        $original_figure = $match[0];

        // Извлекаем <figcaption> (если есть)
        $caption = '';
        if (preg_match('/<figcaption.*?>(.*?)<\/figcaption>/is', $original_figure, $caption_match)) {
            $caption = $caption_match[1]; // только содержимое
        }

        // Генерируем HTML изображения
        $replacement = render_webp_picture_by_post($post->ID);

        // Добавляем подпись, если есть
        if (!empty($caption)) {
            $replacement .= '<div class="image-caption">' . esc_html($caption) . '</div>';
        }

        // Заменяем первое вхождение <figure>...</figure> на $replacement
        $content = preg_replace('/<figure.*?>.*?<\/figure>/is', $replacement, $content, 1);
    }

    return $content;
}

function delete_first_figure_in_content($content) {
    
    global $post;

    if (!isset($post->ID)) {
        return $content;
    }

    $startPos = strpos($content, '<figure');
    if ($startPos === false) {
        return $content; // Если <figure> не найдено, возвращаем исходный контент
    }

    $endPos = strpos($content, '</figure>', $startPos);
    if ($endPos === false) {
        return $content; // Если </figure> не найдено, возвращаем исходный контент
    }

    // Рассчитываем длину части, которую нужно заменить
    $endPos += strlen('</figure>'); // Двигаем указатель на конец тега </figure>
    $figureHtml = substr($content, $startPos, $endPos - $startPos);

    // Заменяем найденный кусок на новый HTML
    $newContent = substr_replace($content, '', $startPos, $endPos - $startPos);


    return $newContent;

}    



function add_cookie_consent() {
    if (!isset($_COOKIE['cookie_consent_accepted'])) {
        get_template_part('cookie-consent');
    }
}
add_action('wp_footer', 'add_cookie_consent');


/**
 * убираем рубрики - Смена (7)
 */

// Для стандартного метабокса (классический редактор и часть Гутенберга)
add_filter('get_terms', function($terms, $taxonomies, $args) {
    global $pagenow;
    if (($pagenow === 'post.php' || $pagenow === 'post-new.php') && in_array('category', $taxonomies)) {
        $exclude_ids = [7, 740, 741, 742, 743, 744, 745, 746, 762]; // ID рубрик, которые нужно скрыть
        $terms = array_filter($terms, fn($term) => !in_array($term->term_id, $exclude_ids));
    }
    return $terms;
}, 10, 3);

// Для REST API (панель справа в редакторе Gutenberg)
add_filter('rest_category_query', function($args, $request) {
    $args['exclude'] = [7, 740, 741, 742, 743, 744, 745, 746, 762]; // Те же ID, что и выше
    return $args;
}, 10, 2);


/**
 * Рассчитывает время чтения поста (в минутах) со склонением слова "минута"
 * 
 * @param int|null $post_id ID поста. Если null, используется текущий пост в цикле.
 * @param bool $include_text Нужно ли добавлять "мин." или полный текст (по умолчанию true)
 * @return string Пример: "5 минут" или "1 минута"
 */
function calculate_reading_time($post_id = null, $include_text = true) {
    // Если ID поста не передан, пытаемся определить текущий пост
    if ($post_id === null) {
        global $post;
        
        if (!isset($post) || !is_a($post, 'WP_Post')) {
            return $include_text ? '0 минут' : '0';
        }
        
        $post_id = $post->ID;
    }

    $content = get_post_field('post_content', $post_id);
    
    if (empty($content)) {
        return $include_text ? '0 минут' : '0';
    }

    $word_count = str_word_count(strip_tags($content));
    //$reading_speed = apply_filters('reading_time_speed', 200); // Фильтр для изменения скорости
    $reading_speed = 200;
    $reading_time = ceil($word_count / $reading_speed);
    $reading_time = max(1, $reading_time); // Минимум 1 минута

    // Склонение слова "минута"
    $minutes_text = 'минут';
    $last_digit = $reading_time % 10;
    $last_two_digits = $reading_time % 100;

    if ($last_digit == 1 && $last_two_digits != 11) {
        $minutes_text = 'минута';
    } elseif (($last_digit >= 2 && $last_digit <= 4) && !($last_two_digits >= 12 && $last_two_digits <= 14)) {
        $minutes_text = 'минуты';
    }

    return $include_text 
        ? sprintf('%d %s', $reading_time, $minutes_text)
        : $reading_time;
}














