Я чуть подправил, чтоб в адмике смотреть можно было
Спасибо за идею. Сделал. Удобно и полезно.
Только у себя поменял время на мое местное и добавил еще реферер и браузер
И в строке
помимо добавлений реферера и браузера поменял 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); }}
Проще стало вычислять 😁
// Создаем функцию для записи данных посетителей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');
В файле .htaccess, в корне сайта, добавляю строки с подозрительными ip
deny from ххх.хх.хх.ххх
Пардон за невнимательность, divv описывал метод в этом топике 😂 Вопрос снят!
Поддерживаю и благодарю! Прибрел новый навык - читать логи😅
Сейчас просмотрю его топики по профилю, однако могу предположить, что его инфо-поле выходит за рамки данного форума и искать нужно где-то еще данную инфу. Есть прямая ссылка, где он описывает метод? или это информация из уст в уста?
Попалась информация в видео (https://www.youtube.com/watch?v=fwVYN5dKdpA) по поводу мультирегиональников, хотя это и не касается вопроса оптимизации и автоматизации развертывания, однако расширило кругозор и натолкнуло на понимание, что моя модель/структура МР не корректна для поставленных задач.
Отправлю в личку ссылку и описание.
а все таки для статейника, что лучше? Если ручной перевод всех статей?
Поддерживаю слова SeVlad - WPML заслуживает внимания. Не однократно это решение упомянают те, кто с мультиязычных сеток нормально извлекают прибыль.
Доброго Всем дня) Ошибка была связана с выделенной памятью, забыл конкретно на этом сайте прописать. 😂 Добавил строки в wp-config и php.ini ->> теперь все гуд!
Да, это один сайт, один набор городов, рубрик, меток и т.д.
Подмена города для шаблонных страниц (одинаковых для всех городов) через шорткоды или свои расставленные макросы.
Нужно только на всех страницах сверять на наличие города в базе, т.е. из адреса site.ru/msk/ или site.ru/msk /page, получать из урл msk, сверять его с базой и если есть, то менять контент на странице под этот город. по сути это одна функция, которую можно везде использовать , в том числе для создания шоркодов.
Реализация в целом зависит от самого сайта. Либо это как доска объявлений, где каждое объявление привязано только к одному городу и должно отображаться только в этом городе. Либо это как интернет-магазин, где обычно товары во всех городах одинаковые и меняется только сео и контакты.
Огромное спасибо!👍 Кругозор расширен, однозначно. Буду воплощать, тк упростит жизнь 100%))
Давно уже делал на поддоменах и на разделах.
Если на разделах, то в wp-config.php нужно принудительно менять адрес сайта
define( 'WP_HOME', 'http://site.ru/msk');
Но до этой строчки, на сколько я помню, там был массив всех городов, функция получения адреса текущей страницы и города из урл, сравнение его с массивом.
Список городов добавлялся в произвольном типе записей.
Если нужна фильтрация для записей для каждого города своя, то при публикации нужно выбирать еще и город.
Там еще какие-то заморочки были по типу страниц контактов для разных городов. Но это проще чем мультисайт.
Скажите, я правильно понимаю, что речь идет об одном сайте, в архитектурное древо которого закладываются города как тип записи? Далее документ(ы) могут открываться через город и иметь свою оптимизацию под поиск? А если в контенте(тексте) документа требуется подмена города? Как то завязывать на тип записи..?