Ростислав Шацкий

Ростислав Шацкий
Рейтинг
13
Регистрация
20.10.2022
Должность
Предприниматель, Маркетолог-аналитик
Интересы
Игра на фортепиано, решать сложные задачи
zorky #:

Я чуть подправил, чтоб в адмике смотреть можно было

Matatum #:

Спасибо за идею. Сделал. Удобно и полезно.

Только у себя поменял время на мое местное и добавил еще реферер и браузер 

И в строке

помимо добавлений реферера и браузера  поменял IP: ([\d.]+)  на IP: (.+) чтобы видеть еще и адреса  IPv6

Круто мужики! 🔥 Объединил и добавил вывод  второй таблицы в панельке "лог посещений", которая считает и показывает количество визитов на уникальный ip:

// Отслеживание
// Создаем функцию для записи данных посетителей
function log_visitor_info() {
    $log_file = ABSPATH . 'visitor_log.txt'; // Путь к файлу лога

    $current_date_time = date('Y-m-d H:i:s'); // Текущая дата и время
    $visitor_ip = $_SERVER['REMOTE_ADDR']; // IP-адрес посетителя
    $current_page = $_SERVER['REQUEST_URI']; // Текущая посещенная страница

    // Запись в лог
    $log_entry = "$current_date_time - IP: $visitor_ip, Page: $current_page\n";

    // Открываем файл в режиме добавления
    $file_handle = fopen($log_file, 'a');
    
    if ($file_handle) {
        fwrite($file_handle, $log_entry);
        fclose($file_handle);
    }
}
// Добавляем хук, чтобы записывать данные при каждом запросе
add_action('wp', 'log_visitor_info');

// Создаем страницу в меню "Инструменты"
function custom_logs_page() {
    add_submenu_page(
        'tools.php',
        'Лог посещений',
        'Лог посещений',
        'manage_options',
        'visitor-log',
        'render_visitor_log_page'
    );
}
add_action('admin_menu', 'custom_logs_page');

// Функция для подсчета уникальных IP и их повторений
function count_unique_ips($log_entries) {
    $ip_counts = [];

    foreach ($log_entries as $entry) {
        if (!empty($entry)) {
            preg_match('/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - IP: (.+), Page: (.+)/', $entry, $matches);
            if (count($matches) === 4) {
                $ip = $matches[2];
                if (isset($ip_counts[$ip])) {
                    $ip_counts[$ip]++;
                } else {
                    $ip_counts[$ip] = 1;
                }
            }
        }
    }

    return $ip_counts;
}

// Функция для вывода таблицы лога на странице
function render_visitor_log_page() {
    // Получаем данные из файла лога
    $log_file = ABSPATH . 'visitor_log.txt';
    $log_content = file_get_contents($log_file);
    
    // Разбиваем записи по строкам
    $log_entries = explode("\n", $log_content);

    // Выводим страницу админки
    echo '<div class="wrap">';
    echo '<h2>Лог посещений</h2>';
    
    // Загружаем стили WordPress для таблиц
    wp_enqueue_style('wp-admin');
    
    // Выводим таблицу с данными + IPv6
    echo '<table class="widefat">';
    echo '<thead><tr><th>Дата и время</th><th>IP-адрес</th><th>Посещенная страница</th></tr></thead>';
    echo '<tbody>';
    foreach ($log_entries as $entry) {
        if (!empty($entry)) {
            preg_match('/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - IP: (.+), Page: (.+)/', $entry, $matches);
            if (count($matches) === 4) {
                list(, $date_time, $ip, $page) = $matches;
                echo "<tr><td>$date_time</td><td>$ip</td><td>$page</td></tr>";
            }
        }
    }
    echo '</tbody>';
    echo '</table>';

    // Выводим таблицу с уникальными IP
    $unique_ips = count_unique_ips($log_entries);

    echo '<h3>Уникальные IP-адреса</h3>';
    echo '<table class="widefat">';
    echo '<thead><tr><th>IP-адрес</th><th>Количество визитов</th></tr></thead>';
    echo '<tbody>';
    foreach ($unique_ips as $ip => $count) {
        echo "<tr><td>$ip</td><td>$count</td></tr>";
    }
    echo '</tbody>';
    echo '</table>';

    // Добавляем кнопку очистки лога
    echo '<form method="post">';
    echo '<p><input type="submit" name="clear_log" class="button button-primary" value="Очистить лог"></p>';
    echo '</form>';

    if (isset($_POST['clear_log'])) {
        clear_visitor_log();
        echo '<div class="updated"><p>Лог посещений очищен.</p></div>';
    }
    
    echo '</div>'; // Закрываем div.wrap
}

// Функция для очистки лога
function clear_visitor_log() {
    $log_file = ABSPATH . 'visitor_log.txt';
    
    // Открываем файл в режиме записи и обрезаем его до нулевой длины
    $file_handle = fopen($log_file, 'w');
    if ($file_handle) {
        fclose($file_handle);
    }
}

Проще стало вычислять 😁

Может быть, кому-то принесет пользу мой подход к реализации на Wordpress: 🙏

1. Написал сниппет:
// Создаем функцию для записи данных посетителей
function log_visitor_info() {
    $log_file = ABSPATH . 'visitor_log.txt'; // Путь к файлу лога

    $current_date_time = date('Y-m-d H:i:s'); // Текущая дата и время
    $visitor_ip = $_SERVER['REMOTE_ADDR']; // IP-адрес посетителя
    $current_page = $_SERVER['REQUEST_URI']; // Текущая посещенная страница

    // Запись в лог
    $log_entry = "$current_date_time - IP: $visitor_ip, Page: $current_page\n";

    // Открываем файл в режиме добавления
    $file_handle = fopen($log_file, 'a');
    
    if ($file_handle) {
        fwrite($file_handle, $log_entry);
        fclose($file_handle);
    }
}

// Добавляем хук, чтобы записывать данные при каждом запросе
add_action('wp', 'log_visitor_info');
2. Отслеживание
Далее,если в метрике вижу много прямых заходов, то отслеживаю и сопоставляю с логами "visitor_log.txt", создаваемый сниппетом, в корне сайта

3. Блокирую

В файле .htaccess, в корне сайта, добавляю строки с подозрительными ip

deny from ххх.хх.хх.ххх
Коллеги, всех благодарю за поддержку! В целом, вектор развития мысли и идей понятен. Буду писать решение  под свои нужды.
Ростислав Шацкий #:
Сейчас просмотрю его топики по профилю, однако могу предположить, что его инфо-поле выходит за рамки данного форума и искать нужно где-то еще данную инфу. Есть прямая ссылка, где он описывает метод? или это информация из уст в уста?

Пардон за невнимательность, divv описывал метод в этом топике 😂 Вопрос снят!

SeVlad #:
Вот видишь как полезно читать логи :)

Поддерживаю и благодарю! Прибрел новый навык - читать логи😅 

SeVlad #:
Рассказанный divv-ом способ

Сейчас просмотрю его топики по профилю, однако могу предположить, что его инфо-поле выходит за рамки данного форума и искать нужно где-то еще данную инфу. Есть прямая ссылка, где он описывает метод? или это информация из уст в уста?


Попалась информация в видео (https://www.youtube.com/watch?v=fwVYN5dKdpA) по поводу мультирегиональников, хотя это и не касается вопроса оптимизации и автоматизации развертывания, однако расширило кругозор и натолкнуло на понимание, что моя модель/структура МР не корректна для поставленных задач.

SeVlad #:
Если ты внятно опишешь что за сайт, какие задачи возложены на мультирегиональность и тд - возможно сможем подсказать более оптимальное решение.

Отправлю в личку ссылку и описание.

menn #:

а все таки для статейника, что лучше? Если ручной перевод всех статей?

Поддерживаю слова SeVlad -  WPML заслуживает внимания. Не однократно это решение упомянают те, кто с мультиязычных сеток нормально извлекают прибыль.

SeVlad #:
А я думал ошибки всё же покажешь.. Но нет так нет.

Доброго Всем дня) 
Ошибка была связана с выделенной памятью, забыл конкретно на этом сайте прописать. 😂 Добавил строки в  wp-config и php.ini ->> теперь все гуд!

divv #:

Да, это один сайт, один набор городов, рубрик, меток и т.д.

Подмена города для шаблонных страниц (одинаковых для всех городов) через шорткоды или свои расставленные макросы.

Нужно только на всех страницах сверять на наличие города в базе, т.е. из адреса site.ru/msk/ или site.ru/msk /page, получать из урл msk, сверять его с базой и если есть, то менять контент на странице под этот город. по сути это одна функция, которую можно везде использовать , в том числе для создания шоркодов.


Реализация в целом зависит от самого сайта. Либо это как доска объявлений, где каждое объявление привязано только к одному городу и должно отображаться только в этом городе. Либо это как интернет-магазин, где обычно товары во всех городах одинаковые и меняется только сео и контакты.

Огромное спасибо!👍 Кругозор расширен, однозначно. Буду воплощать, тк упростит жизнь 100%))

divv #:

Давно уже делал на поддоменах и на разделах.

Если на разделах, то  в wp-config.php нужно принудительно менять адрес сайта

define( 'WP_HOME', 'http://site.ru/msk');


Но до этой строчки, на сколько я помню, там был массив всех городов, функция получения адреса текущей страницы и города из урл, сравнение его с массивом.


Список городов добавлялся в произвольном типе записей.

Если нужна фильтрация для записей для каждого города своя, то при публикации нужно выбирать еще и город.

Там еще какие-то заморочки были по типу страниц контактов для разных городов. Но это проще чем мультисайт.

Скажите, я правильно понимаю, что речь идет об одном сайте, в архитектурное древо которого закладываются города как тип записи? Далее документ(ы) могут открываться через город и иметь свою оптимизацию под поиск? А если в контенте(тексте) документа требуется подмена города? Как то завязывать на тип записи..?

В любом случае, благодарю за обратную связь! 🙏
Всего: 49