<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://8j0rn.dagbok.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=8j0rn</id>
	<title>8j0rn wiki - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://8j0rn.dagbok.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=8j0rn"/>
	<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/8j0rn"/>
	<updated>2026-10-26T19:06:53Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=DeepSeek&amp;diff=319</id>
		<title>DeepSeek</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=DeepSeek&amp;diff=319"/>
		<updated>2025-08-12T21:27:52Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Иногда DeepSeek выдает крайне полезные ответы, но потом их хрен найдешь в потоке сознания ИИ.&lt;br /&gt;
Поэтому постараюсь сохранять их здеся.&lt;br /&gt;
== LSTM анализ ==&lt;br /&gt;
# [[DeepSeek/LSTM.6x45|Предложения по улучшению модели 6x45]]&lt;br /&gt;
&lt;br /&gt;
== Shell скрипты ==&lt;br /&gt;
# [[DeepSeek/rsync.backup|Синхронизация папки и хранение 5 последних версий]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=DeepSeek/rsync.backup&amp;diff=318</id>
		<title>DeepSeek/rsync.backup</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=DeepSeek/rsync.backup&amp;diff=318"/>
		<updated>2025-08-12T21:26:34Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «== 1. как сделать лучше если надо папку с linux сервера бэкапить на другой компьютер и хранить 5 последних бэкапов, посоветуй вариант==  Для надежного бэкапа папки с Linux-сервера на другой компьютер с хранением 5 последних версий лучше всего использовать **Rsync в...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1. как сделать лучше если надо папку с linux сервера бэкапить на другой компьютер и хранить 5 последних бэкапов, посоветуй вариант==&lt;br /&gt;
&lt;br /&gt;
Для надежного бэкапа папки с Linux-сервера на другой компьютер с хранением 5 последних версий лучше всего использовать **Rsync в связке с `--link-dest`** или специализированные инструменты вроде **BorgBackup/Rsnapshot**. Вот оптимальные решения:&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **1. Вариант 1: Rsync + `--link-dest` (просто и эффективно)**  &lt;br /&gt;
**Как работает:**  &lt;br /&gt;
- Каждый бэкап — это полная копия, но неизмененные файлы заменяются жесткими ссылками (экономия места).  &lt;br /&gt;
- Хранится только 5 последних снимков.  &lt;br /&gt;
&lt;br /&gt;
#### **Шаги:**  &lt;br /&gt;
**① Настройка SSH-доступа между серверами**  &lt;br /&gt;
На **целевом компьютере** (куда бэкапируем):  &lt;br /&gt;
```bash&lt;br /&gt;
ssh-keygen -t ed25519  &lt;br /&gt;
ssh-copy-id user@backup-server  # Копируем ключ для авторизации без пароля&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
**② Скрипт для бэкапа (`/usr/local/bin/backup.sh`)**  &lt;br /&gt;
```bash&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
SOURCE_DIR=&amp;quot;/path/to/source&amp;quot;          # Папка для бэкапа&lt;br /&gt;
BACKUP_DIR=&amp;quot;/backups&amp;quot;                # Папка на удаленном компьютере&lt;br /&gt;
REMOTE=&amp;quot;user@backup-server&amp;quot;          # Адрес целевого ПК&lt;br /&gt;
MAX_BACKUPS=5                        # Сколько версий хранить&lt;br /&gt;
&lt;br /&gt;
# Создаем новую папку с датой&lt;br /&gt;
DATE=$(date +%Y-%m-%d_%H-%M-%S)&lt;br /&gt;
NEW_BACKUP=&amp;quot;$BACKUP_DIR/$DATE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Последний бэкап для --link-dest&lt;br /&gt;
LATEST=$(ssh $REMOTE &amp;quot;ls -td $BACKUP_DIR/*/ | head -1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Rsync с инкрементным копированием&lt;br /&gt;
rsync -az --delete --link-dest=&amp;quot;$LATEST&amp;quot; \&lt;br /&gt;
    &amp;quot;$SOURCE_DIR/&amp;quot; &amp;quot;$REMOTE:$NEW_BACKUP/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Удаляем старые бэкапы (оставляем 5 последних)&lt;br /&gt;
ssh $REMOTE &amp;quot;ls -td $BACKUP_DIR/*/ | tail -n +$(($MAX_BACKUPS + 1)) | xargs rm -rf&amp;quot;&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
**③ Добавляем скрипт в cron (ежедневный бэкап)**  &lt;br /&gt;
```bash&lt;br /&gt;
chmod +x /usr/local/bin/backup.sh&lt;br /&gt;
crontab -e&lt;br /&gt;
```  &lt;br /&gt;
Добавить строку:  &lt;br /&gt;
```bash&lt;br /&gt;
0 3 * * * /usr/local/bin/backup.sh  # Каждый день в 3:00&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
**Плюсы:**  &lt;br /&gt;
- Минимум зависимостей (только `rsync` и `ssh`).  &lt;br /&gt;
- Жесткие ссылки экономят место.  &lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **2. Вариант 2: Rsnapshot (готовое решение)**  &lt;br /&gt;
**Установка:**  &lt;br /&gt;
```bash&lt;br /&gt;
sudo apt install rsnapshot  # Debian/Ubuntu&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
**Настройка (`/etc/rsnapshot.conf`):**  &lt;br /&gt;
```ini&lt;br /&gt;
config_version   1.2&lt;br /&gt;
snapshot_root   /backups/&lt;br /&gt;
cmd_rsync       /usr/bin/rsync&lt;br /&gt;
retain  daily   5           # Храним 5 последних бэкапов&lt;br /&gt;
backup  /path/to/source/    user@backup-server::backup/&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
**Запуск:**  &lt;br /&gt;
```bash&lt;br /&gt;
rsnapshot daily  # Тест&lt;br /&gt;
crontab -e&lt;br /&gt;
```  &lt;br /&gt;
Добавить:  &lt;br /&gt;
```bash&lt;br /&gt;
0 3 * * * /usr/bin/rsnapshot daily&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
**Плюсы:**  &lt;br /&gt;
- Готовые настройки ротации бэкапов.  &lt;br /&gt;
- Поддержка SSH (`backup user@server:/path/ /backup/`).  &lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **3. Вариант 3: BorgBackup (с шифрованием и дедупликацией)**  &lt;br /&gt;
**Установка:**  &lt;br /&gt;
```bash&lt;br /&gt;
sudo apt install borgbackup  # Debian/Ubuntu&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
**Инициализация репозитория:**  &lt;br /&gt;
```bash&lt;br /&gt;
borg init --encryption=repokey user@backup-server:/backups/repo&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
**Скрипт для бэкапа:**  &lt;br /&gt;
```bash&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
SOURCE=&amp;quot;/path/to/source&amp;quot;&lt;br /&gt;
REPO=&amp;quot;user@backup-server:/backups/repo&amp;quot;&lt;br /&gt;
borg create --stats --progress &amp;quot;$REPO::$(date +%Y-%m-%d_%H-%M-%S)&amp;quot; &amp;quot;$SOURCE&amp;quot;&lt;br /&gt;
borg prune --keep-last 5 &amp;quot;$REPO&amp;quot;  # Оставляем 5 последних&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
**Плюсы:**  &lt;br /&gt;
- Шифрование данных.  &lt;br /&gt;
- Дедупликация (экономия места).  &lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **4. Вариант 4: Tar + SSH (если rsync недоступен)**  &lt;br /&gt;
**Скрипт:**  &lt;br /&gt;
```bash&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
SOURCE=&amp;quot;/path/to/source&amp;quot;&lt;br /&gt;
BACKUP=&amp;quot;user@backup-server:/backups/&amp;quot;&lt;br /&gt;
TAR_FILE=&amp;quot;backup_$(date +%Y-%m-%d).tar.gz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
tar -czf - &amp;quot;$SOURCE&amp;quot; | ssh &amp;quot;$BACKUP&amp;quot; &amp;quot;cat &amp;gt; $TAR_FILE&amp;quot;&lt;br /&gt;
ssh &amp;quot;$BACKUP&amp;quot; &amp;quot;ls -t /backups/backup_* | tail -n +6 | xargs rm -f&amp;quot;  # Удаляем старые&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **Сравнение методов**  &lt;br /&gt;
| **Критерий**       | Rsync + `--link-dest` | Rsnapshot | BorgBackup | Tar + SSH |  &lt;br /&gt;
|--------------------|----------------------|-----------|------------|-----------|  &lt;br /&gt;
| Простота          | ★★★★                | ★★★★     | ★★         | ★★★★★    |  &lt;br /&gt;
| Экономия места    | ★★★★ (жесткие ссылки)| ★★★★     | ★★★★★ (дедупликация) | ★★       |  &lt;br /&gt;
| Шифрование       | Нет                  | Нет       | Да         | Нет       |  &lt;br /&gt;
| Скорость         | Быстро               | Быстро    | Средняя    | Медленно  |  &lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **Что выбрать?**  &lt;br /&gt;
- **Для простоты** → `Rsync + --link-dest` или `Rsnapshot`.  &lt;br /&gt;
- **Для безопасности** → `BorgBackup` (шифрование).  &lt;br /&gt;
- **Для минимализма** → `Tar + SSH`.  &lt;br /&gt;
&lt;br /&gt;
**Рекомендация:**  &lt;br /&gt;
```bash&lt;br /&gt;
# Оптимальный вариант (баланс простоты и функциональности)&lt;br /&gt;
sudo apt install rsnapshot&lt;br /&gt;
nano /etc/rsnapshot.conf  # Настраиваем пути&lt;br /&gt;
rsnapshot daily&lt;br /&gt;
```  &lt;br /&gt;
&lt;br /&gt;
Все методы поддерживают **автоматическую ротацию** (хранение только 5 бэкапов). Для мониторинга добавьте проверку логов:  &lt;br /&gt;
```bash&lt;br /&gt;
grep -i error /var/log/syslog  # Или journalctl -u cron&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
== 2. А можно еще добавить контроль свободного места?==&lt;br /&gt;
Отличное дополнение! Контроль свободного места перед бэкапом критически важен, чтобы избежать сбоев. Вот как добавить эту проверку в каждый из вариантов:&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **1. Для Rsync + `--link-dest` (вариант из первого решения)**&lt;br /&gt;
Дополним скрипт проверкой:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
SOURCE_DIR=&amp;quot;/path/to/source&amp;quot;&lt;br /&gt;
BACKUP_DIR=&amp;quot;/backups&amp;quot;&lt;br /&gt;
REMOTE=&amp;quot;user@backup-server&amp;quot;&lt;br /&gt;
MAX_BACKUPS=5&lt;br /&gt;
MIN_SPACE_GB=10  # Минимум 10 ГБ свободного места&lt;br /&gt;
&lt;br /&gt;
# Проверка свободного места на удаленном сервере&lt;br /&gt;
FREE_SPACE=$(ssh $REMOTE &amp;quot;df -BG --output=avail $BACKUP_DIR | tail -1 | tr -d &#039;G&#039;&amp;quot;)&lt;br /&gt;
if [ &amp;quot;$FREE_SPACE&amp;quot; -lt &amp;quot;$MIN_SPACE_GB&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Ошибка: На сервере $REMOTE осталось только ${FREE_SPACE}GB. Требуется минимум ${MIN_SPACE_GB}GB.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Остальная часть скрипта (rsync + ротация)&lt;br /&gt;
DATE=$(date +%Y-%m-%d_%H-%M-%S)&lt;br /&gt;
NEW_BACKUP=&amp;quot;$BACKUP_DIR/$DATE&amp;quot;&lt;br /&gt;
LATEST=$(ssh $REMOTE &amp;quot;ls -td $BACKUP_DIR/*/ | head -1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
rsync -az --delete --link-dest=&amp;quot;$LATEST&amp;quot; &amp;quot;$SOURCE_DIR/&amp;quot; &amp;quot;$REMOTE:$NEW_BACKUP/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Удаляем старые бэкапы&lt;br /&gt;
ssh $REMOTE &amp;quot;ls -td $BACKUP_DIR/*/ | tail -n +$(($MAX_BACKUPS + 1)) | xargs rm -rf&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **2. Для Rsnapshot**&lt;br /&gt;
Добавим проверку в `rsnapshot.conf` через `pre-exec`:&lt;br /&gt;
&lt;br /&gt;
```ini&lt;br /&gt;
# В /etc/rsnapshot.conf&lt;br /&gt;
config_version   1.2&lt;br /&gt;
snapshot_root   /backups/&lt;br /&gt;
cmd_rsync       /usr/bin/rsync&lt;br /&gt;
retain  daily   5&lt;br /&gt;
&lt;br /&gt;
# Проверка места перед выполнением&lt;br /&gt;
pre_exec    bash -c &#039;if [ $(df -BG --output=avail /backups/ | tail -1 | tr -d &amp;quot;G&amp;quot;) -lt 10 ]; then exit 1; fi&#039;&lt;br /&gt;
&lt;br /&gt;
backup  /path/to/source/    user@backup-server::backup/&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **3. Для BorgBackup**&lt;br /&gt;
Добавим проверку в скрипт:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
SOURCE=&amp;quot;/path/to/source&amp;quot;&lt;br /&gt;
REPO=&amp;quot;user@backup-server:/backups/repo&amp;quot;&lt;br /&gt;
MIN_SPACE_GB=10&lt;br /&gt;
&lt;br /&gt;
# Проверка места&lt;br /&gt;
FREE_SPACE=$(ssh user@backup-server &amp;quot;df -BG --output=avail /backups | tail -1 | tr -d &#039;G&#039;&amp;quot;)&lt;br /&gt;
if [ &amp;quot;$FREE_SPACE&amp;quot; -lt &amp;quot;$MIN_SPACE_GB&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Ошибка: Недостаточно места на сервере. Свободно: ${FREE_SPACE}GB, требуется: ${MIN_SPACE_GB}GB.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Создание бэкапа&lt;br /&gt;
borg create --stats --progress &amp;quot;$REPO::$(date +%Y-%m-%d_%H-%M-%S)&amp;quot; &amp;quot;$SOURCE&amp;quot;&lt;br /&gt;
borg prune --keep-last 5 &amp;quot;$REPO&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **4. Для Tar + SSH**&lt;br /&gt;
Модифицируем скрипт:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
SOURCE=&amp;quot;/path/to/source&amp;quot;&lt;br /&gt;
BACKUP=&amp;quot;user@backup-server:/backups/&amp;quot;&lt;br /&gt;
TAR_FILE=&amp;quot;backup_$(date +%Y-%m-%d).tar.gz&amp;quot;&lt;br /&gt;
MIN_SPACE_GB=5  # Минимум 5 ГБ&lt;br /&gt;
&lt;br /&gt;
# Проверка места&lt;br /&gt;
FREE_SPACE=$(ssh &amp;quot;$BACKUP&amp;quot; &amp;quot;df -BG --output=avail /backups | tail -1 | tr -d &#039;G&#039;&amp;quot;)&lt;br /&gt;
if [ &amp;quot;$FREE_SPACE&amp;quot; -lt &amp;quot;$MIN_SPACE_GB&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Ошибка: Недостаточно места. Свободно: ${FREE_SPACE}GB, требуется: ${MIN_SPACE_GB}GB.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Создание бэкапа&lt;br /&gt;
tar -czf - &amp;quot;$SOURCE&amp;quot; | ssh &amp;quot;$BACKUP&amp;quot; &amp;quot;cat &amp;gt; /backups/$TAR_FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Удаление старых (оставляем 5 последних)&lt;br /&gt;
ssh &amp;quot;$BACKUP&amp;quot; &amp;quot;ls -t /backups/backup_* | tail -n +6 | xargs rm -f&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **Дополнительные улучшения**&lt;br /&gt;
1. **Уведомления об ошибках** (если место кончилось):&lt;br /&gt;
   ```bash&lt;br /&gt;
   # Добавить в начало скрипта (после проверки места)&lt;br /&gt;
   if [ &amp;quot;$FREE_SPACE&amp;quot; -lt &amp;quot;$MIN_SPACE_GB&amp;quot; ]; then&lt;br /&gt;
       echo &amp;quot;Ошибка: Недостаточно места на сервере&amp;quot; | mail -s &amp;quot;Ошибка бэкапа&amp;quot; admin@example.com&lt;br /&gt;
       exit 1&lt;br /&gt;
   fi&lt;br /&gt;
   ```&lt;br /&gt;
   Требуется установленный `mailutils`.&lt;br /&gt;
&lt;br /&gt;
2. **Автоматическая очистка при нехватке места**:&lt;br /&gt;
   ```bash&lt;br /&gt;
   # Удалить самый старый бэкап, если места нет&lt;br /&gt;
   while [ &amp;quot;$FREE_SPACE&amp;quot; -lt &amp;quot;$MIN_SPACE_GB&amp;quot; ]; do&lt;br /&gt;
       OLDEST=$(ssh $REMOTE &amp;quot;ls -td $BACKUP_DIR/*/ | tail -1&amp;quot;)&lt;br /&gt;
       ssh $REMOTE &amp;quot;rm -rf $OLDEST&amp;quot;&lt;br /&gt;
       FREE_SPACE=$(ssh $REMOTE &amp;quot;df -BG --output=avail $BACKUP_DIR | tail -1 | tr -d &#039;G&#039;&amp;quot;)&lt;br /&gt;
   done&lt;br /&gt;
   ```&lt;br /&gt;
&lt;br /&gt;
3. **Проверка места перед каждым бэкапом** в cron:&lt;br /&gt;
   ```bash&lt;br /&gt;
   0 3 * * * /usr/local/bin/check_space.sh &amp;amp;&amp;amp; /usr/local/bin/backup.sh&lt;br /&gt;
   ```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **Как проверить свободное место вручную**&lt;br /&gt;
На целевом сервере:&lt;br /&gt;
```bash&lt;br /&gt;
df -h /backups  # Общий вывод&lt;br /&gt;
df -BG --output=avail /backups | tail -1 | tr -d &#039;G&#039;  # Только число (в гигабайтах)&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### **Итог**&lt;br /&gt;
Теперь ваши бэкапы будут:&lt;br /&gt;
1. Проверять свободное место перед запуском.&lt;br /&gt;
2. Прерываться с ошибкой (или очищать старые данные), если места недостаточно.&lt;br /&gt;
3. Гарантированно хранить только 5 последних версий.&lt;br /&gt;
&lt;br /&gt;
Для самых надежных сетапов рекомендуем **BorgBackup + проверку места** — это сочетание безопасности и контроля ресурсов.&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=DeepSeek&amp;diff=317</id>
		<title>DeepSeek</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=DeepSeek&amp;diff=317"/>
		<updated>2025-08-12T21:25:39Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Иногда DeepSeek выдает крайне полезные ответы, но потом их хрен найдешь в потоке сознания ИИ.&lt;br /&gt;
Поэтому постараюсь сохранять их здеся.&lt;br /&gt;
== LSTM анализ ==&lt;br /&gt;
# [[LSTM.6x45|Предложения по улучшению модели 6x45]]&lt;br /&gt;
# [[DeepSeek/LSTM.6x45|Предложения по улучшению модели 6x45]]&lt;br /&gt;
&lt;br /&gt;
== Shell скрипты ==&lt;br /&gt;
# [[DeepSeek:rsync.backup|Синхронизация папки и хранение 5 последних версий]]&lt;br /&gt;
# [[DeepSeek/rsync.backup|Синхронизация папки и хранение 5 последних версий]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=DeepSeek/LSTM.6x45&amp;diff=316</id>
		<title>DeepSeek/LSTM.6x45</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=DeepSeek/LSTM.6x45&amp;diff=316"/>
		<updated>2025-08-12T21:23:53Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Чтобы улучшить модель предсказания лотерейных чисел, предлагаю комплексный подход, сочетающий технические улучшения и анализ закономерностей. Вот конкретные шаги:  1. Улучшение данных Добавьте временные признаки:  &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; # В calculate_additional_features(...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Чтобы улучшить модель предсказания лотерейных чисел, предлагаю комплексный подход, сочетающий технические улучшения и анализ закономерностей. Вот конкретные шаги:&lt;br /&gt;
&lt;br /&gt;
1. Улучшение данных&lt;br /&gt;
Добавьте временные признаки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# В calculate_additional_features()&lt;br /&gt;
features[&#039;days_since_last&#039;] = (draws[&#039;date&#039;].iloc[i] - draws[&#039;date&#039;].iloc[i-1]).days if i &amp;gt; 0 else 0&lt;br /&gt;
features[&#039;day_of_week&#039;] = draws[&#039;date&#039;].iloc[i].weekday()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Глубина статистики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Замените window_size=100 на динамическое окно&lt;br /&gt;
window_size = min(100, i)  # Для начальных тиражей&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Усовершенствованная архитектура модели&lt;br /&gt;
Добавьте механизм внимания:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from tensorflow.keras.layers import Attention&lt;br /&gt;
&lt;br /&gt;
# После LSTM слоев:&lt;br /&gt;
attention = Attention()([lstm_layer, lstm_layer])&lt;br /&gt;
combined = Concatenate()([lstm_layer, attention, features_input])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оптимизация гиперпараметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from kerastuner import HyperModel&lt;br /&gt;
&lt;br /&gt;
class LotteryHyperModel(HyperModel):&lt;br /&gt;
    def build(self, hp):&lt;br /&gt;
        # Тестируем разные конфигурации&lt;br /&gt;
        num_layers = hp.Int(&#039;num_layers&#039;, 1, 3)&lt;br /&gt;
        units = hp.Choice(&#039;units&#039;, [64, 128, 256])&lt;br /&gt;
        dropout = hp.Float(&#039;dropout&#039;, 0.1, 0.5)&lt;br /&gt;
        &lt;br /&gt;
        # Строим модель с этими параметрами&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Постобработка предсказаний&lt;br /&gt;
Фильтрация нереалистичных комбинаций:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def filter_combination(comb):&lt;br /&gt;
    # Проверка четности (3 четных и 3 нечетных)&lt;br /&gt;
    even = sum(1 for num in comb if num % 2 == 0)&lt;br /&gt;
    # Проверка суммы (средняя ~138)&lt;br /&gt;
    sum_ok = 120 &amp;lt;= sum(comb) &amp;lt;= 160&lt;br /&gt;
    # Проверка распределения по десяткам&lt;br /&gt;
    tens = [num//10 for num in comb]&lt;br /&gt;
    unique_tens = len(set(tens))&lt;br /&gt;
    &lt;br /&gt;
    return even == 3 and sum_ok and unique_tens &amp;gt;= 4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Альтернативные подходы&lt;br /&gt;
Ансамбль моделей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# LSTM + Gradient Boosting&lt;br /&gt;
from sklearn.ensemble import GradientBoostingRegressor&lt;br /&gt;
&lt;br /&gt;
# Обучаем GBM на тех же признаках&lt;br /&gt;
gbm = GradientBoostingRegressor()&lt;br /&gt;
gbm.fit(X_feat_scaled, y_scaled)&lt;br /&gt;
&lt;br /&gt;
# Комбинируем предсказания&lt;br /&gt;
lstm_pred = model.predict([X_seq_test, X_feat_test])&lt;br /&gt;
gbm_pred = gbm.predict(X_feat_test)&lt;br /&gt;
final_pred = 0.7 * lstm_pred + 0.3 * gbm_pred  # Взвешенное среднее&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Анализ результатов&lt;br /&gt;
Визуализация важности признаков:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import seaborn as sns&lt;br /&gt;
&lt;br /&gt;
# Для GBM модели&lt;br /&gt;
feature_importance = gbm.feature_importances_&lt;br /&gt;
sns.barplot(x=feature_importance, y=[&#039;hot_count&#039;, &#039;cold_count&#039;, &#039;last_seen&#039;, &#039;frequency&#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Точность по позициям:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Проверяем, на каких позициях чаще угадываем&lt;br /&gt;
position_accuracy = []&lt;br /&gt;
for pos in range(6):&lt;br /&gt;
    correct = sum(1 for pred, real in zip(predictions, y_test) if pred[pos] in real)&lt;br /&gt;
    position_accuracy.append(correct/len(y_test))&lt;br /&gt;
&lt;br /&gt;
plt.bar(range(1,7), position_accuracy)&lt;br /&gt;
plt.title(&#039;Точность по позициям&#039;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. Регулярное обновление&lt;br /&gt;
Автоматический пайплайн:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Еженедельное обновление&lt;br /&gt;
import schedule&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
def weekly_job():&lt;br /&gt;
    update_data()&lt;br /&gt;
    retrain_model()&lt;br /&gt;
    make_predictions()&lt;br /&gt;
&lt;br /&gt;
schedule.every().week.do(weekly_job)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    schedule.run_pending()&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ключевые улучшения:&lt;br /&gt;
Гибридная архитектура - комбинаци&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=DeepSeek&amp;diff=315</id>
		<title>DeepSeek</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=DeepSeek&amp;diff=315"/>
		<updated>2025-08-12T21:22:59Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: /* LSTM анализ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Иногда DeepSeek выдает крайне полезные ответы, но потом их хрен найдешь в потоке сознания ИИ.&lt;br /&gt;
Поэтому постараюсь сохранять их здеся.&lt;br /&gt;
== LSTM анализ ==&lt;br /&gt;
# [[LSTM.6x45|Предложения по улучшению модели 6x45]]&lt;br /&gt;
# [[DeepSeek/LSTM.6x45|Предложения по улучшению модели 6x45]]&lt;br /&gt;
&lt;br /&gt;
== Shell скрипты ==&lt;br /&gt;
# [[DeepSeek:rsync.backup|Синхронизация папки и хранение 5 последних версий]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=DeepSeek&amp;diff=313</id>
		<title>DeepSeek</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=DeepSeek&amp;diff=313"/>
		<updated>2025-08-12T21:20:29Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Иногда DeepSeek выдает крайне полезные ответы, но потом их хрен найдешь в потоке сознания ИИ.&lt;br /&gt;
Поэтому постараюсь сохранять их здеся.&lt;br /&gt;
== LSTM анализ ==&lt;br /&gt;
# [[LSTM.6x45|Предложения по улучшению модели 6x45]]&lt;br /&gt;
&lt;br /&gt;
== Shell скрипты ==&lt;br /&gt;
# [[DeepSeek:rsync.backup|Синхронизация папки и хранение 5 последних версий]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Manual&amp;diff=312</id>
		<title>Manual</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Manual&amp;diff=312"/>
		<updated>2025-08-12T21:17:40Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Домашний справочник&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Собираю сюда нужную инфу, необходимую регулярно.&lt;br /&gt;
&lt;br /&gt;
# [[manualWiKi|Настройки WiKi]]&lt;br /&gt;
# [[QNAP_NAS|QNAP NAS]]&lt;br /&gt;
# [[network-equipment|Моё сетевое оборудование]]&lt;br /&gt;
# [[macOS|macOS]]&lt;br /&gt;
# [[wp|WordPress]]&lt;br /&gt;
# [[PHPscript|PHP scripts]]&lt;br /&gt;
# [[mySQL|mySQL scripts]]&lt;br /&gt;
# [[python|Python script]]&lt;br /&gt;
# [[pine|Pine script]]&lt;br /&gt;
# [[ChatGPT|Мои вопросы с ответами для ChatGPT]]&lt;br /&gt;
# [[DeepSeek|Полезные ответы DeepSeek]]&lt;br /&gt;
# [[ReverseEngineering|Обратное проектирование (Реверс инжиниринг)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию по работе с этой вики можно найти в [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents справочном руководстве].&lt;br /&gt;
&lt;br /&gt;
== Начало работы ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список возможных настроек];&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Manual:FAQ/ru Часто задаваемые вопросы и ответы по MediaWiki];&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ Рассылка уведомлений о выходе новых версий MediaWiki].&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Перевод MediaWiki на свой язык]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Узнайте, как бороться со спамом в вашей вики]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=DeepSeek&amp;diff=310</id>
		<title>DeepSeek</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=DeepSeek&amp;diff=310"/>
		<updated>2025-04-06T20:46:15Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Иногда DeepSeek выдает крайне полезные ответы, но потом их хрен найдешь в потоке сознания ИИ. Поэтому постараюсь сохранять их здеся. == LSTM анализ == # Предложения по улучшению модели 6x45»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Иногда DeepSeek выдает крайне полезные ответы, но потом их хрен найдешь в потоке сознания ИИ.&lt;br /&gt;
Поэтому постараюсь сохранять их здеся.&lt;br /&gt;
== LSTM анализ ==&lt;br /&gt;
# [[LSTM.6x45|Предложения по улучшению модели 6x45]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Manual&amp;diff=309</id>
		<title>Manual</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Manual&amp;diff=309"/>
		<updated>2025-04-06T20:43:34Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Домашний справочник&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Собираю сюда нужную инфу, необходимую регулярно.&lt;br /&gt;
&lt;br /&gt;
# [[manualWiKi|Настройки WiKi]]&lt;br /&gt;
# [[QNAP_NAS|QNAP NAS]]&lt;br /&gt;
# [[network-equipment|Моё сетевое оборудование]]&lt;br /&gt;
# [[macOS|macOS]]&lt;br /&gt;
# [[wp|WordPress]]&lt;br /&gt;
# [[PHPscript|PHP scripts]]&lt;br /&gt;
# [[mySQL|mySQL scripts]]&lt;br /&gt;
# [[python|Python script]]&lt;br /&gt;
# [[pine|Pine script]]&lt;br /&gt;
# [[ChatGPT|Мои вопросы с ответами для ChatGPT]]&lt;br /&gt;
# [[DeepSeek|Полезные ответы DeepSee]]&lt;br /&gt;
# [[ReverseEngineering|Обратное проектирование (Реверс инжиниринг)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Информацию по работе с этой вики можно найти в [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents справочном руководстве].&lt;br /&gt;
&lt;br /&gt;
== Начало работы ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список возможных настроек];&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Manual:FAQ/ru Часто задаваемые вопросы и ответы по MediaWiki];&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ Рассылка уведомлений о выходе новых версий MediaWiki].&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Перевод MediaWiki на свой язык]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Узнайте, как бороться со спамом в вашей вики]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=308</id>
		<title>Python:pandas.on.QNAP</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=308"/>
		<updated>2025-04-04T00:52:04Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Установка pandas для Python на QNAP TS-412=&lt;br /&gt;
==Установка GCC==&lt;br /&gt;
Для установки на QNAP TS-412 GCC понадобится установить [[QNAP_NAS:Entware|Entware]], затем ставим GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install autoconf automake libtool-bin gcc make patchelf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Укажите правильный путь к GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; export PATH=&amp;quot;/opt/bin:$PATH&amp;quot;  # Путь к бинарникам Entware&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
А лучше прописать их в настройках bash ...&lt;br /&gt;
&lt;br /&gt;
==Установка Pandas из gitHUB==&lt;br /&gt;
Устанавливаем git:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Затем клонируем pandas из github:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; git clone https://github.com/pandas-dev/pandas.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пока... У меня Pandas напрямую установить пока не получилось.&lt;br /&gt;
Вылезала ошибка на уровне субпроцесса, в котором устанавливался numpy.&lt;br /&gt;
Я попробовал его поставить отдельно, вылезла ошибка на уровне субпроцессов ninja и patchelf.&lt;br /&gt;
Ninja самостоятельно установился, а patchelf выдал ошибку, пришлось добавить к пакетам Entware autoconf automake libtool-bin...&lt;br /&gt;
Ошибка:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Building wheel for patchelf (pyproject.toml) ... error&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Оказалось пакет patchelf есть в бинарниках opkg&lt;br /&gt;
...&lt;br /&gt;
Пробую установить:&lt;br /&gt;
pip install numpy==1.19.5 --no-binary=numpy&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=307</id>
		<title>Python:pandas.on.QNAP</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=307"/>
		<updated>2025-04-03T23:07:47Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Установка pandas для Python на QNAP TS-412=&lt;br /&gt;
==Установка GCC==&lt;br /&gt;
Для установки на QNAP TS-412 GCC понадобится установить [[QNAP_NAS:Entware|Entware]], затем ставим GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install autoconf automake libtool-bin gcc make patchelf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Укажите правильный путь к GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; export PATH=&amp;quot;/opt/bin:$PATH&amp;quot;  # Путь к бинарникам Entware&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
А лучше прописать их в настройках bash ...&lt;br /&gt;
&lt;br /&gt;
==Установка Pandas из gitHUB==&lt;br /&gt;
Устанавливаем git:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Затем клонируем pandas из github:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; git clone https://github.com/pandas-dev/pandas.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пока... У меня Pandas напрямую установить пока не получилось.&lt;br /&gt;
Вылезала ошибка на уровне субпроцесса, в котором устанавливался numpy.&lt;br /&gt;
Я попробовал его поставить отдельно, вылезла ошибка на уровне субпроцессов ninja и patchelf.&lt;br /&gt;
Ninja самостоятельно установился, а patchelf выдал ошибку, пришлось добавить к пакетам Entware autoconf automake libtool-bin...&lt;br /&gt;
Ошибка:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Building wheel for patchelf (pyproject.toml) ... error&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
Оказалось пакет patchelf есть в бинарниках opkg&lt;br /&gt;
...&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=306</id>
		<title>Python:pandas.on.QNAP</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=306"/>
		<updated>2025-04-03T23:03:48Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Установка pandas для Python на QNAP TS-412=&lt;br /&gt;
==Установка GCC==&lt;br /&gt;
Для установки на QNAP TS-412 GCC понадобится установить [[QNAP_NAS:Entware|Entware]], затем ставим GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install autoconf automake libtool-bin gcc make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Укажите правильный путь к GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; export PATH=&amp;quot;/opt/bin:$PATH&amp;quot;  # Путь к бинарникам Entware&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
А лучше прописать их в настройках bash ...&lt;br /&gt;
&lt;br /&gt;
==Установка Pandas из gitHUB==&lt;br /&gt;
Устанавливаем git:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Затем клонируем pandas из github:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; git clone https://github.com/pandas-dev/pandas.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пока... У меня Pandas напрямую установить пока не получилось.&lt;br /&gt;
Вылезала ошибка на уровне субпроцесса, в котором устанавливался numpy.&lt;br /&gt;
Я попробовал его поставить отдельно, вылезла ошибка на уровне субпроцессов ninja и patchelf.&lt;br /&gt;
Ninja самостоятельно установился, а patchelf выдал ошибку, пришлось добавить к пакетам Entware autoconf automake libtool-bin...&lt;br /&gt;
Ошибка:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Building wheel for patchelf (pyproject.toml) ... error&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
...&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=305</id>
		<title>Python:pandas.on.QNAP</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=305"/>
		<updated>2025-04-03T23:02:05Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Установка pandas для Python на QNAP TS-412=&lt;br /&gt;
==Установка GCC==&lt;br /&gt;
Для установки на QNAP TS-412 GCC понадобится установить [[QNAP_NAS:Entware|Entware]], затем ставим GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install autoconf automake libtool-bin gcc make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Укажите правильный путь к GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; export PATH=&amp;quot;/opt/bin:$PATH&amp;quot;  # Путь к бинарникам Entware&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
А лучше прописать их в настройках bash ...&lt;br /&gt;
&lt;br /&gt;
==Установка Pandas из gitHUB==&lt;br /&gt;
Устанавливаем git:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Затем клонируем pandas из github:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; git clone https://github.com/pandas-dev/pandas.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пока... У меня Pandas напрямую установить пока не получилось.&lt;br /&gt;
Вылезала ошибка на уровне субпроцесса, в котором устанавливался numpy.&lt;br /&gt;
Я попробовал его поставить отдельно, вылезла ошибка на уровне субпроцессов ninja и patchelf.&lt;br /&gt;
Ninja самостоятельно установился, а patchelf выдал ошибку, пришлось добавить к пакетам Entware autoconf automake libtool-bin...&lt;br /&gt;
...&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=304</id>
		<title>Python:pandas.on.QNAP</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=304"/>
		<updated>2025-04-03T22:57:01Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Установка pandas для Python на QNAP TS-412=&lt;br /&gt;
==Установка GCC==&lt;br /&gt;
Для установки на QNAP TS-412 GCC понадобится установить [[QNAP_NAS:Entware|Entware]], затем ставим GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install autoconf automake libtool gcc make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Укажите правильный путь к GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; export PATH=&amp;quot;/opt/bin:$PATH&amp;quot;  # Путь к бинарникам Entware&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
А лучше прописать их в настройках bash ...&lt;br /&gt;
&lt;br /&gt;
==Установка Pandas из gitHUB==&lt;br /&gt;
Устанавливаем git:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Затем клонируем pandas из github:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; git clone https://github.com/pandas-dev/pandas.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=303</id>
		<title>Python:pandas.on.QNAP</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Python:pandas.on.QNAP&amp;diff=303"/>
		<updated>2025-04-03T20:37:21Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «=Установка pandas для Python на QNAP TS-412= ==Установка GCC== Для установки на QNAP TS-412 GCC понадобится установить Entware, затем ставим GCC: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;  $&amp;gt; opkg opkg update  $&amp;gt; opkg install binutils gcc &amp;lt;/syntaxhighlight&amp;gt; Укажите правильный путь к GCC: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;  $&amp;gt; export PATH=&amp;quot;/opt/bin:$PATH&amp;quot;  # Пут...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Установка pandas для Python на QNAP TS-412=&lt;br /&gt;
==Установка GCC==&lt;br /&gt;
Для установки на QNAP TS-412 GCC понадобится установить [[QNAP_NAS:Entware|Entware]], затем ставим GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install binutils gcc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Укажите правильный путь к GCC:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; export PATH=&amp;quot;/opt/bin:$PATH&amp;quot;  # Путь к бинарникам Entware&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
А лучше прописать их в настройках bash ...&lt;br /&gt;
&lt;br /&gt;
==Установка Pandas из gitHUB==&lt;br /&gt;
Устанавливаем git:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; opkg opkg update&lt;br /&gt;
 $&amp;gt; opkg install git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Затем клонируем pandas из github:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 $&amp;gt; git clone https://github.com/pandas-dev/pandas.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Python&amp;diff=302</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Python&amp;diff=302"/>
		<updated>2025-04-03T20:24:39Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
# [[Python:DifferentScripts|Небольшие скрипты и заготовки]]&lt;br /&gt;
# [[Python:Flask|Скрипты и настройки фреймворка Flask]]&lt;br /&gt;
# [[Python:venv|Создание виртуальной среды для Python]]&lt;br /&gt;
# [[Python:pandas.on.QNAP|Установка pandas для Python на QNAP TS-412]]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Python&amp;diff=301</id>
		<title>Python</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Python&amp;diff=301"/>
		<updated>2025-04-03T20:23:36Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
# [[Python:DifferentScripts|Небольшие скрипты и заготовки]]&lt;br /&gt;
# [[Python:Flask|Скрипты и настройки фреймворка Flask]]&lt;br /&gt;
# [[Python:venv|Создание виртуальной среды для Python]]&lt;br /&gt;
# [[Python:pandas|Установка pandas для Python на QNAP TS-412]]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:JavaScript&amp;diff=300</id>
		<title>Wp:JavaScript</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:JavaScript&amp;diff=300"/>
		<updated>2025-03-21T21:20:06Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Разные интересности добавленные в качестве JS:&lt;br /&gt;
==1.1. Обертыши для адресов, телефонов и E-Mail через ID==&lt;br /&gt;
Почему-то не всегда на все срабатывает. Но думаю найду причину.&lt;br /&gt;
Пример HTML вставки:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;address id=&amp;quot;mail&amp;quot;&amp;gt;mail@mail.ru&amp;lt;/adress&amp;gt;&lt;br /&gt;
&amp;lt;address id=&amp;quot;tel_num&amp;quot;&amp;gt;+7 (999) 888-77-66&amp;lt;/address&amp;gt;&lt;br /&gt;
&amp;lt;address id=&amp;quot;adress_lnk&amp;quot;&amp;gt;191186, Санкт-Петербург, Невский пр., д. 77/33&amp;lt;/address&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сам собственно код JS:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
function handleAddressElements() {&lt;br /&gt;
    // Обрабатываем &amp;lt;address id=&amp;quot;adress_lnk&amp;quot;&amp;gt;&lt;br /&gt;
    const addressLink = document.getElementById(&#039;adress_lnk&#039;);&lt;br /&gt;
    if (addressLink &amp;amp;&amp;amp; !addressLink.dataset.processed) {&lt;br /&gt;
        addressLink.dataset.processed = true;&lt;br /&gt;
        const text = encodeURIComponent(addressLink.textContent.trim());&lt;br /&gt;
        if (!text) {&lt;br /&gt;
            console.error(&#039;Адрес пустой&#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
        link.href = &#039;#&#039;;&lt;br /&gt;
        link.textContent = addressLink.textContent;&lt;br /&gt;
        link.addEventListener(&#039;click&#039;, function (event) {&lt;br /&gt;
            openMap(text, event);&lt;br /&gt;
        });&lt;br /&gt;
        addressLink.innerHTML = &#039;&#039;;&lt;br /&gt;
        addressLink.appendChild(link);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Обрабатываем &amp;lt;address id=&amp;quot;tel_num&amp;quot;&amp;gt;&lt;br /&gt;
    const telNum = document.getElementById(&#039;tel_num&#039;);&lt;br /&gt;
    if (telNum &amp;amp;&amp;amp; !telNum.dataset.processed) {&lt;br /&gt;
        telNum.dataset.processed = true;&lt;br /&gt;
        const phoneNumber = telNum.textContent.trim();&lt;br /&gt;
        if (!phoneNumber) {&lt;br /&gt;
            console.error(&#039;Номер телефона пустой&#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        telNum.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        telNum.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            openPhoneModal(phoneNumber);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Обрабатываем &amp;lt;address id=&amp;quot;mail&amp;quot;&amp;gt;&lt;br /&gt;
    const mailAddress = document.getElementById(&#039;mail&#039;);&lt;br /&gt;
    if (mailAddress &amp;amp;&amp;amp; !mailAddress.dataset.processed) {&lt;br /&gt;
        mailAddress.dataset.processed = true;&lt;br /&gt;
        const email = mailAddress.textContent.trim();&lt;br /&gt;
        if (!email) {&lt;br /&gt;
            console.error(&#039;Email пустой&#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        const mailtoLink = document.createElement(&#039;a&#039;);&lt;br /&gt;
        mailtoLink.href = `mailto:${email}`;&lt;br /&gt;
        mailtoLink.textContent = email;&lt;br /&gt;
        mailAddress.innerHTML = &#039;&#039;;&lt;br /&gt;
        mailAddress.appendChild(mailtoLink);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Обрабатываем элементы при загрузке страницы&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, handleAddressElements);&lt;br /&gt;
&lt;br /&gt;
// Отслеживаем добавление новых элементов&lt;br /&gt;
const observer = new MutationObserver(function (mutations) {&lt;br /&gt;
    mutations.forEach(function (mutation) {&lt;br /&gt;
        if (mutation.type === &#039;childList&#039;) {&lt;br /&gt;
            handleAddressElements();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
&lt;br /&gt;
// Функция для открытия карты&lt;br /&gt;
function openMap(address, event) {&lt;br /&gt;
    const isMobile = /Android|webOS|iPhone|iPad|iPadOS|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);&lt;br /&gt;
    const isIOS = /iPhone|iPad|iPod|iPadOS/i.test(navigator.userAgent);&lt;br /&gt;
&lt;br /&gt;
    const yandexMapsUrl = `https://yandex.ru/maps/?text=${address}`;&lt;br /&gt;
    const googleMapsUrl = `https://www.google.com/maps/search/?api=1&amp;amp;query=${address}`;&lt;br /&gt;
    const appleMapsUrl = `http://maps.apple.com/?q=${address}`;&lt;br /&gt;
    const dgisUrl = `https://2gis.ru/search/${address}`;&lt;br /&gt;
&lt;br /&gt;
    if (isMobile) {&lt;br /&gt;
        const yandexWindow = window.open(yandexMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
        setTimeout(() =&amp;gt; {&lt;br /&gt;
            if (!yandexWindow || yandexWindow.closed || yandexWindow.innerHeight === 0) {&lt;br /&gt;
                if (isIOS) {&lt;br /&gt;
                    window.open(appleMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
                } else {&lt;br /&gt;
                    window.open(googleMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }, 500);&lt;br /&gt;
    } else {&lt;br /&gt;
        window.open(dgisUrl, &#039;_blank&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event.preventDefault();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция для открытия модального окна с выбором действия для телефона&lt;br /&gt;
function openPhoneModal(phoneNumber) {&lt;br /&gt;
    const cleanedCallNumber = phoneNumber.replace(/[\s\-()]/g, &#039;&#039;);&lt;br /&gt;
    const cleanedWhatsappNumber = phoneNumber.replace(/[\s\-()+]/g, &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
    const modal = document.createElement(&#039;div&#039;);&lt;br /&gt;
    modal.style.position = &#039;fixed&#039;;&lt;br /&gt;
    modal.style.top = &#039;0&#039;;&lt;br /&gt;
    modal.style.left = &#039;0&#039;;&lt;br /&gt;
    modal.style.width = &#039;100%&#039;;&lt;br /&gt;
    modal.style.height = &#039;100%&#039;;&lt;br /&gt;
    modal.style.backgroundColor = &#039;rgba(0, 0, 0, 0.8)&#039;;&lt;br /&gt;
    modal.style.zIndex = &#039;1000&#039;;&lt;br /&gt;
    modal.style.display = &#039;flex&#039;;&lt;br /&gt;
    modal.style.justifyContent = &#039;center&#039;;&lt;br /&gt;
    modal.style.alignItems = &#039;center&#039;;&lt;br /&gt;
&lt;br /&gt;
    const buttonContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
    buttonContainer.style.backgroundColor = &#039;rgba(255, 255, 255, 0.33)&#039;;&lt;br /&gt;
    buttonContainer.style.padding = &#039;150px 50px&#039;;&lt;br /&gt;
    buttonContainer.style.borderRadius = &#039;50px&#039;;&lt;br /&gt;
    buttonContainer.style.border = &#039;2px solid #ccc&#039;;&lt;br /&gt;
    buttonContainer.style.textAlign = &#039;center&#039;;&lt;br /&gt;
    buttonContainer.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
&lt;br /&gt;
    const callButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
    callButton.textContent = &#039;Позвонить&#039;;&lt;br /&gt;
    callButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
    callButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
    callButton.style.backgroundColor = &#039;#007BFF&#039;;&lt;br /&gt;
    callButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
    callButton.style.border = &#039;3px solid rgb(0, 64, 128)&#039;;&lt;br /&gt;
    callButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
    callButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
    callButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
    callButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        window.open(`tel:${cleanedCallNumber}`, &#039;_blank&#039;);&lt;br /&gt;
        document.body.removeChild(modal);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    const whatsappButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
    whatsappButton.textContent = &#039;Написать в WhatsApp&#039;;&lt;br /&gt;
    whatsappButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
    whatsappButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
    whatsappButton.style.backgroundColor = &#039;rgb(37,211,102)&#039;;&lt;br /&gt;
    whatsappButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
    whatsappButton.style.border = &#039;3px solid rgb(16, 105, 51)&#039;;&lt;br /&gt;
    whatsappButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
    whatsappButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
    whatsappButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
    whatsappButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        window.open(`https://wa.me/${cleanedWhatsappNumber}`, &#039;_blank&#039;);&lt;br /&gt;
        document.body.removeChild(modal);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    const closeButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
    closeButton.textContent = &#039;Закрыть&#039;;&lt;br /&gt;
    closeButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
    closeButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
    closeButton.style.backgroundColor = &#039;rgb(220,53,69)&#039;;&lt;br /&gt;
    closeButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
    closeButton.style.border = &#039;3px solid rgb(110, 26, 34)&#039;;&lt;br /&gt;
    closeButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
    closeButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
    closeButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
    closeButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        document.body.removeChild(modal);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    buttonContainer.appendChild(callButton);&lt;br /&gt;
    buttonContainer.appendChild(whatsappButton);&lt;br /&gt;
    buttonContainer.appendChild(closeButton);&lt;br /&gt;
&lt;br /&gt;
    modal.appendChild(buttonContainer);&lt;br /&gt;
&lt;br /&gt;
    document.body.appendChild(modal);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==1.2. Те же обертыши для адресов, телефонов и E-Mail, но уже через CLASS==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function () {&lt;br /&gt;
    // Обрабатываем &amp;lt;address class=&amp;quot;adress_lnk&amp;quot;&amp;gt;&lt;br /&gt;
    const addressLinks = document.querySelectorAll(&#039;.adress_lnk&#039;);&lt;br /&gt;
    addressLinks.forEach(function (addressLink) {&lt;br /&gt;
        const text = encodeURIComponent(addressLink.textContent.trim());&lt;br /&gt;
        const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
        link.href = &#039;#&#039;;&lt;br /&gt;
        link.textContent = addressLink.textContent;&lt;br /&gt;
        link.addEventListener(&#039;click&#039;, function (event) {&lt;br /&gt;
            openMap(text, event);&lt;br /&gt;
        });&lt;br /&gt;
        addressLink.innerHTML = &#039;&#039;;&lt;br /&gt;
        addressLink.appendChild(link);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Обрабатываем &amp;lt;address class=&amp;quot;tel_num&amp;quot;&amp;gt;&lt;br /&gt;
    const telNums = document.querySelectorAll(&#039;.tel_num&#039;);&lt;br /&gt;
    telNums.forEach(function (telNum) {&lt;br /&gt;
        const phoneNumber = telNum.textContent.trim();&lt;br /&gt;
        telNum.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        telNum.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            openPhoneModal(phoneNumber);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Обрабатываем &amp;lt;address class=&amp;quot;mail&amp;quot;&amp;gt;&lt;br /&gt;
    const mailElements = document.querySelectorAll(&#039;.mail&#039;);&lt;br /&gt;
    mailElements.forEach(function (mailAddress) {&lt;br /&gt;
        const email = mailAddress.textContent.trim();&lt;br /&gt;
        if (!email) {&lt;br /&gt;
            console.error(&#039;Email пустой&#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        const mailtoLink = document.createElement(&#039;a&#039;);&lt;br /&gt;
        mailtoLink.href = `mailto:${email}`;&lt;br /&gt;
        mailtoLink.textContent = email;&lt;br /&gt;
        mailAddress.innerHTML = &#039;&#039;;&lt;br /&gt;
        mailAddress.appendChild(mailtoLink);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Функция для открытия карты&lt;br /&gt;
    function openMap(address, event) {&lt;br /&gt;
        const isMobile = /Android|webOS|iPhone|iPad|iPadOS|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);&lt;br /&gt;
        const isIOS = /iPhone|iPad|iPod|iPadOS/i.test(navigator.userAgent);&lt;br /&gt;
&lt;br /&gt;
        const yandexMapsUrl = `https://yandex.ru/maps/?text=${address}`;&lt;br /&gt;
        const googleMapsUrl = `https://www.google.com/maps/search/?api=1&amp;amp;query=${address}`;&lt;br /&gt;
        const appleMapsUrl = `http://maps.apple.com/?q=${address}`;&lt;br /&gt;
        const dgisUrl = `https://2gis.ru/search/${address}`;&lt;br /&gt;
&lt;br /&gt;
        if (isMobile) {&lt;br /&gt;
            const yandexWindow = window.open(yandexMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
            setTimeout(() =&amp;gt; {&lt;br /&gt;
                if (!yandexWindow || yandexWindow.closed || yandexWindow.innerHeight === 0) {&lt;br /&gt;
                    if (isIOS) {&lt;br /&gt;
                        window.open(appleMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
                    } else {&lt;br /&gt;
                        window.open(googleMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }, 500);&lt;br /&gt;
        } else {&lt;br /&gt;
            window.open(dgisUrl, &#039;_blank&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        event.preventDefault();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Функция для открытия модального окна с выбором действия для телефона&lt;br /&gt;
    function openPhoneModal(phoneNumber) {&lt;br /&gt;
        const cleanedCallNumber = phoneNumber.replace(/[\s\-()]/g, &#039;&#039;);&lt;br /&gt;
        const cleanedWhatsappNumber = phoneNumber.replace(/[\s\-()+]/g, &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
        const modal = document.createElement(&#039;div&#039;);&lt;br /&gt;
        modal.style.position = &#039;fixed&#039;;&lt;br /&gt;
        modal.style.top = &#039;0&#039;;&lt;br /&gt;
        modal.style.left = &#039;0&#039;;&lt;br /&gt;
        modal.style.width = &#039;100%&#039;;&lt;br /&gt;
        modal.style.height = &#039;100%&#039;;&lt;br /&gt;
        modal.style.backgroundColor = &#039;rgba(0, 0, 0, 0.8)&#039;;&lt;br /&gt;
        modal.style.zIndex = &#039;1000&#039;;&lt;br /&gt;
        modal.style.display = &#039;flex&#039;;&lt;br /&gt;
        modal.style.justifyContent = &#039;center&#039;;&lt;br /&gt;
        modal.style.alignItems = &#039;center&#039;;&lt;br /&gt;
&lt;br /&gt;
        const buttonContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
        buttonContainer.style.backgroundColor = &#039;rgba(255, 255, 255, 0.33)&#039;;&lt;br /&gt;
        buttonContainer.style.padding = &#039;150px 50px&#039;;&lt;br /&gt;
        buttonContainer.style.borderRadius = &#039;50px&#039;;&lt;br /&gt;
        buttonContainer.style.border = &#039;2px solid #ccc&#039;;&lt;br /&gt;
        buttonContainer.style.textAlign = &#039;center&#039;;&lt;br /&gt;
        buttonContainer.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
&lt;br /&gt;
        const callButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
        callButton.textContent = &#039;Позвонить&#039;;&lt;br /&gt;
        callButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
        callButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
        callButton.style.backgroundColor = &#039;#007BFF&#039;;&lt;br /&gt;
        callButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
        callButton.style.border = &#039;3px solid rgb(0, 64, 128)&#039;;&lt;br /&gt;
        callButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
        callButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
        callButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        callButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            window.open(`tel:${cleanedCallNumber}`, &#039;_blank&#039;);&lt;br /&gt;
            document.body.removeChild(modal);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        const whatsappButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
        whatsappButton.textContent = &#039;Написать в WhatsApp&#039;;&lt;br /&gt;
        whatsappButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
        whatsappButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
        whatsappButton.style.backgroundColor = &#039;rgb(37,211,102)&#039;;&lt;br /&gt;
        whatsappButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
        whatsappButton.style.border = &#039;3px solid rgb(16, 105, 51)&#039;;&lt;br /&gt;
        whatsappButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
        whatsappButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
        whatsappButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        whatsappButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            window.open(`https://wa.me/${cleanedWhatsappNumber}`, &#039;_blank&#039;);&lt;br /&gt;
            document.body.removeChild(modal);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        const closeButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
        closeButton.textContent = &#039;Закрыть&#039;;&lt;br /&gt;
        closeButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
        closeButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
        closeButton.style.backgroundColor = &#039;rgb(220,53,69)&#039;;&lt;br /&gt;
        closeButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
        closeButton.style.border = &#039;3px solid rgb(110, 26, 34)&#039;;&lt;br /&gt;
        closeButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
        closeButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
        closeButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        closeButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            document.body.removeChild(modal);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        buttonContainer.appendChild(callButton);&lt;br /&gt;
        buttonContainer.appendChild(whatsappButton);&lt;br /&gt;
        buttonContainer.appendChild(closeButton);&lt;br /&gt;
&lt;br /&gt;
        modal.appendChild(buttonContainer);&lt;br /&gt;
&lt;br /&gt;
        document.body.appendChild(modal);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:JavaScript&amp;diff=299</id>
		<title>Wp:JavaScript</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:JavaScript&amp;diff=299"/>
		<updated>2025-03-21T21:17:56Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Разные интересности добавленные в качестве JS: ==1.1. Обертыши для адресов, телефонов и E-Mail через ID== Почему-то не всегда на все срабатывает. Но думаю найду причину. Пример HTML вставки: &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt; &amp;lt;address id=&amp;quot;mail&amp;quot;&amp;gt;mail@mail.ru&amp;lt;/adress&amp;gt; &amp;lt;address id=&amp;quot;tel_num&amp;quot;&amp;gt;+7 (999) 888-77-66&amp;lt;/address&amp;gt; &amp;lt;address id=&amp;quot;a...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Разные интересности добавленные в качестве JS:&lt;br /&gt;
==1.1. Обертыши для адресов, телефонов и E-Mail через ID==&lt;br /&gt;
Почему-то не всегда на все срабатывает. Но думаю найду причину.&lt;br /&gt;
Пример HTML вставки:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;address id=&amp;quot;mail&amp;quot;&amp;gt;mail@mail.ru&amp;lt;/adress&amp;gt;&lt;br /&gt;
&amp;lt;address id=&amp;quot;tel_num&amp;quot;&amp;gt;+7 (999) 888-77-66&amp;lt;/address&amp;gt;&lt;br /&gt;
&amp;lt;address id=&amp;quot;adress_lnk&amp;quot;&amp;gt;191186, Санкт-Петербург, Невский пр., д. 77/33&amp;lt;/address&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сам собственно код JS:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
function handleAddressElements() {&lt;br /&gt;
    // Обрабатываем &amp;lt;address id=&amp;quot;adress_lnk&amp;quot;&amp;gt;&lt;br /&gt;
    const addressLink = document.getElementById(&#039;adress_lnk&#039;);&lt;br /&gt;
    if (addressLink &amp;amp;&amp;amp; !addressLink.dataset.processed) {&lt;br /&gt;
        addressLink.dataset.processed = true;&lt;br /&gt;
        const text = encodeURIComponent(addressLink.textContent.trim());&lt;br /&gt;
        if (!text) {&lt;br /&gt;
            console.error(&#039;Адрес пустой&#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
        link.href = &#039;#&#039;;&lt;br /&gt;
        link.textContent = addressLink.textContent;&lt;br /&gt;
        link.addEventListener(&#039;click&#039;, function (event) {&lt;br /&gt;
            openMap(text, event);&lt;br /&gt;
        });&lt;br /&gt;
        addressLink.innerHTML = &#039;&#039;;&lt;br /&gt;
        addressLink.appendChild(link);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Обрабатываем &amp;lt;address id=&amp;quot;tel_num&amp;quot;&amp;gt;&lt;br /&gt;
    const telNum = document.getElementById(&#039;tel_num&#039;);&lt;br /&gt;
    if (telNum &amp;amp;&amp;amp; !telNum.dataset.processed) {&lt;br /&gt;
        telNum.dataset.processed = true;&lt;br /&gt;
        const phoneNumber = telNum.textContent.trim();&lt;br /&gt;
        if (!phoneNumber) {&lt;br /&gt;
            console.error(&#039;Номер телефона пустой&#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        telNum.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        telNum.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            openPhoneModal(phoneNumber);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Обрабатываем &amp;lt;address id=&amp;quot;mail&amp;quot;&amp;gt;&lt;br /&gt;
    const mailAddress = document.getElementById(&#039;mail&#039;);&lt;br /&gt;
    if (mailAddress &amp;amp;&amp;amp; !mailAddress.dataset.processed) {&lt;br /&gt;
        mailAddress.dataset.processed = true;&lt;br /&gt;
        const email = mailAddress.textContent.trim();&lt;br /&gt;
        if (!email) {&lt;br /&gt;
            console.error(&#039;Email пустой&#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        const mailtoLink = document.createElement(&#039;a&#039;);&lt;br /&gt;
        mailtoLink.href = `mailto:${email}`;&lt;br /&gt;
        mailtoLink.textContent = email;&lt;br /&gt;
        mailAddress.innerHTML = &#039;&#039;;&lt;br /&gt;
        mailAddress.appendChild(mailtoLink);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Обрабатываем элементы при загрузке страницы&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, handleAddressElements);&lt;br /&gt;
&lt;br /&gt;
// Отслеживаем добавление новых элементов&lt;br /&gt;
const observer = new MutationObserver(function (mutations) {&lt;br /&gt;
    mutations.forEach(function (mutation) {&lt;br /&gt;
        if (mutation.type === &#039;childList&#039;) {&lt;br /&gt;
            handleAddressElements();&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
observer.observe(document.body, { childList: true, subtree: true });&lt;br /&gt;
&lt;br /&gt;
// Функция для открытия карты&lt;br /&gt;
function openMap(address, event) {&lt;br /&gt;
    const isMobile = /Android|webOS|iPhone|iPad|iPadOS|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);&lt;br /&gt;
    const isIOS = /iPhone|iPad|iPod/i.test(navigator.userAgent);&lt;br /&gt;
&lt;br /&gt;
    const yandexMapsUrl = `https://yandex.ru/maps/?text=${address}`;&lt;br /&gt;
    const googleMapsUrl = `https://www.google.com/maps/search/?api=1&amp;amp;query=${address}`;&lt;br /&gt;
    const appleMapsUrl = `http://maps.apple.com/?q=${address}`;&lt;br /&gt;
    const dgisUrl = `https://2gis.ru/search/${address}`;&lt;br /&gt;
&lt;br /&gt;
    if (isMobile) {&lt;br /&gt;
        const yandexWindow = window.open(yandexMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
        setTimeout(() =&amp;gt; {&lt;br /&gt;
            if (!yandexWindow || yandexWindow.closed || yandexWindow.innerHeight === 0) {&lt;br /&gt;
                if (isIOS) {&lt;br /&gt;
                    window.open(appleMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
                } else {&lt;br /&gt;
                    window.open(googleMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }, 500);&lt;br /&gt;
    } else {&lt;br /&gt;
        window.open(dgisUrl, &#039;_blank&#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event.preventDefault();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Функция для открытия модального окна с выбором действия для телефона&lt;br /&gt;
function openPhoneModal(phoneNumber) {&lt;br /&gt;
    const cleanedCallNumber = phoneNumber.replace(/[\s\-()]/g, &#039;&#039;);&lt;br /&gt;
    const cleanedWhatsappNumber = phoneNumber.replace(/[\s\-()+]/g, &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
    const modal = document.createElement(&#039;div&#039;);&lt;br /&gt;
    modal.style.position = &#039;fixed&#039;;&lt;br /&gt;
    modal.style.top = &#039;0&#039;;&lt;br /&gt;
    modal.style.left = &#039;0&#039;;&lt;br /&gt;
    modal.style.width = &#039;100%&#039;;&lt;br /&gt;
    modal.style.height = &#039;100%&#039;;&lt;br /&gt;
    modal.style.backgroundColor = &#039;rgba(0, 0, 0, 0.8)&#039;;&lt;br /&gt;
    modal.style.zIndex = &#039;1000&#039;;&lt;br /&gt;
    modal.style.display = &#039;flex&#039;;&lt;br /&gt;
    modal.style.justifyContent = &#039;center&#039;;&lt;br /&gt;
    modal.style.alignItems = &#039;center&#039;;&lt;br /&gt;
&lt;br /&gt;
    const buttonContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
    buttonContainer.style.backgroundColor = &#039;rgba(255, 255, 255, 0.33)&#039;;&lt;br /&gt;
    buttonContainer.style.padding = &#039;150px 50px&#039;;&lt;br /&gt;
    buttonContainer.style.borderRadius = &#039;50px&#039;;&lt;br /&gt;
    buttonContainer.style.border = &#039;2px solid #ccc&#039;;&lt;br /&gt;
    buttonContainer.style.textAlign = &#039;center&#039;;&lt;br /&gt;
    buttonContainer.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
&lt;br /&gt;
    const callButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
    callButton.textContent = &#039;Позвонить&#039;;&lt;br /&gt;
    callButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
    callButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
    callButton.style.backgroundColor = &#039;#007BFF&#039;;&lt;br /&gt;
    callButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
    callButton.style.border = &#039;3px solid rgb(0, 64, 128)&#039;;&lt;br /&gt;
    callButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
    callButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
    callButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
    callButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        window.open(`tel:${cleanedCallNumber}`, &#039;_blank&#039;);&lt;br /&gt;
        document.body.removeChild(modal);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    const whatsappButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
    whatsappButton.textContent = &#039;Написать в WhatsApp&#039;;&lt;br /&gt;
    whatsappButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
    whatsappButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
    whatsappButton.style.backgroundColor = &#039;rgb(37,211,102)&#039;;&lt;br /&gt;
    whatsappButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
    whatsappButton.style.border = &#039;3px solid rgb(16, 105, 51)&#039;;&lt;br /&gt;
    whatsappButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
    whatsappButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
    whatsappButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
    whatsappButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        window.open(`https://wa.me/${cleanedWhatsappNumber}`, &#039;_blank&#039;);&lt;br /&gt;
        document.body.removeChild(modal);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    const closeButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
    closeButton.textContent = &#039;Закрыть&#039;;&lt;br /&gt;
    closeButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
    closeButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
    closeButton.style.backgroundColor = &#039;rgb(220,53,69)&#039;;&lt;br /&gt;
    closeButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
    closeButton.style.border = &#039;3px solid rgb(110, 26, 34)&#039;;&lt;br /&gt;
    closeButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
    closeButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
    closeButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
    closeButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
        document.body.removeChild(modal);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    buttonContainer.appendChild(callButton);&lt;br /&gt;
    buttonContainer.appendChild(whatsappButton);&lt;br /&gt;
    buttonContainer.appendChild(closeButton);&lt;br /&gt;
&lt;br /&gt;
    modal.appendChild(buttonContainer);&lt;br /&gt;
&lt;br /&gt;
    document.body.appendChild(modal);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==1.2. Те же обертыши для адресов, телефонов и E-Mail, но уже через CLASS==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
document.addEventListener(&#039;DOMContentLoaded&#039;, function () {&lt;br /&gt;
    // Обрабатываем &amp;lt;address class=&amp;quot;adress_lnk&amp;quot;&amp;gt;&lt;br /&gt;
    const addressLinks = document.querySelectorAll(&#039;.adress_lnk&#039;);&lt;br /&gt;
    addressLinks.forEach(function (addressLink) {&lt;br /&gt;
        const text = encodeURIComponent(addressLink.textContent.trim());&lt;br /&gt;
        const link = document.createElement(&#039;a&#039;);&lt;br /&gt;
        link.href = &#039;#&#039;;&lt;br /&gt;
        link.textContent = addressLink.textContent;&lt;br /&gt;
        link.addEventListener(&#039;click&#039;, function (event) {&lt;br /&gt;
            openMap(text, event);&lt;br /&gt;
        });&lt;br /&gt;
        addressLink.innerHTML = &#039;&#039;;&lt;br /&gt;
        addressLink.appendChild(link);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Обрабатываем &amp;lt;address class=&amp;quot;tel_num&amp;quot;&amp;gt;&lt;br /&gt;
    const telNums = document.querySelectorAll(&#039;.tel_num&#039;);&lt;br /&gt;
    telNums.forEach(function (telNum) {&lt;br /&gt;
        const phoneNumber = telNum.textContent.trim();&lt;br /&gt;
        telNum.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        telNum.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            openPhoneModal(phoneNumber);&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Обрабатываем &amp;lt;address class=&amp;quot;mail&amp;quot;&amp;gt;&lt;br /&gt;
    const mailElements = document.querySelectorAll(&#039;.mail&#039;);&lt;br /&gt;
    mailElements.forEach(function (mailAddress) {&lt;br /&gt;
        const email = mailAddress.textContent.trim();&lt;br /&gt;
        if (!email) {&lt;br /&gt;
            console.error(&#039;Email пустой&#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        const mailtoLink = document.createElement(&#039;a&#039;);&lt;br /&gt;
        mailtoLink.href = `mailto:${email}`;&lt;br /&gt;
        mailtoLink.textContent = email;&lt;br /&gt;
        mailAddress.innerHTML = &#039;&#039;;&lt;br /&gt;
        mailAddress.appendChild(mailtoLink);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Функция для открытия карты&lt;br /&gt;
    function openMap(address, event) {&lt;br /&gt;
        const isMobile = /Android|webOS|iPhone|iPad|iPadOS|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);&lt;br /&gt;
        const isIOS = /iPhone|iPad|iPod/i.test(navigator.userAgent);&lt;br /&gt;
&lt;br /&gt;
        const yandexMapsUrl = `https://yandex.ru/maps/?text=${address}`;&lt;br /&gt;
        const googleMapsUrl = `https://www.google.com/maps/search/?api=1&amp;amp;query=${address}`;&lt;br /&gt;
        const appleMapsUrl = `http://maps.apple.com/?q=${address}`;&lt;br /&gt;
        const dgisUrl = `https://2gis.ru/search/${address}`;&lt;br /&gt;
&lt;br /&gt;
        if (isMobile) {&lt;br /&gt;
            const yandexWindow = window.open(yandexMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
            setTimeout(() =&amp;gt; {&lt;br /&gt;
                if (!yandexWindow || yandexWindow.closed || yandexWindow.innerHeight === 0) {&lt;br /&gt;
                    if (isIOS) {&lt;br /&gt;
                        window.open(appleMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
                    } else {&lt;br /&gt;
                        window.open(googleMapsUrl, &#039;_blank&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }, 500);&lt;br /&gt;
        } else {&lt;br /&gt;
            window.open(dgisUrl, &#039;_blank&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        event.preventDefault();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Функция для открытия модального окна с выбором действия для телефона&lt;br /&gt;
    function openPhoneModal(phoneNumber) {&lt;br /&gt;
        const cleanedCallNumber = phoneNumber.replace(/[\s\-()]/g, &#039;&#039;);&lt;br /&gt;
        const cleanedWhatsappNumber = phoneNumber.replace(/[\s\-()+]/g, &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
        const modal = document.createElement(&#039;div&#039;);&lt;br /&gt;
        modal.style.position = &#039;fixed&#039;;&lt;br /&gt;
        modal.style.top = &#039;0&#039;;&lt;br /&gt;
        modal.style.left = &#039;0&#039;;&lt;br /&gt;
        modal.style.width = &#039;100%&#039;;&lt;br /&gt;
        modal.style.height = &#039;100%&#039;;&lt;br /&gt;
        modal.style.backgroundColor = &#039;rgba(0, 0, 0, 0.8)&#039;;&lt;br /&gt;
        modal.style.zIndex = &#039;1000&#039;;&lt;br /&gt;
        modal.style.display = &#039;flex&#039;;&lt;br /&gt;
        modal.style.justifyContent = &#039;center&#039;;&lt;br /&gt;
        modal.style.alignItems = &#039;center&#039;;&lt;br /&gt;
&lt;br /&gt;
        const buttonContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
        buttonContainer.style.backgroundColor = &#039;rgba(255, 255, 255, 0.33)&#039;;&lt;br /&gt;
        buttonContainer.style.padding = &#039;150px 50px&#039;;&lt;br /&gt;
        buttonContainer.style.borderRadius = &#039;50px&#039;;&lt;br /&gt;
        buttonContainer.style.border = &#039;2px solid #ccc&#039;;&lt;br /&gt;
        buttonContainer.style.textAlign = &#039;center&#039;;&lt;br /&gt;
        buttonContainer.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
&lt;br /&gt;
        const callButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
        callButton.textContent = &#039;Позвонить&#039;;&lt;br /&gt;
        callButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
        callButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
        callButton.style.backgroundColor = &#039;#007BFF&#039;;&lt;br /&gt;
        callButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
        callButton.style.border = &#039;3px solid rgb(0, 64, 128)&#039;;&lt;br /&gt;
        callButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
        callButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
        callButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        callButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            window.open(`tel:${cleanedCallNumber}`, &#039;_blank&#039;);&lt;br /&gt;
            document.body.removeChild(modal);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        const whatsappButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
        whatsappButton.textContent = &#039;Написать в WhatsApp&#039;;&lt;br /&gt;
        whatsappButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
        whatsappButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
        whatsappButton.style.backgroundColor = &#039;rgb(37,211,102)&#039;;&lt;br /&gt;
        whatsappButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
        whatsappButton.style.border = &#039;3px solid rgb(16, 105, 51)&#039;;&lt;br /&gt;
        whatsappButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
        whatsappButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
        whatsappButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        whatsappButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            window.open(`https://wa.me/${cleanedWhatsappNumber}`, &#039;_blank&#039;);&lt;br /&gt;
            document.body.removeChild(modal);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        const closeButton = document.createElement(&#039;button&#039;);&lt;br /&gt;
        closeButton.textContent = &#039;Закрыть&#039;;&lt;br /&gt;
        closeButton.style.margin = &#039;10px&#039;;&lt;br /&gt;
        closeButton.style.padding = &#039;10px 20px&#039;;&lt;br /&gt;
        closeButton.style.backgroundColor = &#039;rgb(220,53,69)&#039;;&lt;br /&gt;
        closeButton.style.color = &#039;#fff&#039;;&lt;br /&gt;
        closeButton.style.border = &#039;3px solid rgb(110, 26, 34)&#039;;&lt;br /&gt;
        closeButton.style.borderRadius = &#039;10px&#039;;&lt;br /&gt;
        closeButton.style.boxShadow = &#039;3px 3px 5px 0 rgba(0, 0, 0, 0.5)&#039;;&lt;br /&gt;
        closeButton.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
        closeButton.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            document.body.removeChild(modal);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        buttonContainer.appendChild(callButton);&lt;br /&gt;
        buttonContainer.appendChild(whatsappButton);&lt;br /&gt;
        buttonContainer.appendChild(closeButton);&lt;br /&gt;
&lt;br /&gt;
        modal.appendChild(buttonContainer);&lt;br /&gt;
&lt;br /&gt;
        document.body.appendChild(modal);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp&amp;diff=298</id>
		<title>Wp</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp&amp;diff=298"/>
		<updated>2025-03-21T21:08:58Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# [[wp:function|Custom function.php]]&lt;br /&gt;
# [[wp:style|Custom style.css]]&lt;br /&gt;
# [[wp:JavaScript|Custom custom.js]]&lt;br /&gt;
# [[wp:themes|Themes]]&lt;br /&gt;
# [[wp:plugins|Plugins]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:function&amp;diff=297</id>
		<title>Wp:function</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:function&amp;diff=297"/>
		<updated>2025-03-19T19:16:18Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=1. Мелкие доработки=&lt;br /&gt;
==1.1. Добавляем favicon==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Добавляем favicon&lt;br /&gt;
function _8j0rn_add_custom_favicon() {&lt;br /&gt;
	echo &#039;&amp;lt;link rel=&amp;quot;icon&amp;quot; href=&amp;quot;&#039; . home_url(&#039;/favicon.png&#039;) . &#039;&amp;quot; type=&amp;quot;image/png&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;wp_head&#039;, &#039;_8j0rn_add_custom_favicon&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==1.2. Настраиваем robots.txt==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Настраиваем robots.txt&lt;br /&gt;
add_action( &#039;do_robotstxt&#039;, &#039;my_robotstxt&#039; );&lt;br /&gt;
function my_robotstxt(){&lt;br /&gt;
&lt;br /&gt;
	$lines = [&lt;br /&gt;
		&#039;User-agent: *&#039;,&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		&#039;Disallow: /wp-admin/&#039;,&lt;br /&gt;
		&#039;Allow: /wp-admin/admin-ajax.php&#039;,&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		&#039;Disallow: /wp-includes/&#039;,&lt;br /&gt;
		&#039;Disallow: /subjects/*&#039;,&lt;br /&gt;
		&#039;Disallow: /cgi-bin/*&#039;,&lt;br /&gt;
		&#039;Disallow: /wp-admin/*&#039;,&lt;br /&gt;
		&#039;Disallow: /wp-includes/*&#039;,&lt;br /&gt;
		&#039;Disallow: /wp-content/plugins/*&#039;,&lt;br /&gt;
		&#039;Disallow: /wp-content/cache/*&#039;,&lt;br /&gt;
		&#039;Disallow: /wp-content/themes/*&#039;,&lt;br /&gt;
		&#039;Disallow: /wp-trackback*&#039;,&lt;br /&gt;
		&#039;Disallow: /wp-feed*&#039;,&lt;br /&gt;
		&#039;Disallow: /wp-comments*&#039;,&lt;br /&gt;
		&#039;Disallow: /category/*&#039;,&lt;br /&gt;
		&#039;Disallow: /author/*&#039;,&lt;br /&gt;
		&#039;Disallow: /page/*&#039;,&lt;br /&gt;
		&#039;Disallow: /tag/*&#039;,&lt;br /&gt;
		&#039;Disallow: /feed/*&#039;,&lt;br /&gt;
		&#039;Disallow: */feed&#039;,&lt;br /&gt;
		&#039;Disallow: */trackback&#039;,&lt;br /&gt;
		&#039;Disallow: */comments&#039;,&lt;br /&gt;
		&#039;Disallow: /*?&#039;,&lt;br /&gt;
		&#039;Disallow: /*?*&#039;,&lt;br /&gt;
		&#039;Disallow: /*.php&#039;,&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
		&#039;Sitemap: /sitemap_index.xml&#039;,&lt;br /&gt;
		&#039;&#039;,&lt;br /&gt;
	];&lt;br /&gt;
&lt;br /&gt;
	echo implode( &amp;quot;\r\n&amp;quot;, $lines );&lt;br /&gt;
&lt;br /&gt;
	die; // обрываем работу PHP&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==1.3. Изменение места загрузки фотографий==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Изменение места загрузки фотографий&lt;br /&gt;
function custom_upload_dir( $uploads ) {&lt;br /&gt;
    $time = current_time( &#039;mysql&#039; );&lt;br /&gt;
    $uploads[&#039;subdir&#039;] = &#039;/photo/&#039; . substr( $time, 0, 4 ) . &#039;/&#039; . substr( $time, 5, 2 ) . &#039;/&#039; . substr( $time, 8, 2 );&lt;br /&gt;
    $uploads[&#039;path&#039;] = $uploads[&#039;basedir&#039;] . $uploads[&#039;subdir&#039;];&lt;br /&gt;
    $uploads[&#039;url&#039;] = $uploads[&#039;baseurl&#039;] . $uploads[&#039;subdir&#039;];&lt;br /&gt;
    return $uploads;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==1.4. Изменяем имя медиа-файла==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Изменяем имя медиа-файла&lt;br /&gt;
function custom_upload_file_name($file) {&lt;br /&gt;
	$prefix = &#039;RecordInvest&#039;;&lt;br /&gt;
	$filename = $file[&#039;name&#039;];&lt;br /&gt;
	$ext = pathinfo($filename, PATHINFO_EXTENSION);&lt;br /&gt;
	$date = date(&#039;Y-m-d&#039;);&lt;br /&gt;
	$post_id = isset($_POST[&#039;post_id&#039;]) ? intval($_POST[&#039;post_id&#039;]) : 0;&lt;br /&gt;
	$num = 1;&lt;br /&gt;
	$new_filename = &amp;quot;{$prefix}_{$date}_{$post_id}_{$num}.{$ext}&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	while (file_exists($file[&#039;path&#039;] . &#039;/&#039; . $new_filename)) {&lt;br /&gt;
		$num++;&lt;br /&gt;
		$new_filename = &amp;quot;{$prefix}_{$date}_{$post_id}_{$num}.{$ext}&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$file[&#039;name&#039;] = $new_filename;&lt;br /&gt;
	return $file;&lt;br /&gt;
}&lt;br /&gt;
add_filter(&#039;wp_handle_upload_prefilter&#039;, &#039;custom_upload_file_name&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=2. Добавление Magnific Popup и fancybox без плагина=&lt;br /&gt;
==2.1. Добавление Magnific Popup==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Добавляем magnific_popup js script и css&lt;br /&gt;
function enqueue_magnific_popup() {&lt;br /&gt;
	// Получаем URL директории плагина, поскольку в моем случае расположение папки с Magnific Popup находится в директории плагина.&lt;br /&gt;
	$plugin_url = plugin_dir_url(__FILE__);&lt;br /&gt;
	// Подключение Magnific Popup CSS&lt;br /&gt;
	wp_enqueue_style(&#039;magnific-popup&#039;, $plugin_url . &#039;&amp;lt;&amp;lt;---папка-расположения-файлов-magnific-popup---&amp;gt;&amp;gt;/magnific-popup.css&#039;);&lt;br /&gt;
&lt;br /&gt;
	// Подключение Magnific Popup JS&lt;br /&gt;
	wp_enqueue_script(&#039;magnific-popup&#039;, $plugin_url . &#039;&amp;lt;&amp;lt;---папка-расположения-файлов-magnific-popup---&amp;gt;&amp;gt;/jquery.magnific-popup.min.js&#039;, array(&#039;jquery&#039;), null, true);&lt;br /&gt;
&lt;br /&gt;
	// Инициализация Magnific Popup для кнопок&lt;br /&gt;
	wp_add_inline_script(&#039;magnific-popup&#039;, &#039;&lt;br /&gt;
		jQuery(document).ready(function($) {&lt;br /&gt;
			$(&amp;quot;.epl-button&amp;quot;).on(&amp;quot;click&amp;quot;, function() {&lt;br /&gt;
				var imageUrl = $(this).attr(&amp;quot;data-image&amp;quot;); // Получаем URL изображения&lt;br /&gt;
				var caption = $(this).attr(&amp;quot;data-caption&amp;quot;); // Получаем подпись&lt;br /&gt;
				$.magnificPopup.open({&lt;br /&gt;
					items: {&lt;br /&gt;
						src: imageUrl&lt;br /&gt;
					},&lt;br /&gt;
					type: &amp;quot;image&amp;quot;,&lt;br /&gt;
					closeOnContentClick: true,&lt;br /&gt;
					mainClass: &amp;quot;mfp-img-mobile&amp;quot;,&lt;br /&gt;
					image: {&lt;br /&gt;
						verticalFit: true,&lt;br /&gt;
						titleSrc: caption // Добавляем подпись&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;wp_enqueue_scripts&#039;, &#039;enqueue_magnific_popup&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==2.2. Добавление fancybox==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Добавляем  fancybox js script и css&lt;br /&gt;
function enqueue_fancybox() {&lt;br /&gt;
	// Получаем URL директории плагина, поскольку в моем случае расположение папки с Magnific Popup находится в директории плагина.&lt;br /&gt;
	$plugin_url = plugin_dir_url(__FILE__);&lt;br /&gt;
	// Подключение Fancybox CSS (если он тоже в той же папке)&lt;br /&gt;
	wp_enqueue_style(&#039;fancybox&#039;, $plugin_url . &#039;&amp;lt;&amp;lt;---папка-расположения-файлов-magnific-popup---&amp;gt;&amp;gt;/fancybox.css&#039;);&lt;br /&gt;
&lt;br /&gt;
	// Подключение Fancybox JS (fancybox.umd.js в той же папке)&lt;br /&gt;
	wp_enqueue_script(&#039;fancybox&#039;, $plugin_url . &#039;&amp;lt;&amp;lt;---папка-расположения-файлов-magnific-popup---&amp;gt;&amp;gt;/fancybox.umd.js&#039;, array(&#039;jquery&#039;), null, true);&lt;br /&gt;
&lt;br /&gt;
	// Инициализация Fancybox для кнопок&lt;br /&gt;
	wp_add_inline_script(&#039;fancybox&#039;, &#039;&lt;br /&gt;
		jQuery(document).ready(function($) {&lt;br /&gt;
			$(&amp;quot;.epl-button&amp;quot;).on(&amp;quot;click&amp;quot;, function() {&lt;br /&gt;
				var imageUrl = $(this).attr(&amp;quot;data-image&amp;quot;); // Получаем URL изображения&lt;br /&gt;
				var caption = $(this).attr(&amp;quot;data-caption&amp;quot;); // Получаем подпись&lt;br /&gt;
				$.fancybox.open({&lt;br /&gt;
					src: imageUrl,&lt;br /&gt;
					type: &amp;quot;image&amp;quot;,&lt;br /&gt;
					opts: {&lt;br /&gt;
						caption: caption&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;wp_enqueue_scripts&#039;, &#039;enqueue_fancybox&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=296</id>
		<title>Wp:plugin:easy-property-listings</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=296"/>
		<updated>2025-03-19T17:48:59Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: /* 1. Сделал полный перевод плагину */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здеся я буду хранить все изменения что я внес в плагин Easy Property Listings Plugin:&lt;br /&gt;
&lt;br /&gt;
Делая сайт заказчику использовал плагин Property Listings Plugin. &lt;br /&gt;
&lt;br /&gt;
== 1. Сделал полный перевод плагину ==&lt;br /&gt;
Полный перевод плагина Property Listings Plugin: ([[:File:Easy-property-listings-ru RU.zip|Cкачать архив ZIP]])&lt;br /&gt;
&lt;br /&gt;
Важно помнить, перевод плагина нужно размещать в: &amp;lt;code&amp;gt;/wp-content/languages/epl/&amp;lt;/code&amp;gt;&lt;br /&gt;
Так уж сделал автор плагина, хотя и не по кодексу WP.&lt;br /&gt;
&lt;br /&gt;
== 2. Исправления через functions.php ==&lt;br /&gt;
Основные исправления делал через [[Wp:function|functions.php]] и поскольку для заказчика использовалась тема [[Wp:theme:storefront|StoreFront]] то все изменения вносил через нее.&lt;br /&gt;
&lt;br /&gt;
=== 2.1. Отключаем поддержку комментариев для всех типов записей===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем поддержку комментариев для всех типов записей&lt;br /&gt;
	function disable_comments_support() {&lt;br /&gt;
		// Отключаем поддержку комментариев для постов&lt;br /&gt;
		remove_post_type_support(&#039;post&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для страниц&lt;br /&gt;
		remove_post_type_support(&#039;page&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для медиафайлов&lt;br /&gt;
		remove_post_type_support(&#039;attachment&#039;, &#039;comments&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;init&#039;, &#039;disable_comments_support&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.2. Скрываем существующие комментарии===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Скрываем существующие комментарии&lt;br /&gt;
	function disable_comments_admin() {&lt;br /&gt;
		// Скрываем раздел &amp;quot;Комментарии&amp;quot; в админ-панели&lt;br /&gt;
		remove_menu_page(&#039;edit-comments.php&#039;);&lt;br /&gt;
		// Скрываем метабокс с комментариями на странице редактирования записей&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;post&#039;, &#039;normal&#039;);&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;page&#039;, &#039;normal&#039;);&lt;br /&gt;
		// Скрываем метабокс с последними комментариями в консоли&lt;br /&gt;
		remove_meta_box(&#039;dashboard_recent_comments&#039;, &#039;dashboard&#039;, &#039;normal&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;admin_menu&#039;, &#039;disable_comments_admin&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.3. Отключаем комментарии в REST API===&lt;br /&gt;
Если отключаете комментарии, то отключите их и в REST API, иначе могут спамеры замучать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем комментарии в REST API&lt;br /&gt;
	function disable_comments_rest_api($open, $post_id) {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
	add_filter(&#039;pings_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
&lt;br /&gt;
	// Удаляем комментарии из шаблонов&lt;br /&gt;
	function remove_comments_template() {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_template&#039;, &#039;remove_comments_template&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.4. Удаляем подписи под постами===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Удаляем подписи под постами&lt;br /&gt;
function remove_author_box() {&lt;br /&gt;
	// Удаляем хук, который выводит блок автора&lt;br /&gt;
	remove_action(&#039;epl_single_author&#039;, &#039;epl_property_author_box&#039;);&lt;br /&gt;
	remove_action(&#039;wpbf_after_article&#039;, &#039;wpbf_author_box&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_author_box&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.5. Изменение функции плагина easy-property-listings ===&lt;br /&gt;
Кнопка &amp;quot;План помещения&amp;quot; открывала картинку в новом окне, пришлось переписать функцию чтобы открывалась в лайтбокс (lightbox), для этого еще пришлось добавить загрузку [[Wp:function:adding-download-magnific_popup|magnific_popup]] и [[Wp:function:adding-download-fancybox|fancybox]] js script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
// Изменение функции плагина easy-property-listings&lt;br /&gt;
// (epl_button_floor_plan() отключаем и включаем &lt;br /&gt;
// свою функцию)&lt;br /&gt;
function remove_epl_button_floor_plan() {&lt;br /&gt;
	// Отключаем стандартную функцию&lt;br /&gt;
	remove_action(&#039;epl_buttons_single_property&#039;, &#039;epl_button_floor_plan&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_button_floor_plan&#039;);&lt;br /&gt;
&lt;br /&gt;
function _8j0rn_button_floor_plan() {&lt;br /&gt;
	// Кастомный код&lt;br /&gt;
	$keys = apply_filters( &#039;epl_floorplan_keys&#039;, array( &#039;property_floorplan&#039;, &#039;property_floorplan_2&#039; ) );&lt;br /&gt;
&lt;br /&gt;
	foreach ( $keys as $key ) {&lt;br /&gt;
&lt;br /&gt;
		$link       = get_post_meta( get_the_ID(), $key, true );&lt;br /&gt;
		$count      = &#039;property_floorplan&#039; === $key ? &#039;&#039; : substr( $key, - 1 );&lt;br /&gt;
		$default    = __( &#039;Floor Plan &#039;, &#039;easy-property-listings&#039; ) . $count;&lt;br /&gt;
		$meta_label = get_post_meta( get_the_ID(), $key . &#039;_label&#039;, true );&lt;br /&gt;
		$meta_label = empty( $meta_label ) ? $default : $meta_label;&lt;br /&gt;
&lt;br /&gt;
		if ( is_array( $link ) ) { // Fallback if metadata is saved as an array.&lt;br /&gt;
&lt;br /&gt;
			if ( ! empty( $link[&#039;image_url_or_path&#039;] ) ) {&lt;br /&gt;
				$link = $link[&#039;image_url_or_path&#039;];&lt;br /&gt;
			} else {&lt;br /&gt;
				$link = &#039;&#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( ! empty( $link ) &amp;amp;&amp;amp; apply_filters( &#039;epl_show_&#039; . $key, true ) ) { ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;epl-button epl-floor-plan epl-floor-plan-&amp;lt;?php echo absint( $count ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-image=&amp;quot;&amp;lt;?php echo esc_url( $link ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-caption=&amp;quot;&amp;lt;?php echo esc_attr( $meta_label ); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
				$filter_key = str_replace( &#039;property_&#039;, &#039;&#039;, $key );&lt;br /&gt;
				if ( has_filter( &#039;epl_button_label_&#039; . $filter_key ) ) {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_&#039; . $filter_key, $meta_label );&lt;br /&gt;
				} else {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_floorplan&#039;, $meta_label );&lt;br /&gt;
				}&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo esc_html( $label ); ?&amp;gt;&lt;br /&gt;
			&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;epl_buttons_single_property&#039;, &#039;_8j0rn_button_floor_plan&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.6. Изменение кривой функции плагина easy-property-listings (epl_button_floor_plan() отключаем и включаем свою функцию)===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Изменение кривой функции плагина easy-property-listings&lt;br /&gt;
// (epl_button_floor_plan() отключаем и включаем свою функцию)&lt;br /&gt;
// Удаляем существующий хук&lt;br /&gt;
function remove_epl_manage_listing_column_listing_type_callback() {&lt;br /&gt;
	remove_action( &#039;epl_manage_listing_column_listing_type&#039;, &#039;epl_manage_listing_column_listing_type_callback&#039; );&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_manage_listing_column_listing_type_callback&#039;);&lt;br /&gt;
&lt;br /&gt;
// Добавляем новый хук с кастомной функцией&lt;br /&gt;
function _8j0rn_epl_manage_listing_column_listing_type_callback() {&lt;br /&gt;
	global $post;&lt;br /&gt;
&lt;br /&gt;
	// Get the post meta.&lt;br /&gt;
	$listing_type = get_post_meta( $post-&amp;gt;ID, &#039;property_com_listing_type&#039;, true );&lt;br /&gt;
&lt;br /&gt;
	// If no duration is found, output a default message.&lt;br /&gt;
	if ( ! empty( $listing_type ) ) {&lt;br /&gt;
		switch ($listing_type) {&lt;br /&gt;
			case &#039;lease&#039;:&lt;br /&gt;
				echo esc_html__( &#039;For Lease&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;sale&#039;:&lt;br /&gt;
				echo esc_html__( &#039;For Sale&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;both&#039;:&lt;br /&gt;
				echo esc_html__( &#039;For Sale &amp;amp; Lease&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
add_action( &#039;epl_manage_listing_column_listing_type&#039;, &#039;_8j0rn_epl_manage_listing_column_listing_type_callback&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.7. Изменяем список категорий в разделе Коммерческие===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Изменяем список категорий в разделе Коммерческие&lt;br /&gt;
function _8j0rn_epl_listing_meta_commercial_category($defaults) {&lt;br /&gt;
	// Удаляем ненужные категории&lt;br /&gt;
	unset($defaults[&#039;Commercial Farming&#039;]);&lt;br /&gt;
	unset($defaults[&#039;Land/Development&#039;]);&lt;br /&gt;
	unset($defaults[&#039;Other&#039;]);&lt;br /&gt;
	&lt;br /&gt;
	// Изменяем или добавляем новые категории&lt;br /&gt;
	//$defaults[&#039;Commercial Farming&#039;] = __( &#039;Farming&#039;, &#039;easy-property-listings&#039; ); // Изменяем существующую категорию&lt;br /&gt;
	$defaults[&#039;Public catering&#039;] = __( &#039;Public catering&#039;, &#039;easy-property-listings&#039; ); // Добавляем новую категорию&lt;br /&gt;
	&lt;br /&gt;
	// Добавляем в конец Другое&lt;br /&gt;
	$defaults[&#039;Other&#039;] = __( &#039;Other&#039;, &#039;easy-property-listings&#039; ); // Добавляем новую категорию&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	return $defaults;&lt;br /&gt;
}&lt;br /&gt;
add_filter(&#039;epl_listing_meta_commercial_category&#039;, &#039;_8j0rn_epl_listing_meta_commercial_category&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.8. Переопределяем список единиц измерения площади===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Переопределяем список единиц измерения площади&lt;br /&gt;
function _8j0rn_epl_opts_area_unit_filter($defaults) {&lt;br /&gt;
	// Удаляем ненужные единицы&lt;br /&gt;
	unset($defaults[&#039;square&#039;]);&lt;br /&gt;
	unset($defaults[&#039;acre&#039;]);&lt;br /&gt;
	unset($defaults[&#039;sqft&#039;]);&lt;br /&gt;
	// Изменяем или добавляем новые единицы измерения&lt;br /&gt;
	$defaults[&#039;squareMeter&#039;]      = __( &#039;square meter&#039;, &#039;easy-property-listings&#039; ); // Изменяем существующую единицу&lt;br /&gt;
	$defaults[&#039;sotka&#039;]    = __( &#039;Sotka&#039;, &#039;easy-property-listings&#039; ); // Добавляем новую единицу&lt;br /&gt;
	return $defaults;&lt;br /&gt;
}&lt;br /&gt;
add_filter(&#039;epl_opts_area_unit_filter&#039;, &#039;_8j0rn_epl_opts_area_unit_filter&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.9. Переопределяем периоды оплаты===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Переопределяем периоды оплаты&lt;br /&gt;
function _8j0rn_epl_rent_period_opts($options) {&lt;br /&gt;
    // Удаляем ненужные опции&lt;br /&gt;
    unset( $options[&#039;day&#039;] );&lt;br /&gt;
	unset( $options[&#039;daily&#039;] );&lt;br /&gt;
	unset( $options[&#039;week&#039;] );&lt;br /&gt;
	unset( $options[&#039;weekly&#039;] );&lt;br /&gt;
	unset( $options[&#039;month&#039;] );&lt;br /&gt;
	unset( $options[&#039;monthly&#039;] );&lt;br /&gt;
	// Добавляем нужные опции&lt;br /&gt;
	$options[&#039;_in_month&#039;] = __( &#039; in month&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
	$options[&#039;_in_year&#039;] = __( &#039; in year&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
	$options[&#039;_in_week&#039;] = __( &#039; in week&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
	$options[&#039;_in_day&#039;] = __( &#039; in day&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
    return $options;&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;epl_opts_rent_period_filter&#039;, &#039;_8j0rn_epl_rent_period_opts&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.10. Исправляем отсутствие перевода периода оплаты в админке в столбце Аренда===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Исправляем отсутствие перевода периода оплаты в админке в столбце Аренда&lt;br /&gt;
function _8j0rn_translate_rent_period( $price_rent_period ) {&lt;br /&gt;
    // Массив переводов (должен совпадать с тем, что в _8j0rn_epl_rent_period_opts)&lt;br /&gt;
    $rent_period_translations = array(&lt;br /&gt;
        &#039;_in_month&#039; =&amp;gt; __( &#039; in month&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
        &#039;_in_year&#039;  =&amp;gt; __( &#039; in year&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
        &#039;_in_week&#039;  =&amp;gt; __( &#039; in week&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
        &#039;_in_day&#039;   =&amp;gt; __( &#039; in day&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Если значение $price_rent_period есть в массиве, возвращаем перевод&lt;br /&gt;
    if ( isset( $rent_period_translations[$price_rent_period] ) ) {&lt;br /&gt;
        return $rent_period_translations[$price_rent_period];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Если значение не найдено, возвращаем оригинальное значение&lt;br /&gt;
    return $price_rent_period;&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;epl_price_rent_period&#039;, &#039;_8j0rn_translate_rent_period&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.11. Исправляем адреса в карточках объектов===&lt;br /&gt;
====2.11.1. Функция для форматирования адреса====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Кастомная функция для форматирования адреса&lt;br /&gt;
function _8i0rn_get_formatted_property_address($street, $street_separator = true, $separator_symbol = &#039;,&#039;) {&lt;br /&gt;
    // Получаем объект текущего свойства&lt;br /&gt;
    global $property;&lt;br /&gt;
	/*&lt;br /&gt;
	// Проверяем, что $property является объектом и имеет метод get_property_meta&lt;br /&gt;
    if (!is_object($property) || !method_exists($property, &#039;get_property_meta&#039;)) {&lt;br /&gt;
        return $street; // Возвращаем оригинальный адрес, если объект не корректен&lt;br /&gt;
    }&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	$_8i0rn_street = &#039;&#039;;&lt;br /&gt;
	&lt;br /&gt;
	// Добавляем название улицы&lt;br /&gt;
	$street_name = $property-&amp;gt;get_property_meta( &#039;property_address_street&#039; );&lt;br /&gt;
	if ( ! empty( $street_name ) ) {&lt;br /&gt;
		$_8i0rn_street .= $street_name;&lt;br /&gt;
	}&lt;br /&gt;
	// Добавляем номер дома&lt;br /&gt;
	$street_number = $property-&amp;gt;get_property_meta( &#039;property_address_street_number&#039; );&lt;br /&gt;
	if ( ! empty( $street_number ) ) {&lt;br /&gt;
		$_8i0rn_street .= &#039; дом &#039; . $street_number;&lt;br /&gt;
	}&lt;br /&gt;
	//Добавляем саб-номер дома&lt;br /&gt;
	$sub_number = $property-&amp;gt;get_property_meta( &#039;property_address_sub_number&#039; );&lt;br /&gt;
	if ( ! empty( $sub_number ) ) {&lt;br /&gt;
		$_8i0rn_street .= &#039; кв. &#039; . $sub_number . &#039; &#039;;&lt;br /&gt;
	}&lt;br /&gt;
	// Добавляем номер квартиры&lt;br /&gt;
	$lot_number = $property-&amp;gt;get_property_meta( &#039;property_address_lot_number&#039; );&lt;br /&gt;
	if ( ! empty( $lot_number ) ) {&lt;br /&gt;
		$_8i0rn_street .= &#039;лот № &#039; . $lot_number . &#039; &#039;;&lt;br /&gt;
		if ( true === $street_separator ) {&lt;br /&gt;
			$separator_symbol = apply_filters( &#039;epl_property_address_separator&#039;, $separator_symbol );&lt;br /&gt;
			$_8i0rn_street          .= $separator_symbol;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return $_8i0rn_street;&lt;br /&gt;
}&lt;br /&gt;
// Подключаем кастомную функцию через фильтр&lt;br /&gt;
add_filter(&#039;epl_get_formatted_property_address&#039;, &#039;_8i0rn_get_formatted_property_address&#039;, 10, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====2.11.2. Новая функция формирования адресов====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Новая функция формирования адресов&lt;br /&gt;
function _8j0rn_epl_property_the_address( $full = true, $street_separator = true, $separator_symbol = &#039;,&#039; ) {&lt;br /&gt;
&lt;br /&gt;
	global $property, $epl_settings;&lt;br /&gt;
&lt;br /&gt;
	if ( ! is_bool( $full ) ) {&lt;br /&gt;
		$full = true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$epl_property_address_separator        = apply_filters( &#039;epl_property_address_separator&#039;, &#039;,&#039; ); // Улица и дом&lt;br /&gt;
	$epl_property_address_separator_suburb = apply_filters( &#039;epl_property_address_separator_suburb&#039;, false ); // &lt;br /&gt;
	$epl_property_address_separator_city   = apply_filters( &#039;epl_property_address_separator_city&#039;, false );&lt;br /&gt;
&lt;br /&gt;
	?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;?php&lt;br /&gt;
	$text_link = &#039;&#039;;&lt;br /&gt;
	if ( true === $full ) {&lt;br /&gt;
		?&amp;gt;&lt;br /&gt;
		&amp;lt;span class=&amp;quot;entry-title-sub&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;quot;item-pcode&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
			// Выводим индекс&lt;br /&gt;
			echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_postal_code&#039; ) ); &lt;br /&gt;
			$text_link .= esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_postal_code&#039; ) ) ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			// Выводим страну (если настройки того требуют)&lt;br /&gt;
			if ( &#039;yes&#039; === $property-&amp;gt;get_epl_settings( &#039;epl_enable_country_field&#039; ) ) {&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;item-country&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;
				echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_country&#039; ) ); &lt;br /&gt;
				$text_link .= &#039; &#039; . esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_country&#039; ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
			}&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;quot;item-state&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;
			// Выводим область&lt;br /&gt;
			echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_state&#039; ) ); &lt;br /&gt;
			$text_link .= &#039; &#039; . esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_state&#039; ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
						&amp;lt;?php&lt;br /&gt;
			if ( &#039;yes&#039; === $property-&amp;gt;get_epl_settings( &#039;epl_enable_city_field&#039; ) ) {&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;item-city&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;
				// Выводим город&lt;br /&gt;
				echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_city&#039; ) ); &lt;br /&gt;
				$text_link .= &#039; &#039; . esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_city&#039; ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
				if ( true === $epl_property_address_separator_city &amp;amp;&amp;amp; strlen( trim( $property-&amp;gt;get_property_meta( &#039;property_address_city&#039; ) ) ) ) {&lt;br /&gt;
					echo &#039;&amp;lt;span class=&amp;quot;item-separator&amp;quot;&amp;gt;&#039; . esc_attr( $epl_property_address_separator ) . &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
					$text_link .= &#039; &#039; . esc_attr( $epl_property_address_separator );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			// Определяем категорию объекта Коммерческая/Бизнес или Аренда/Продажа (Коммерческая/Бизнес не обновлял за ненадобностью)&lt;br /&gt;
			if ( &#039;commercial&#039; === $property-&amp;gt;post_type || &#039;business&#039; === $property-&amp;gt;post_type ) {&lt;br /&gt;
				if ( &#039;yes&#039; === $property-&amp;gt;get_property_meta( &#039;property_com_display_suburb&#039; ) || &#039;yes&#039; === $property-&amp;gt;get_property_meta( &#039;property_address_display&#039; ) ) {&lt;br /&gt;
					?&amp;gt;&lt;br /&gt;
					&amp;lt;span class=&amp;quot;item-suburb&amp;quot;&amp;gt;(Коммерческие-Бизнес требует настройки)&amp;lt;?php echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ); &lt;br /&gt;
					$text_link .= &#039; &#039; . esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
					&amp;lt;?php&lt;br /&gt;
					if ( true === $epl_property_address_separator_suburb &amp;amp;&amp;amp; strlen( trim( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ) ) ) {&lt;br /&gt;
						echo &#039;&amp;lt;span class=&amp;quot;item-separator&amp;quot;&amp;gt;&#039; . esc_attr( $epl_property_address_separator ) . &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
						$text_link .= &#039; &#039; . esc_attr( $epl_property_address_separator );&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;item-suburb&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;
				// выводим город-область-индекс (нужно исправить на индекс-область-город)&lt;br /&gt;
				echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ); &lt;br /&gt;
				$text_link .= &#039; &#039; . esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
				if ( true === $epl_property_address_separator_suburb &amp;amp;&amp;amp; strlen( trim( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ) ) ) {&lt;br /&gt;
					echo &#039;&amp;lt;span class=&amp;quot;item-separator&amp;quot;&amp;gt;&#039; . esc_attr( $epl_property_address_separator ) . &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
					$text_link .= &#039; &#039; . esc_attr( $epl_property_address_separator );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/span&amp;gt;&lt;br /&gt;
		&amp;lt;?php // выводим дом и улицу (нужно исправить на улица-дом)&lt;br /&gt;
		if ( &#039;yes&#039; === $property-&amp;gt;get_property_meta( &#039;property_address_display&#039; ) ) { ?&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;quot;item-street&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;
			echo wp_kses_post( $property-&amp;gt;get_formatted_property_address( $street_separator, $separator_symbol ) ); &lt;br /&gt;
			$text_link .= &#039; &#039; . wp_kses_post( $property-&amp;gt;get_formatted_property_address( $street_separator, $separator_symbol ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
		&amp;lt;?php } ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php&lt;br /&gt;
	}&lt;br /&gt;
	echo &#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&#039; . $text_link . &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
}&lt;br /&gt;
// Отключаем старые экшены&lt;br /&gt;
function remove_epl_default_actions() {&lt;br /&gt;
    remove_action(&#039;epl_property_title&#039;, &#039;epl_property_the_address&#039;, 10);&lt;br /&gt;
    remove_action(&#039;epl_property_tab_address&#039;, &#039;epl_property_the_address&#039;, 10);&lt;br /&gt;
    remove_action(&#039;epl_property_address&#039;, &#039;epl_property_the_address&#039;, 10);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_default_actions&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====2.11.3. Заключительные настройки исправления адресов карточек====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Подключаем новые экшены&lt;br /&gt;
function add_custom_epl_actions() {&lt;br /&gt;
    add_action(&#039;epl_property_title&#039;, &#039;_8j0rn_epl_property_the_address&#039;, 10, 3);&lt;br /&gt;
    add_action(&#039;epl_property_tab_address&#039;, &#039;_8j0rn_epl_property_the_address&#039;, 10, 3);&lt;br /&gt;
    add_action(&#039;epl_property_address&#039;, &#039;_8j0rn_epl_property_the_address&#039;, 10, 3);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;add_custom_epl_actions&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=295</id>
		<title>Wp:plugin:easy-property-listings</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=295"/>
		<updated>2025-03-19T17:46:14Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здеся я буду хранить все изменения что я внес в плагин Easy Property Listings Plugin:&lt;br /&gt;
&lt;br /&gt;
Делая сайт заказчику использовал плагин Property Listings Plugin. &lt;br /&gt;
&lt;br /&gt;
== 1. Сделал полный перевод плагину ==&lt;br /&gt;
Полный перевод плагина Property Listings Plugin: ([[:File:Easy-property-listings-ru RU.zip|Cкачать архив ZIP]])&lt;br /&gt;
&lt;br /&gt;
== 2. Исправления через functions.php ==&lt;br /&gt;
Основные исправления делал через [[Wp:function|functions.php]] и поскольку для заказчика использовалась тема [[Wp:theme:storefront|StoreFront]] то все изменения вносил через нее.&lt;br /&gt;
&lt;br /&gt;
=== 2.1. Отключаем поддержку комментариев для всех типов записей===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем поддержку комментариев для всех типов записей&lt;br /&gt;
	function disable_comments_support() {&lt;br /&gt;
		// Отключаем поддержку комментариев для постов&lt;br /&gt;
		remove_post_type_support(&#039;post&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для страниц&lt;br /&gt;
		remove_post_type_support(&#039;page&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для медиафайлов&lt;br /&gt;
		remove_post_type_support(&#039;attachment&#039;, &#039;comments&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;init&#039;, &#039;disable_comments_support&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.2. Скрываем существующие комментарии===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Скрываем существующие комментарии&lt;br /&gt;
	function disable_comments_admin() {&lt;br /&gt;
		// Скрываем раздел &amp;quot;Комментарии&amp;quot; в админ-панели&lt;br /&gt;
		remove_menu_page(&#039;edit-comments.php&#039;);&lt;br /&gt;
		// Скрываем метабокс с комментариями на странице редактирования записей&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;post&#039;, &#039;normal&#039;);&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;page&#039;, &#039;normal&#039;);&lt;br /&gt;
		// Скрываем метабокс с последними комментариями в консоли&lt;br /&gt;
		remove_meta_box(&#039;dashboard_recent_comments&#039;, &#039;dashboard&#039;, &#039;normal&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;admin_menu&#039;, &#039;disable_comments_admin&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.3. Отключаем комментарии в REST API===&lt;br /&gt;
Если отключаете комментарии, то отключите их и в REST API, иначе могут спамеры замучать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем комментарии в REST API&lt;br /&gt;
	function disable_comments_rest_api($open, $post_id) {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
	add_filter(&#039;pings_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
&lt;br /&gt;
	// Удаляем комментарии из шаблонов&lt;br /&gt;
	function remove_comments_template() {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_template&#039;, &#039;remove_comments_template&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.4. Удаляем подписи под постами===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Удаляем подписи под постами&lt;br /&gt;
function remove_author_box() {&lt;br /&gt;
	// Удаляем хук, который выводит блок автора&lt;br /&gt;
	remove_action(&#039;epl_single_author&#039;, &#039;epl_property_author_box&#039;);&lt;br /&gt;
	remove_action(&#039;wpbf_after_article&#039;, &#039;wpbf_author_box&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_author_box&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.5. Изменение функции плагина easy-property-listings ===&lt;br /&gt;
Кнопка &amp;quot;План помещения&amp;quot; открывала картинку в новом окне, пришлось переписать функцию чтобы открывалась в лайтбокс (lightbox), для этого еще пришлось добавить загрузку [[Wp:function:adding-download-magnific_popup|magnific_popup]] и [[Wp:function:adding-download-fancybox|fancybox]] js script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
// Изменение функции плагина easy-property-listings&lt;br /&gt;
// (epl_button_floor_plan() отключаем и включаем &lt;br /&gt;
// свою функцию)&lt;br /&gt;
function remove_epl_button_floor_plan() {&lt;br /&gt;
	// Отключаем стандартную функцию&lt;br /&gt;
	remove_action(&#039;epl_buttons_single_property&#039;, &#039;epl_button_floor_plan&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_button_floor_plan&#039;);&lt;br /&gt;
&lt;br /&gt;
function _8j0rn_button_floor_plan() {&lt;br /&gt;
	// Кастомный код&lt;br /&gt;
	$keys = apply_filters( &#039;epl_floorplan_keys&#039;, array( &#039;property_floorplan&#039;, &#039;property_floorplan_2&#039; ) );&lt;br /&gt;
&lt;br /&gt;
	foreach ( $keys as $key ) {&lt;br /&gt;
&lt;br /&gt;
		$link       = get_post_meta( get_the_ID(), $key, true );&lt;br /&gt;
		$count      = &#039;property_floorplan&#039; === $key ? &#039;&#039; : substr( $key, - 1 );&lt;br /&gt;
		$default    = __( &#039;Floor Plan &#039;, &#039;easy-property-listings&#039; ) . $count;&lt;br /&gt;
		$meta_label = get_post_meta( get_the_ID(), $key . &#039;_label&#039;, true );&lt;br /&gt;
		$meta_label = empty( $meta_label ) ? $default : $meta_label;&lt;br /&gt;
&lt;br /&gt;
		if ( is_array( $link ) ) { // Fallback if metadata is saved as an array.&lt;br /&gt;
&lt;br /&gt;
			if ( ! empty( $link[&#039;image_url_or_path&#039;] ) ) {&lt;br /&gt;
				$link = $link[&#039;image_url_or_path&#039;];&lt;br /&gt;
			} else {&lt;br /&gt;
				$link = &#039;&#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( ! empty( $link ) &amp;amp;&amp;amp; apply_filters( &#039;epl_show_&#039; . $key, true ) ) { ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;epl-button epl-floor-plan epl-floor-plan-&amp;lt;?php echo absint( $count ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-image=&amp;quot;&amp;lt;?php echo esc_url( $link ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-caption=&amp;quot;&amp;lt;?php echo esc_attr( $meta_label ); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
				$filter_key = str_replace( &#039;property_&#039;, &#039;&#039;, $key );&lt;br /&gt;
				if ( has_filter( &#039;epl_button_label_&#039; . $filter_key ) ) {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_&#039; . $filter_key, $meta_label );&lt;br /&gt;
				} else {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_floorplan&#039;, $meta_label );&lt;br /&gt;
				}&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo esc_html( $label ); ?&amp;gt;&lt;br /&gt;
			&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;epl_buttons_single_property&#039;, &#039;_8j0rn_button_floor_plan&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.6. Изменение кривой функции плагина easy-property-listings (epl_button_floor_plan() отключаем и включаем свою функцию)===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Изменение кривой функции плагина easy-property-listings&lt;br /&gt;
// (epl_button_floor_plan() отключаем и включаем свою функцию)&lt;br /&gt;
// Удаляем существующий хук&lt;br /&gt;
function remove_epl_manage_listing_column_listing_type_callback() {&lt;br /&gt;
	remove_action( &#039;epl_manage_listing_column_listing_type&#039;, &#039;epl_manage_listing_column_listing_type_callback&#039; );&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_manage_listing_column_listing_type_callback&#039;);&lt;br /&gt;
&lt;br /&gt;
// Добавляем новый хук с кастомной функцией&lt;br /&gt;
function _8j0rn_epl_manage_listing_column_listing_type_callback() {&lt;br /&gt;
	global $post;&lt;br /&gt;
&lt;br /&gt;
	// Get the post meta.&lt;br /&gt;
	$listing_type = get_post_meta( $post-&amp;gt;ID, &#039;property_com_listing_type&#039;, true );&lt;br /&gt;
&lt;br /&gt;
	// If no duration is found, output a default message.&lt;br /&gt;
	if ( ! empty( $listing_type ) ) {&lt;br /&gt;
		switch ($listing_type) {&lt;br /&gt;
			case &#039;lease&#039;:&lt;br /&gt;
				echo esc_html__( &#039;For Lease&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;sale&#039;:&lt;br /&gt;
				echo esc_html__( &#039;For Sale&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;both&#039;:&lt;br /&gt;
				echo esc_html__( &#039;For Sale &amp;amp; Lease&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
add_action( &#039;epl_manage_listing_column_listing_type&#039;, &#039;_8j0rn_epl_manage_listing_column_listing_type_callback&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.7. Изменяем список категорий в разделе Коммерческие===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Изменяем список категорий в разделе Коммерческие&lt;br /&gt;
function _8j0rn_epl_listing_meta_commercial_category($defaults) {&lt;br /&gt;
	// Удаляем ненужные категории&lt;br /&gt;
	unset($defaults[&#039;Commercial Farming&#039;]);&lt;br /&gt;
	unset($defaults[&#039;Land/Development&#039;]);&lt;br /&gt;
	unset($defaults[&#039;Other&#039;]);&lt;br /&gt;
	&lt;br /&gt;
	// Изменяем или добавляем новые категории&lt;br /&gt;
	//$defaults[&#039;Commercial Farming&#039;] = __( &#039;Farming&#039;, &#039;easy-property-listings&#039; ); // Изменяем существующую категорию&lt;br /&gt;
	$defaults[&#039;Public catering&#039;] = __( &#039;Public catering&#039;, &#039;easy-property-listings&#039; ); // Добавляем новую категорию&lt;br /&gt;
	&lt;br /&gt;
	// Добавляем в конец Другое&lt;br /&gt;
	$defaults[&#039;Other&#039;] = __( &#039;Other&#039;, &#039;easy-property-listings&#039; ); // Добавляем новую категорию&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	return $defaults;&lt;br /&gt;
}&lt;br /&gt;
add_filter(&#039;epl_listing_meta_commercial_category&#039;, &#039;_8j0rn_epl_listing_meta_commercial_category&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.8. Переопределяем список единиц измерения площади===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Переопределяем список единиц измерения площади&lt;br /&gt;
function _8j0rn_epl_opts_area_unit_filter($defaults) {&lt;br /&gt;
	// Удаляем ненужные единицы&lt;br /&gt;
	unset($defaults[&#039;square&#039;]);&lt;br /&gt;
	unset($defaults[&#039;acre&#039;]);&lt;br /&gt;
	unset($defaults[&#039;sqft&#039;]);&lt;br /&gt;
	// Изменяем или добавляем новые единицы измерения&lt;br /&gt;
	$defaults[&#039;squareMeter&#039;]      = __( &#039;square meter&#039;, &#039;easy-property-listings&#039; ); // Изменяем существующую единицу&lt;br /&gt;
	$defaults[&#039;sotka&#039;]    = __( &#039;Sotka&#039;, &#039;easy-property-listings&#039; ); // Добавляем новую единицу&lt;br /&gt;
	return $defaults;&lt;br /&gt;
}&lt;br /&gt;
add_filter(&#039;epl_opts_area_unit_filter&#039;, &#039;_8j0rn_epl_opts_area_unit_filter&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.9. Переопределяем периоды оплаты===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Переопределяем периоды оплаты&lt;br /&gt;
function _8j0rn_epl_rent_period_opts($options) {&lt;br /&gt;
    // Удаляем ненужные опции&lt;br /&gt;
    unset( $options[&#039;day&#039;] );&lt;br /&gt;
	unset( $options[&#039;daily&#039;] );&lt;br /&gt;
	unset( $options[&#039;week&#039;] );&lt;br /&gt;
	unset( $options[&#039;weekly&#039;] );&lt;br /&gt;
	unset( $options[&#039;month&#039;] );&lt;br /&gt;
	unset( $options[&#039;monthly&#039;] );&lt;br /&gt;
	// Добавляем нужные опции&lt;br /&gt;
	$options[&#039;_in_month&#039;] = __( &#039; in month&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
	$options[&#039;_in_year&#039;] = __( &#039; in year&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
	$options[&#039;_in_week&#039;] = __( &#039; in week&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
	$options[&#039;_in_day&#039;] = __( &#039; in day&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
    return $options;&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;epl_opts_rent_period_filter&#039;, &#039;_8j0rn_epl_rent_period_opts&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.10. Исправляем отсутствие перевода периода оплаты в админке в столбце Аренда===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Исправляем отсутствие перевода периода оплаты в админке в столбце Аренда&lt;br /&gt;
function _8j0rn_translate_rent_period( $price_rent_period ) {&lt;br /&gt;
    // Массив переводов (должен совпадать с тем, что в _8j0rn_epl_rent_period_opts)&lt;br /&gt;
    $rent_period_translations = array(&lt;br /&gt;
        &#039;_in_month&#039; =&amp;gt; __( &#039; in month&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
        &#039;_in_year&#039;  =&amp;gt; __( &#039; in year&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
        &#039;_in_week&#039;  =&amp;gt; __( &#039; in week&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
        &#039;_in_day&#039;   =&amp;gt; __( &#039; in day&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Если значение $price_rent_period есть в массиве, возвращаем перевод&lt;br /&gt;
    if ( isset( $rent_period_translations[$price_rent_period] ) ) {&lt;br /&gt;
        return $rent_period_translations[$price_rent_period];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Если значение не найдено, возвращаем оригинальное значение&lt;br /&gt;
    return $price_rent_period;&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;epl_price_rent_period&#039;, &#039;_8j0rn_translate_rent_period&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.11. Исправляем адреса в карточках объектов===&lt;br /&gt;
====2.11.1. Функция для форматирования адреса====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Кастомная функция для форматирования адреса&lt;br /&gt;
function _8i0rn_get_formatted_property_address($street, $street_separator = true, $separator_symbol = &#039;,&#039;) {&lt;br /&gt;
    // Получаем объект текущего свойства&lt;br /&gt;
    global $property;&lt;br /&gt;
	/*&lt;br /&gt;
	// Проверяем, что $property является объектом и имеет метод get_property_meta&lt;br /&gt;
    if (!is_object($property) || !method_exists($property, &#039;get_property_meta&#039;)) {&lt;br /&gt;
        return $street; // Возвращаем оригинальный адрес, если объект не корректен&lt;br /&gt;
    }&lt;br /&gt;
	*/&lt;br /&gt;
	&lt;br /&gt;
	$_8i0rn_street = &#039;&#039;;&lt;br /&gt;
	&lt;br /&gt;
	// Добавляем название улицы&lt;br /&gt;
	$street_name = $property-&amp;gt;get_property_meta( &#039;property_address_street&#039; );&lt;br /&gt;
	if ( ! empty( $street_name ) ) {&lt;br /&gt;
		$_8i0rn_street .= $street_name;&lt;br /&gt;
	}&lt;br /&gt;
	// Добавляем номер дома&lt;br /&gt;
	$street_number = $property-&amp;gt;get_property_meta( &#039;property_address_street_number&#039; );&lt;br /&gt;
	if ( ! empty( $street_number ) ) {&lt;br /&gt;
		$_8i0rn_street .= &#039; дом &#039; . $street_number;&lt;br /&gt;
	}&lt;br /&gt;
	//Добавляем саб-номер дома&lt;br /&gt;
	$sub_number = $property-&amp;gt;get_property_meta( &#039;property_address_sub_number&#039; );&lt;br /&gt;
	if ( ! empty( $sub_number ) ) {&lt;br /&gt;
		$_8i0rn_street .= &#039; кв. &#039; . $sub_number . &#039; &#039;;&lt;br /&gt;
	}&lt;br /&gt;
	// Добавляем номер квартиры&lt;br /&gt;
	$lot_number = $property-&amp;gt;get_property_meta( &#039;property_address_lot_number&#039; );&lt;br /&gt;
	if ( ! empty( $lot_number ) ) {&lt;br /&gt;
		$_8i0rn_street .= &#039;лот № &#039; . $lot_number . &#039; &#039;;&lt;br /&gt;
		if ( true === $street_separator ) {&lt;br /&gt;
			$separator_symbol = apply_filters( &#039;epl_property_address_separator&#039;, $separator_symbol );&lt;br /&gt;
			$_8i0rn_street          .= $separator_symbol;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return $_8i0rn_street;&lt;br /&gt;
}&lt;br /&gt;
// Подключаем кастомную функцию через фильтр&lt;br /&gt;
add_filter(&#039;epl_get_formatted_property_address&#039;, &#039;_8i0rn_get_formatted_property_address&#039;, 10, 1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====2.11.2. Новая функция формирования адресов====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Новая функция формирования адресов&lt;br /&gt;
function _8j0rn_epl_property_the_address( $full = true, $street_separator = true, $separator_symbol = &#039;,&#039; ) {&lt;br /&gt;
&lt;br /&gt;
	global $property, $epl_settings;&lt;br /&gt;
&lt;br /&gt;
	if ( ! is_bool( $full ) ) {&lt;br /&gt;
		$full = true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$epl_property_address_separator        = apply_filters( &#039;epl_property_address_separator&#039;, &#039;,&#039; ); // Улица и дом&lt;br /&gt;
	$epl_property_address_separator_suburb = apply_filters( &#039;epl_property_address_separator_suburb&#039;, false ); // &lt;br /&gt;
	$epl_property_address_separator_city   = apply_filters( &#039;epl_property_address_separator_city&#039;, false );&lt;br /&gt;
&lt;br /&gt;
	?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;?php&lt;br /&gt;
	$text_link = &#039;&#039;;&lt;br /&gt;
	if ( true === $full ) {&lt;br /&gt;
		?&amp;gt;&lt;br /&gt;
		&amp;lt;span class=&amp;quot;entry-title-sub&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;quot;item-pcode&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
			// Выводим индекс&lt;br /&gt;
			echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_postal_code&#039; ) ); &lt;br /&gt;
			$text_link .= esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_postal_code&#039; ) ) ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			// Выводим страну (если настройки того требуют)&lt;br /&gt;
			if ( &#039;yes&#039; === $property-&amp;gt;get_epl_settings( &#039;epl_enable_country_field&#039; ) ) {&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;item-country&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;
				echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_country&#039; ) ); &lt;br /&gt;
				$text_link .= &#039; &#039; . esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_country&#039; ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
			}&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;quot;item-state&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;
			// Выводим область&lt;br /&gt;
			echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_state&#039; ) ); &lt;br /&gt;
			$text_link .= &#039; &#039; . esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_state&#039; ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
						&amp;lt;?php&lt;br /&gt;
			if ( &#039;yes&#039; === $property-&amp;gt;get_epl_settings( &#039;epl_enable_city_field&#039; ) ) {&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;item-city&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;
				// Выводим город&lt;br /&gt;
				echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_city&#039; ) ); &lt;br /&gt;
				$text_link .= &#039; &#039; . esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_city&#039; ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
				if ( true === $epl_property_address_separator_city &amp;amp;&amp;amp; strlen( trim( $property-&amp;gt;get_property_meta( &#039;property_address_city&#039; ) ) ) ) {&lt;br /&gt;
					echo &#039;&amp;lt;span class=&amp;quot;item-separator&amp;quot;&amp;gt;&#039; . esc_attr( $epl_property_address_separator ) . &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
					$text_link .= &#039; &#039; . esc_attr( $epl_property_address_separator );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			// Определяем категорию объекта Коммерческая/Бизнес или Аренда/Продажа (Коммерческая/Бизнес не обновлял за ненадобностью)&lt;br /&gt;
			if ( &#039;commercial&#039; === $property-&amp;gt;post_type || &#039;business&#039; === $property-&amp;gt;post_type ) {&lt;br /&gt;
				if ( &#039;yes&#039; === $property-&amp;gt;get_property_meta( &#039;property_com_display_suburb&#039; ) || &#039;yes&#039; === $property-&amp;gt;get_property_meta( &#039;property_address_display&#039; ) ) {&lt;br /&gt;
					?&amp;gt;&lt;br /&gt;
					&amp;lt;span class=&amp;quot;item-suburb&amp;quot;&amp;gt;(Коммерческие-Бизнес требует настройки)&amp;lt;?php echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ); &lt;br /&gt;
					$text_link .= &#039; &#039; . esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
					&amp;lt;?php&lt;br /&gt;
					if ( true === $epl_property_address_separator_suburb &amp;amp;&amp;amp; strlen( trim( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ) ) ) {&lt;br /&gt;
						echo &#039;&amp;lt;span class=&amp;quot;item-separator&amp;quot;&amp;gt;&#039; . esc_attr( $epl_property_address_separator ) . &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
						$text_link .= &#039; &#039; . esc_attr( $epl_property_address_separator );&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;span class=&amp;quot;item-suburb&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;
				// выводим город-область-индекс (нужно исправить на индекс-область-город)&lt;br /&gt;
				echo esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ); &lt;br /&gt;
				$text_link .= &#039; &#039; . esc_attr( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
				if ( true === $epl_property_address_separator_suburb &amp;amp;&amp;amp; strlen( trim( $property-&amp;gt;get_property_meta( &#039;property_address_suburb&#039; ) ) ) ) {&lt;br /&gt;
					echo &#039;&amp;lt;span class=&amp;quot;item-separator&amp;quot;&amp;gt;&#039; . esc_attr( $epl_property_address_separator ) . &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
					$text_link .= &#039; &#039; . esc_attr( $epl_property_address_separator );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/span&amp;gt;&lt;br /&gt;
		&amp;lt;?php // выводим дом и улицу (нужно исправить на улица-дом)&lt;br /&gt;
		if ( &#039;yes&#039; === $property-&amp;gt;get_property_meta( &#039;property_address_display&#039; ) ) { ?&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;quot;item-street&amp;quot;&amp;gt;&amp;lt;?php &lt;br /&gt;
			echo wp_kses_post( $property-&amp;gt;get_formatted_property_address( $street_separator, $separator_symbol ) ); &lt;br /&gt;
			$text_link .= &#039; &#039; . wp_kses_post( $property-&amp;gt;get_formatted_property_address( $street_separator, $separator_symbol ) ); ?&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
		&amp;lt;?php } ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php&lt;br /&gt;
	}&lt;br /&gt;
	echo &#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&#039; . $text_link . &#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
}&lt;br /&gt;
// Отключаем старые экшены&lt;br /&gt;
function remove_epl_default_actions() {&lt;br /&gt;
    remove_action(&#039;epl_property_title&#039;, &#039;epl_property_the_address&#039;, 10);&lt;br /&gt;
    remove_action(&#039;epl_property_tab_address&#039;, &#039;epl_property_the_address&#039;, 10);&lt;br /&gt;
    remove_action(&#039;epl_property_address&#039;, &#039;epl_property_the_address&#039;, 10);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_default_actions&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====2.11.3. Заключительные настройки исправления адресов карточек====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Подключаем новые экшены&lt;br /&gt;
function add_custom_epl_actions() {&lt;br /&gt;
    add_action(&#039;epl_property_title&#039;, &#039;_8j0rn_epl_property_the_address&#039;, 10, 3);&lt;br /&gt;
    add_action(&#039;epl_property_tab_address&#039;, &#039;_8j0rn_epl_property_the_address&#039;, 10, 3);&lt;br /&gt;
    add_action(&#039;epl_property_address&#039;, &#039;_8j0rn_epl_property_the_address&#039;, 10, 3);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;add_custom_epl_actions&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=294</id>
		<title>Wp:plugin:easy-property-listings</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=294"/>
		<updated>2025-03-08T13:25:31Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здеся я буду хранить все изменения что я внес в плагин Easy Property Listings Plugin:&lt;br /&gt;
&lt;br /&gt;
Делая сайт заказчику использовал плагин Property Listings Plugin. &lt;br /&gt;
&lt;br /&gt;
== 1. Сделал полный перевод плагину ==&lt;br /&gt;
Полный перевод плагина Property Listings Plugin: ([[:File:Easy-property-listings-ru RU.zip|Cкачать архив ZIP]])&lt;br /&gt;
&lt;br /&gt;
== 2. Исправления через functions.php ==&lt;br /&gt;
Основные исправления делал через [[Wp:function|functions.php]] и поскольку для заказчика использовалась тема [[Wp:theme:storefront|StoreFront]] то все изменения вносил через нее.&lt;br /&gt;
&lt;br /&gt;
=== 2.1. Отключаем поддержку комментариев для всех типов записей===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем поддержку комментариев для всех типов записей&lt;br /&gt;
	function disable_comments_support() {&lt;br /&gt;
		// Отключаем поддержку комментариев для постов&lt;br /&gt;
		remove_post_type_support(&#039;post&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для страниц&lt;br /&gt;
		remove_post_type_support(&#039;page&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для медиафайлов&lt;br /&gt;
		remove_post_type_support(&#039;attachment&#039;, &#039;comments&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;init&#039;, &#039;disable_comments_support&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.2. Скрываем существующие комментарии===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Скрываем существующие комментарии&lt;br /&gt;
	function disable_comments_admin() {&lt;br /&gt;
		// Скрываем раздел &amp;quot;Комментарии&amp;quot; в админ-панели&lt;br /&gt;
		remove_menu_page(&#039;edit-comments.php&#039;);&lt;br /&gt;
		// Скрываем метабокс с комментариями на странице редактирования записей&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;post&#039;, &#039;normal&#039;);&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;page&#039;, &#039;normal&#039;);&lt;br /&gt;
		// Скрываем метабокс с последними комментариями в консоли&lt;br /&gt;
		remove_meta_box(&#039;dashboard_recent_comments&#039;, &#039;dashboard&#039;, &#039;normal&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;admin_menu&#039;, &#039;disable_comments_admin&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.3. Отключаем комментарии в REST API===&lt;br /&gt;
Если отключаете комментарии, то отключите их и в REST API, иначе могут спамеры замучать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем комментарии в REST API&lt;br /&gt;
	function disable_comments_rest_api($open, $post_id) {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
	add_filter(&#039;pings_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
&lt;br /&gt;
	// Удаляем комментарии из шаблонов&lt;br /&gt;
	function remove_comments_template() {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_template&#039;, &#039;remove_comments_template&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.4. Удаляем подписи под постами===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Удаляем подписи под постами&lt;br /&gt;
function remove_author_box() {&lt;br /&gt;
	// Удаляем хук, который выводит блок автора&lt;br /&gt;
	remove_action(&#039;epl_single_author&#039;, &#039;epl_property_author_box&#039;);&lt;br /&gt;
	remove_action(&#039;wpbf_after_article&#039;, &#039;wpbf_author_box&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_author_box&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.5. Изменение функции плагина easy-property-listings ===&lt;br /&gt;
Кнопка &amp;quot;План помещения&amp;quot; открывала картинку в новом окне, пришлось переписать функцию чтобы открывалась в лайтбокс (lightbox), для этого еще пришлось добавить загрузку [[Wp:function:adding-download-magnific_popup|magnific_popup]] и [[Wp:function:adding-download-fancybox|fancybox]] js script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
// Изменение функции плагина easy-property-listings&lt;br /&gt;
// (epl_button_floor_plan() отключаем и включаем &lt;br /&gt;
// свою функцию)&lt;br /&gt;
function remove_epl_button_floor_plan() {&lt;br /&gt;
	// Отключаем стандартную функцию&lt;br /&gt;
	remove_action(&#039;epl_buttons_single_property&#039;, &#039;epl_button_floor_plan&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_button_floor_plan&#039;);&lt;br /&gt;
&lt;br /&gt;
function _8j0rn_button_floor_plan() {&lt;br /&gt;
	// Кастомный код&lt;br /&gt;
	$keys = apply_filters( &#039;epl_floorplan_keys&#039;, array( &#039;property_floorplan&#039;, &#039;property_floorplan_2&#039; ) );&lt;br /&gt;
&lt;br /&gt;
	foreach ( $keys as $key ) {&lt;br /&gt;
&lt;br /&gt;
		$link       = get_post_meta( get_the_ID(), $key, true );&lt;br /&gt;
		$count      = &#039;property_floorplan&#039; === $key ? &#039;&#039; : substr( $key, - 1 );&lt;br /&gt;
		$default    = __( &#039;Floor Plan &#039;, &#039;easy-property-listings&#039; ) . $count;&lt;br /&gt;
		$meta_label = get_post_meta( get_the_ID(), $key . &#039;_label&#039;, true );&lt;br /&gt;
		$meta_label = empty( $meta_label ) ? $default : $meta_label;&lt;br /&gt;
&lt;br /&gt;
		if ( is_array( $link ) ) { // Fallback if metadata is saved as an array.&lt;br /&gt;
&lt;br /&gt;
			if ( ! empty( $link[&#039;image_url_or_path&#039;] ) ) {&lt;br /&gt;
				$link = $link[&#039;image_url_or_path&#039;];&lt;br /&gt;
			} else {&lt;br /&gt;
				$link = &#039;&#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( ! empty( $link ) &amp;amp;&amp;amp; apply_filters( &#039;epl_show_&#039; . $key, true ) ) { ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;epl-button epl-floor-plan epl-floor-plan-&amp;lt;?php echo absint( $count ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-image=&amp;quot;&amp;lt;?php echo esc_url( $link ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-caption=&amp;quot;&amp;lt;?php echo esc_attr( $meta_label ); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
				$filter_key = str_replace( &#039;property_&#039;, &#039;&#039;, $key );&lt;br /&gt;
				if ( has_filter( &#039;epl_button_label_&#039; . $filter_key ) ) {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_&#039; . $filter_key, $meta_label );&lt;br /&gt;
				} else {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_floorplan&#039;, $meta_label );&lt;br /&gt;
				}&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo esc_html( $label ); ?&amp;gt;&lt;br /&gt;
			&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;epl_buttons_single_property&#039;, &#039;_8j0rn_button_floor_plan&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.6. Изменение кривой функции плагина easy-property-listings (epl_button_floor_plan() отключаем и включаем свою функцию)===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Изменение кривой функции плагина easy-property-listings&lt;br /&gt;
// (epl_button_floor_plan() отключаем и включаем свою функцию)&lt;br /&gt;
// Удаляем существующий хук&lt;br /&gt;
function remove_epl_manage_listing_column_listing_type_callback() {&lt;br /&gt;
	remove_action( &#039;epl_manage_listing_column_listing_type&#039;, &#039;epl_manage_listing_column_listing_type_callback&#039; );&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_manage_listing_column_listing_type_callback&#039;);&lt;br /&gt;
&lt;br /&gt;
// Добавляем новый хук с кастомной функцией&lt;br /&gt;
function _8j0rn_epl_manage_listing_column_listing_type_callback() {&lt;br /&gt;
	global $post;&lt;br /&gt;
&lt;br /&gt;
	// Get the post meta.&lt;br /&gt;
	$listing_type = get_post_meta( $post-&amp;gt;ID, &#039;property_com_listing_type&#039;, true );&lt;br /&gt;
&lt;br /&gt;
	// If no duration is found, output a default message.&lt;br /&gt;
	if ( ! empty( $listing_type ) ) {&lt;br /&gt;
		switch ($listing_type) {&lt;br /&gt;
			case &#039;lease&#039;:&lt;br /&gt;
				echo esc_html__( &#039;For Lease&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;sale&#039;:&lt;br /&gt;
				echo esc_html__( &#039;For Sale&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
				break;&lt;br /&gt;
			case &#039;both&#039;:&lt;br /&gt;
				echo esc_html__( &#039;For Sale &amp;amp; Lease&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
add_action( &#039;epl_manage_listing_column_listing_type&#039;, &#039;_8j0rn_epl_manage_listing_column_listing_type_callback&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.7. Изменяем список категорий в разделе Коммерческие===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Изменяем список категорий в разделе Коммерческие&lt;br /&gt;
function _8j0rn_epl_listing_meta_commercial_category($defaults) {&lt;br /&gt;
	// Удаляем ненужные категории&lt;br /&gt;
	unset($defaults[&#039;Commercial Farming&#039;]);&lt;br /&gt;
	unset($defaults[&#039;Land/Development&#039;]);&lt;br /&gt;
	unset($defaults[&#039;Other&#039;]);&lt;br /&gt;
	&lt;br /&gt;
	// Изменяем или добавляем новые категории&lt;br /&gt;
	//$defaults[&#039;Commercial Farming&#039;] = __( &#039;Farming&#039;, &#039;easy-property-listings&#039; ); // Изменяем существующую категорию&lt;br /&gt;
	$defaults[&#039;Public catering&#039;] = __( &#039;Public catering&#039;, &#039;easy-property-listings&#039; ); // Добавляем новую категорию&lt;br /&gt;
	&lt;br /&gt;
	// Добавляем в конец Другое&lt;br /&gt;
	$defaults[&#039;Other&#039;] = __( &#039;Other&#039;, &#039;easy-property-listings&#039; ); // Добавляем новую категорию&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	return $defaults;&lt;br /&gt;
}&lt;br /&gt;
add_filter(&#039;epl_listing_meta_commercial_category&#039;, &#039;_8j0rn_epl_listing_meta_commercial_category&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.8. Переопределяем список единиц измерения площади===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Переопределяем список единиц измерения площади&lt;br /&gt;
function _8j0rn_epl_opts_area_unit_filter($defaults) {&lt;br /&gt;
	// Удаляем ненужные единицы&lt;br /&gt;
	unset($defaults[&#039;square&#039;]);&lt;br /&gt;
	unset($defaults[&#039;acre&#039;]);&lt;br /&gt;
	unset($defaults[&#039;sqft&#039;]);&lt;br /&gt;
	// Изменяем или добавляем новые единицы измерения&lt;br /&gt;
	$defaults[&#039;squareMeter&#039;]      = __( &#039;square meter&#039;, &#039;easy-property-listings&#039; ); // Изменяем существующую единицу&lt;br /&gt;
	$defaults[&#039;sotka&#039;]    = __( &#039;Sotka&#039;, &#039;easy-property-listings&#039; ); // Добавляем новую единицу&lt;br /&gt;
	return $defaults;&lt;br /&gt;
}&lt;br /&gt;
add_filter(&#039;epl_opts_area_unit_filter&#039;, &#039;_8j0rn_epl_opts_area_unit_filter&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.9. Переопределяем периоды оплаты===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Переопределяем периоды оплаты&lt;br /&gt;
function _8j0rn_epl_rent_period_opts($options) {&lt;br /&gt;
    // Удаляем ненужные опции&lt;br /&gt;
    unset( $options[&#039;day&#039;] );&lt;br /&gt;
	unset( $options[&#039;daily&#039;] );&lt;br /&gt;
	unset( $options[&#039;week&#039;] );&lt;br /&gt;
	unset( $options[&#039;weekly&#039;] );&lt;br /&gt;
	unset( $options[&#039;month&#039;] );&lt;br /&gt;
	unset( $options[&#039;monthly&#039;] );&lt;br /&gt;
	// Добавляем нужные опции&lt;br /&gt;
	$options[&#039;_in_month&#039;] = __( &#039; in month&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
	$options[&#039;_in_year&#039;] = __( &#039; in year&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
	$options[&#039;_in_week&#039;] = __( &#039; in week&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
	$options[&#039;_in_day&#039;] = __( &#039; in day&#039;, &#039;easy-property-listings&#039; );&lt;br /&gt;
    return $options;&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;epl_opts_rent_period_filter&#039;, &#039;_8j0rn_epl_rent_period_opts&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.10. Исправляем отсутствие перевода периода оплаты в админке в столбце Аренда===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Исправляем отсутствие перевода периода оплаты в админке в столбце Аренда&lt;br /&gt;
function _8j0rn_translate_rent_period( $price_rent_period ) {&lt;br /&gt;
    // Массив переводов (должен совпадать с тем, что в _8j0rn_epl_rent_period_opts)&lt;br /&gt;
    $rent_period_translations = array(&lt;br /&gt;
        &#039;_in_month&#039; =&amp;gt; __( &#039; in month&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
        &#039;_in_year&#039;  =&amp;gt; __( &#039; in year&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
        &#039;_in_week&#039;  =&amp;gt; __( &#039; in week&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
        &#039;_in_day&#039;   =&amp;gt; __( &#039; in day&#039;, &#039;easy-property-listings&#039; ),&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Если значение $price_rent_period есть в массиве, возвращаем перевод&lt;br /&gt;
    if ( isset( $rent_period_translations[$price_rent_period] ) ) {&lt;br /&gt;
        return $rent_period_translations[$price_rent_period];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Если значение не найдено, возвращаем оригинальное значение&lt;br /&gt;
    return $price_rent_period;&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;epl_price_rent_period&#039;, &#039;_8j0rn_translate_rent_period&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=293</id>
		<title>Wp:plugin:easy-property-listings</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=293"/>
		<updated>2025-03-08T13:18:52Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: /* 2.5. Изменение функции плагина easy-property-listings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здеся я буду хранить все изменения что я внес в плагин Easy Property Listings Plugin:&lt;br /&gt;
&lt;br /&gt;
Делая сайт заказчику использовал плагин Property Listings Plugin. &lt;br /&gt;
&lt;br /&gt;
== 1. Сделал полный перевод плагину ==&lt;br /&gt;
Полный перевод плагина Property Listings Plugin: ([[:File:Easy-property-listings-ru RU.zip|Cкачать архив ZIP]])&lt;br /&gt;
&lt;br /&gt;
== 2. Исправления через functions.php ==&lt;br /&gt;
Основные исправления делал через [[Wp:function|functions.php]] и поскольку для заказчика использовалась тема [[Wp:theme:storefront|StoreFront]] то все изменения вносил через нее.&lt;br /&gt;
&lt;br /&gt;
=== 2.1. Отключаем поддержку комментариев для всех типов записей===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем поддержку комментариев для всех типов записей&lt;br /&gt;
	function disable_comments_support() {&lt;br /&gt;
		// Отключаем поддержку комментариев для постов&lt;br /&gt;
		remove_post_type_support(&#039;post&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для страниц&lt;br /&gt;
		remove_post_type_support(&#039;page&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для медиафайлов&lt;br /&gt;
		remove_post_type_support(&#039;attachment&#039;, &#039;comments&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;init&#039;, &#039;disable_comments_support&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.2. Скрываем существующие комментарии===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Скрываем существующие комментарии&lt;br /&gt;
	function disable_comments_admin() {&lt;br /&gt;
		// Скрываем раздел &amp;quot;Комментарии&amp;quot; в админ-панели&lt;br /&gt;
		remove_menu_page(&#039;edit-comments.php&#039;);&lt;br /&gt;
		// Скрываем метабокс с комментариями на странице редактирования записей&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;post&#039;, &#039;normal&#039;);&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;page&#039;, &#039;normal&#039;);&lt;br /&gt;
		// Скрываем метабокс с последними комментариями в консоли&lt;br /&gt;
		remove_meta_box(&#039;dashboard_recent_comments&#039;, &#039;dashboard&#039;, &#039;normal&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;admin_menu&#039;, &#039;disable_comments_admin&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.3. Отключаем комментарии в REST API===&lt;br /&gt;
Если отключаете комментарии, то отключите их и в REST API, иначе могут спамеры замучать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем комментарии в REST API&lt;br /&gt;
	function disable_comments_rest_api($open, $post_id) {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
	add_filter(&#039;pings_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
&lt;br /&gt;
	// Удаляем комментарии из шаблонов&lt;br /&gt;
	function remove_comments_template() {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_template&#039;, &#039;remove_comments_template&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.4. Удаляем подписи под постами===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Удаляем подписи под постами&lt;br /&gt;
function remove_author_box() {&lt;br /&gt;
	// Удаляем хук, который выводит блок автора&lt;br /&gt;
	remove_action(&#039;epl_single_author&#039;, &#039;epl_property_author_box&#039;);&lt;br /&gt;
	remove_action(&#039;wpbf_after_article&#039;, &#039;wpbf_author_box&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_author_box&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.5. Изменение функции плагина easy-property-listings ===&lt;br /&gt;
Кнопка &amp;quot;План помещения&amp;quot; открывала картинку в новом окне, пришлось переписать функцию чтобы открывалась в лайтбокс (lightbox), для этого еще пришлось добавить загрузку [[Wp:function:adding-download-magnific_popup|magnific_popup]] и [[Wp:function:adding-download-fancybox|fancybox]] js script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
// Изменение функции плагина easy-property-listings (epl_button_floor_plan() отключаем и включаем свою функцию)&lt;br /&gt;
function remove_epl_button_floor_plan() {&lt;br /&gt;
	// Отключаем стандартную функцию&lt;br /&gt;
	remove_action(&#039;epl_buttons_single_property&#039;, &#039;epl_button_floor_plan&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_button_floor_plan&#039;);&lt;br /&gt;
&lt;br /&gt;
function _8j0rn_button_floor_plan() {&lt;br /&gt;
	// Кастомный код&lt;br /&gt;
	$keys = apply_filters( &#039;epl_floorplan_keys&#039;, array( &#039;property_floorplan&#039;, &#039;property_floorplan_2&#039; ) );&lt;br /&gt;
&lt;br /&gt;
	foreach ( $keys as $key ) {&lt;br /&gt;
&lt;br /&gt;
		$link       = get_post_meta( get_the_ID(), $key, true );&lt;br /&gt;
		$count      = &#039;property_floorplan&#039; === $key ? &#039;&#039; : substr( $key, - 1 );&lt;br /&gt;
		$default    = __( &#039;Floor Plan &#039;, &#039;easy-property-listings&#039; ) . $count;&lt;br /&gt;
		$meta_label = get_post_meta( get_the_ID(), $key . &#039;_label&#039;, true );&lt;br /&gt;
		$meta_label = empty( $meta_label ) ? $default : $meta_label;&lt;br /&gt;
&lt;br /&gt;
		if ( is_array( $link ) ) { // Fallback if metadata is saved as an array.&lt;br /&gt;
&lt;br /&gt;
			if ( ! empty( $link[&#039;image_url_or_path&#039;] ) ) {&lt;br /&gt;
				$link = $link[&#039;image_url_or_path&#039;];&lt;br /&gt;
			} else {&lt;br /&gt;
				$link = &#039;&#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( ! empty( $link ) &amp;amp;&amp;amp; apply_filters( &#039;epl_show_&#039; . $key, true ) ) { ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;epl-button epl-floor-plan epl-floor-plan-&amp;lt;?php echo absint( $count ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-image=&amp;quot;&amp;lt;?php echo esc_url( $link ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-caption=&amp;quot;&amp;lt;?php echo esc_attr( $meta_label ); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
				$filter_key = str_replace( &#039;property_&#039;, &#039;&#039;, $key );&lt;br /&gt;
				if ( has_filter( &#039;epl_button_label_&#039; . $filter_key ) ) {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_&#039; . $filter_key, $meta_label );&lt;br /&gt;
				} else {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_floorplan&#039;, $meta_label );&lt;br /&gt;
				}&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo esc_html( $label ); ?&amp;gt;&lt;br /&gt;
			&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;epl_buttons_single_property&#039;, &#039;_8j0rn_button_floor_plan&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=292</id>
		<title>Wp:plugin:easy-property-listings</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=292"/>
		<updated>2025-03-08T13:14:23Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: /* 2.5. Изменение функции плагина easy-property-listings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здеся я буду хранить все изменения что я внес в плагин Easy Property Listings Plugin:&lt;br /&gt;
&lt;br /&gt;
Делая сайт заказчику использовал плагин Property Listings Plugin. &lt;br /&gt;
&lt;br /&gt;
== 1. Сделал полный перевод плагину ==&lt;br /&gt;
Полный перевод плагина Property Listings Plugin: ([[:File:Easy-property-listings-ru RU.zip|Cкачать архив ZIP]])&lt;br /&gt;
&lt;br /&gt;
== 2. Исправления через functions.php ==&lt;br /&gt;
Основные исправления делал через [[Wp:function|functions.php]] и поскольку для заказчика использовалась тема [[Wp:theme:storefront|StoreFront]] то все изменения вносил через нее.&lt;br /&gt;
&lt;br /&gt;
=== 2.1. Отключаем поддержку комментариев для всех типов записей===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем поддержку комментариев для всех типов записей&lt;br /&gt;
	function disable_comments_support() {&lt;br /&gt;
		// Отключаем поддержку комментариев для постов&lt;br /&gt;
		remove_post_type_support(&#039;post&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для страниц&lt;br /&gt;
		remove_post_type_support(&#039;page&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для медиафайлов&lt;br /&gt;
		remove_post_type_support(&#039;attachment&#039;, &#039;comments&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;init&#039;, &#039;disable_comments_support&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.2. Скрываем существующие комментарии===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Скрываем существующие комментарии&lt;br /&gt;
	function disable_comments_admin() {&lt;br /&gt;
		// Скрываем раздел &amp;quot;Комментарии&amp;quot; в админ-панели&lt;br /&gt;
		remove_menu_page(&#039;edit-comments.php&#039;);&lt;br /&gt;
		// Скрываем метабокс с комментариями на странице редактирования записей&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;post&#039;, &#039;normal&#039;);&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;page&#039;, &#039;normal&#039;);&lt;br /&gt;
		// Скрываем метабокс с последними комментариями в консоли&lt;br /&gt;
		remove_meta_box(&#039;dashboard_recent_comments&#039;, &#039;dashboard&#039;, &#039;normal&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;admin_menu&#039;, &#039;disable_comments_admin&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.3. Отключаем комментарии в REST API===&lt;br /&gt;
Если отключаете комментарии, то отключите их и в REST API, иначе могут спамеры замучать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем комментарии в REST API&lt;br /&gt;
	function disable_comments_rest_api($open, $post_id) {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
	add_filter(&#039;pings_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
&lt;br /&gt;
	// Удаляем комментарии из шаблонов&lt;br /&gt;
	function remove_comments_template() {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_template&#039;, &#039;remove_comments_template&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.4. Удаляем подписи под постами===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Удаляем подписи под постами&lt;br /&gt;
function remove_author_box() {&lt;br /&gt;
	// Удаляем хук, который выводит блок автора&lt;br /&gt;
	remove_action(&#039;epl_single_author&#039;, &#039;epl_property_author_box&#039;);&lt;br /&gt;
	remove_action(&#039;wpbf_after_article&#039;, &#039;wpbf_author_box&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_author_box&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.5. Изменение функции плагина easy-property-listings ===&lt;br /&gt;
Кнопка &amp;quot;План помещения&amp;quot; открывала картинку в новом окне, пришлось переписать функцию чтобы открывалась в лайтбокс (lightbox), для этого еще пришлось добавить загрузку [[Wp:function:adding-download-magnific_popup|magnific_popup]] и [[Wp:function:adding-download-fancybox|fancybox]] js script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Изменение функции плагина easy-property-listings (epl_button_floor_plan отключаем и включаем свою функцию)&amp;lt;?php&lt;br /&gt;
function remove_epl_button_floor_plan() {&lt;br /&gt;
	// Отключаем стандартную функцию&lt;br /&gt;
	remove_action(&#039;epl_buttons_single_property&#039;, &#039;epl_button_floor_plan&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_button_floor_plan&#039;);&lt;br /&gt;
&lt;br /&gt;
function _8j0rn_button_floor_plan() {&lt;br /&gt;
	// Кастомный код&lt;br /&gt;
	$keys = apply_filters( &#039;epl_floorplan_keys&#039;, array( &#039;property_floorplan&#039;, &#039;property_floorplan_2&#039; ) );&lt;br /&gt;
&lt;br /&gt;
	foreach ( $keys as $key ) {&lt;br /&gt;
&lt;br /&gt;
		$link       = get_post_meta( get_the_ID(), $key, true );&lt;br /&gt;
		$count      = &#039;property_floorplan&#039; === $key ? &#039;&#039; : substr( $key, - 1 );&lt;br /&gt;
		$default    = __( &#039;Floor Plan &#039;, &#039;easy-property-listings&#039; ) . $count;&lt;br /&gt;
		$meta_label = get_post_meta( get_the_ID(), $key . &#039;_label&#039;, true );&lt;br /&gt;
		$meta_label = empty( $meta_label ) ? $default : $meta_label;&lt;br /&gt;
&lt;br /&gt;
		if ( is_array( $link ) ) { // Fallback if metadata is saved as an array.&lt;br /&gt;
&lt;br /&gt;
			if ( ! empty( $link[&#039;image_url_or_path&#039;] ) ) {&lt;br /&gt;
				$link = $link[&#039;image_url_or_path&#039;];&lt;br /&gt;
			} else {&lt;br /&gt;
				$link = &#039;&#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( ! empty( $link ) &amp;amp;&amp;amp; apply_filters( &#039;epl_show_&#039; . $key, true ) ) { ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;epl-button epl-floor-plan epl-floor-plan-&amp;lt;?php echo absint( $count ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-image=&amp;quot;&amp;lt;?php echo esc_url( $link ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-caption=&amp;quot;&amp;lt;?php echo esc_attr( $meta_label ); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
				$filter_key = str_replace( &#039;property_&#039;, &#039;&#039;, $key );&lt;br /&gt;
				if ( has_filter( &#039;epl_button_label_&#039; . $filter_key ) ) {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_&#039; . $filter_key, $meta_label );&lt;br /&gt;
				} else {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_floorplan&#039;, $meta_label );&lt;br /&gt;
				}&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo esc_html( $label ); ?&amp;gt;&lt;br /&gt;
			&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;epl_buttons_single_property&#039;, &#039;_8j0rn_button_floor_plan&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=291</id>
		<title>Wp:plugin:easy-property-listings</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=291"/>
		<updated>2025-03-08T13:09:59Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здеся я буду хранить все изменения что я внес в плагин Easy Property Listings Plugin:&lt;br /&gt;
&lt;br /&gt;
Делая сайт заказчику использовал плагин Property Listings Plugin. &lt;br /&gt;
&lt;br /&gt;
== 1. Сделал полный перевод плагину ==&lt;br /&gt;
Полный перевод плагина Property Listings Plugin: ([[:File:Easy-property-listings-ru RU.zip|Cкачать архив ZIP]])&lt;br /&gt;
&lt;br /&gt;
== 2. Исправления через functions.php ==&lt;br /&gt;
Основные исправления делал через [[Wp:function|functions.php]] и поскольку для заказчика использовалась тема [[Wp:theme:storefront|StoreFront]] то все изменения вносил через нее.&lt;br /&gt;
&lt;br /&gt;
=== 2.1. Отключаем поддержку комментариев для всех типов записей===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем поддержку комментариев для всех типов записей&lt;br /&gt;
	function disable_comments_support() {&lt;br /&gt;
		// Отключаем поддержку комментариев для постов&lt;br /&gt;
		remove_post_type_support(&#039;post&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для страниц&lt;br /&gt;
		remove_post_type_support(&#039;page&#039;, &#039;comments&#039;);&lt;br /&gt;
		// Отключаем поддержку комментариев для медиафайлов&lt;br /&gt;
		remove_post_type_support(&#039;attachment&#039;, &#039;comments&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;init&#039;, &#039;disable_comments_support&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.2. Скрываем существующие комментарии===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Скрываем существующие комментарии&lt;br /&gt;
	function disable_comments_admin() {&lt;br /&gt;
		// Скрываем раздел &amp;quot;Комментарии&amp;quot; в админ-панели&lt;br /&gt;
		remove_menu_page(&#039;edit-comments.php&#039;);&lt;br /&gt;
		// Скрываем метабокс с комментариями на странице редактирования записей&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;post&#039;, &#039;normal&#039;);&lt;br /&gt;
		remove_meta_box(&#039;commentsdiv&#039;, &#039;page&#039;, &#039;normal&#039;);&lt;br /&gt;
		// Скрываем метабокс с последними комментариями в консоли&lt;br /&gt;
		remove_meta_box(&#039;dashboard_recent_comments&#039;, &#039;dashboard&#039;, &#039;normal&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	add_action(&#039;admin_menu&#039;, &#039;disable_comments_admin&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.3. Отключаем комментарии в REST API===&lt;br /&gt;
Если отключаете комментарии, то отключите их и в REST API, иначе могут спамеры замучать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Отключаем комментарии в REST API&lt;br /&gt;
	function disable_comments_rest_api($open, $post_id) {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
	add_filter(&#039;pings_open&#039;, &#039;disable_comments_rest_api&#039;, 10, 2);&lt;br /&gt;
&lt;br /&gt;
	// Удаляем комментарии из шаблонов&lt;br /&gt;
	function remove_comments_template() {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	add_filter(&#039;comments_template&#039;, &#039;remove_comments_template&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.4. Удаляем подписи под постами===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Удаляем подписи под постами&lt;br /&gt;
function remove_author_box() {&lt;br /&gt;
	// Удаляем хук, который выводит блок автора&lt;br /&gt;
	remove_action(&#039;epl_single_author&#039;, &#039;epl_property_author_box&#039;);&lt;br /&gt;
	remove_action(&#039;wpbf_after_article&#039;, &#039;wpbf_author_box&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_author_box&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.5. Изменение функции плагина easy-property-listings ===&lt;br /&gt;
Кнопка &amp;quot;План помещения&amp;quot; открывала картинку в новом окне, пришлось переписать функцию чтобы открывалась в лайтбокс (lightbox), для этого еще пришлось добавить загрузку [[Wp:function:adding-download-magnific_popup|magnific_popup]] и [[Wp:function:adding-download-fancybox|fancybox]] js script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Изменение функции плагина easy-property-listings (epl_button_floor_plan() отключаем и включаем свою функцию)&lt;br /&gt;
function remove_epl_button_floor_plan() {&lt;br /&gt;
	// Отключаем стандартную функцию&lt;br /&gt;
	remove_action(&#039;epl_buttons_single_property&#039;, &#039;epl_button_floor_plan&#039;);&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;init&#039;, &#039;remove_epl_button_floor_plan&#039;);&lt;br /&gt;
&lt;br /&gt;
function _8j0rn_button_floor_plan() {&lt;br /&gt;
	// Кастомный код&lt;br /&gt;
	$keys = apply_filters( &#039;epl_floorplan_keys&#039;, array( &#039;property_floorplan&#039;, &#039;property_floorplan_2&#039; ) );&lt;br /&gt;
&lt;br /&gt;
	foreach ( $keys as $key ) {&lt;br /&gt;
&lt;br /&gt;
		$link       = get_post_meta( get_the_ID(), $key, true );&lt;br /&gt;
		$count      = &#039;property_floorplan&#039; === $key ? &#039;&#039; : substr( $key, - 1 );&lt;br /&gt;
		$default    = __( &#039;Floor Plan &#039;, &#039;easy-property-listings&#039; ) . $count;&lt;br /&gt;
		$meta_label = get_post_meta( get_the_ID(), $key . &#039;_label&#039;, true );&lt;br /&gt;
		$meta_label = empty( $meta_label ) ? $default : $meta_label;&lt;br /&gt;
&lt;br /&gt;
		if ( is_array( $link ) ) { // Fallback if metadata is saved as an array.&lt;br /&gt;
&lt;br /&gt;
			if ( ! empty( $link[&#039;image_url_or_path&#039;] ) ) {&lt;br /&gt;
				$link = $link[&#039;image_url_or_path&#039;];&lt;br /&gt;
			} else {&lt;br /&gt;
				$link = &#039;&#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if ( ! empty( $link ) &amp;amp;&amp;amp; apply_filters( &#039;epl_show_&#039; . $key, true ) ) { ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
			&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;epl-button epl-floor-plan epl-floor-plan-&amp;lt;?php echo absint( $count ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-image=&amp;quot;&amp;lt;?php echo esc_url( $link ); ?&amp;gt;&amp;quot;&lt;br /&gt;
					data-caption=&amp;quot;&amp;lt;?php echo esc_attr( $meta_label ); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;?php&lt;br /&gt;
				$filter_key = str_replace( &#039;property_&#039;, &#039;&#039;, $key );&lt;br /&gt;
				if ( has_filter( &#039;epl_button_label_&#039; . $filter_key ) ) {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_&#039; . $filter_key, $meta_label );&lt;br /&gt;
				} else {&lt;br /&gt;
					$label = apply_filters( &#039;epl_button_label_floorplan&#039;, $meta_label );&lt;br /&gt;
				}&lt;br /&gt;
				?&amp;gt;&lt;br /&gt;
				&amp;lt;?php echo esc_html( $label ); ?&amp;gt;&lt;br /&gt;
			&amp;lt;/button&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;epl_buttons_single_property&#039;, &#039;_8j0rn_button_floor_plan&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:removing-page-titles-and-posts&amp;diff=290</id>
		<title>Wp:theme:storefront:removing-page-titles-and-posts</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:removing-page-titles-and-posts&amp;diff=290"/>
		<updated>2025-03-08T12:57:39Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Удаляем заголовки страниц и постов, подписи автора, даты поста, кол-ва комментариев, сами комментарии и превью поста. После удаления можно подключить свои.  &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt; // Удаляем заголовки страниц и постов add_action( &amp;#039;wp_loaded&amp;#039;, function(){ 	remove_action( &amp;#039;storefront_page&amp;#039;, &amp;#039;storefr...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Удаляем заголовки страниц и постов, подписи автора, даты поста, кол-ва комментариев, сами комментарии и превью поста.&lt;br /&gt;
После удаления можно подключить свои.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Удаляем заголовки страниц и постов&lt;br /&gt;
add_action( &#039;wp_loaded&#039;, function(){&lt;br /&gt;
	remove_action( &#039;storefront_page&#039;, &#039;storefront_page_header&#039;); // Заголовки страниц&lt;br /&gt;
	remove_action( &#039;storefront_post_header_before&#039;, &#039;storefront_post_meta&#039;); // Автора, даты и кол-ва коментариев&lt;br /&gt;
	remove_action( &#039;storefront_page_after&#039;, &#039;storefront_display_comments&#039;); // Удаляем комментарии&lt;br /&gt;
	remove_action( &#039;storefront_post_content_before&#039;, &#039;storefront_post_thumbnail&#039;); // Удаляем превью поста&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=289</id>
		<title>Wp:theme:storefront</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=289"/>
		<updated>2025-03-08T12:52:32Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сюда я буду заносить изменения которые я делаю в storefron&lt;br /&gt;
&lt;br /&gt;
# [[Wp:theme:storefront:create-your-signature-in-footer|Создание своей подписи в &amp;quot;подвале&amp;quot;]]&lt;br /&gt;
# [[Wp:theme:storefront:custom-login-page|Создание своей страницы логина для админ панели]]&lt;br /&gt;
# [[Wp:theme:storefront:appearance-of-list-of-posts|Исправление внешнего вида списка постов]]&lt;br /&gt;
# [[Wp:theme:storefront:removing-sidebar-from-all-pages|Удаляем со всех страниц сайдбар (sidebar)]]&lt;br /&gt;
# [[Wp:theme:storefront:add-breadcrumbs-all-pages|Добавляем хлебные крошки (breadcrumbs) на все страницы]]&lt;br /&gt;
# [[Wp:theme:storefront:removing-page-titles-and-posts|Удаляем заголовки страниц и постов]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:add-breadcrumbs-all-pages&amp;diff=288</id>
		<title>Wp:theme:storefront:add-breadcrumbs-all-pages</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:add-breadcrumbs-all-pages&amp;diff=288"/>
		<updated>2025-03-08T12:51:11Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Добавляем хлебные крошки (breadcrumbs) на все страницы темы StoreFront через functionc.php:  &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt; // Добавляем хлебные крошки на front под шапкой function add_custom_breadcrumbs() {     if (function_exists(&amp;#039;woocommerce_breadcrumb&amp;#039;)) {         woocommerce_breadcrumb();     } } add_action(&amp;#039;storefront_before_content&amp;#039;, &amp;#039;add_custom_breadcrumbs&amp;#039;); &amp;lt;/syntaxhighlight...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Добавляем хлебные крошки (breadcrumbs) на все страницы темы StoreFront через functionc.php:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Добавляем хлебные крошки на front под шапкой&lt;br /&gt;
function add_custom_breadcrumbs() {&lt;br /&gt;
    if (function_exists(&#039;woocommerce_breadcrumb&#039;)) {&lt;br /&gt;
        woocommerce_breadcrumb();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;storefront_before_content&#039;, &#039;add_custom_breadcrumbs&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
или если установлен плагин YOAST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Добавляем хлебные крошки (breadcrumbs)&lt;br /&gt;
function add_yoast_breadcrumbs_after_header() {&lt;br /&gt;
    if (function_exists(&#039;yoast_breadcrumb&#039;)) {&lt;br /&gt;
        yoast_breadcrumb(&#039;&amp;lt;div id=&amp;quot;breadcrumbs&amp;quot;&amp;gt;&#039;, &#039;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;storefront_before_content&#039;, &#039;add_yoast_breadcrumbs_after_header&#039;, 10);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=287</id>
		<title>Wp:theme:storefront</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=287"/>
		<updated>2025-03-08T12:48:32Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сюда я буду заносить изменения которые я делаю в storefron&lt;br /&gt;
&lt;br /&gt;
# [[Wp:theme:storefront:create-your-signature-in-footer|Создание своей подписи в &amp;quot;подвале&amp;quot;]]&lt;br /&gt;
# [[Wp:theme:storefront:custom-login-page|Создание своей страницы логина для админ панели]]&lt;br /&gt;
# [[Wp:theme:storefront:appearance-of-list-of-posts|Исправление внешнего вида списка постов]]&lt;br /&gt;
# [[Wp:theme:storefront:removing-sidebar-from-all-pages|Удаляем со всех страниц сайдбар (sidebar)]]&lt;br /&gt;
# [[Wp:theme:storefront:add-breadcrumbs-all-pages|Добавляем хлебные крошки (breadcrumbs) на все страницы]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:removing-sidebar-from-all-pages&amp;diff=286</id>
		<title>Wp:theme:storefront:removing-sidebar-from-all-pages</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:removing-sidebar-from-all-pages&amp;diff=286"/>
		<updated>2025-03-08T12:01:41Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Простенький кусочек кода, удаляем сайдбар (sidebar) со всех страниц:  &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt; // Удаляем сайдбар function remove_storefront_sidebar() { 	if (is_active_sidebar(&amp;#039;sidebar-1&amp;#039;)) { 		unregister_sidebar(&amp;#039;sidebar-1&amp;#039;); 	} } add_action(&amp;#039;widgets_init&amp;#039;, &amp;#039;remove_storefront_sidebar&amp;#039;, 11); &amp;lt;/syntaxhighlight&amp;gt;»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Простенький кусочек кода, удаляем сайдбар (sidebar) со всех страниц:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Удаляем сайдбар&lt;br /&gt;
function remove_storefront_sidebar() {&lt;br /&gt;
	if (is_active_sidebar(&#039;sidebar-1&#039;)) {&lt;br /&gt;
		unregister_sidebar(&#039;sidebar-1&#039;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;widgets_init&#039;, &#039;remove_storefront_sidebar&#039;, 11);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=285</id>
		<title>Wp:theme:storefront</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=285"/>
		<updated>2025-03-08T12:00:19Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сюда я буду заносить изменения которые я делаю в storefron&lt;br /&gt;
&lt;br /&gt;
# [[Wp:theme:storefront:create-your-signature-in-footer|Создание своей подписи в &amp;quot;подвале&amp;quot;]]&lt;br /&gt;
# [[Wp:theme:storefront:custom-login-page|Создание своей страницы логина для админ панели]]&lt;br /&gt;
# [[Wp:theme:storefront:appearance-of-list-of-posts|Исправление внешнего вида списка постов]]&lt;br /&gt;
# [[Wp:theme:storefront:removing-sidebar-from-all-pages|Удаляем со всех страниц сайдбар (sidebar)]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:appearance-of-list-of-posts&amp;diff=284</id>
		<title>Wp:theme:storefront:appearance-of-list-of-posts</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:appearance-of-list-of-posts&amp;diff=284"/>
		<updated>2025-03-08T11:46:39Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Настраиваем по своем списки постов в StoreFront:  &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt; // Исправляем внешний вид списка постов function custom_storefront_post_content() { 	?&amp;gt; 	&amp;lt;div class=&amp;quot;entry-content&amp;quot; itemprop=&amp;quot;articleBody&amp;quot;&amp;gt;&amp;lt;!-- A --&amp;gt; 	&amp;lt;?php 	echo &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; . esc_url( get_permalink() ) . &amp;#039;&amp;quot; rel=&amp;quot;bookmark&amp;quot;&amp;gt;&amp;#039;; 		if ( has_post_thumbnail() ) { 			the_post_thumbnail( &amp;#039;full&amp;#039;, array( &amp;#039;itemprop&amp;#039; =&amp;gt; &amp;#039;image&amp;#039; )...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Настраиваем по своем списки постов в StoreFront:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Исправляем внешний вид списка постов&lt;br /&gt;
function custom_storefront_post_content() {&lt;br /&gt;
	?&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;entry-content&amp;quot; itemprop=&amp;quot;articleBody&amp;quot;&amp;gt;&amp;lt;!-- A --&amp;gt;&lt;br /&gt;
	&amp;lt;?php&lt;br /&gt;
	echo &#039;&amp;lt;a href=&amp;quot;&#039; . esc_url( get_permalink() ) . &#039;&amp;quot; rel=&amp;quot;bookmark&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
		if ( has_post_thumbnail() ) {&lt;br /&gt;
			the_post_thumbnail( &#039;full&#039;, array( &#039;itemprop&#039; =&amp;gt; &#039;image&#039; ) );&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			echo &#039;&amp;lt;img width=&amp;quot;1080&amp;quot; height=&amp;quot;1080&amp;quot; style=&amp;quot;opacity: 0.3;&amp;quot; src=&amp;quot;/content/images/post_thumbnail.png&amp;quot; class=&amp;quot;attachment-full size-full wp-post-image&amp;quot; alt=&amp;quot;&amp;quot; decoding=&amp;quot;async&amp;quot; itemprop=&amp;quot;image&amp;quot; sizes=&amp;quot;(max-width: 1080px) 100vw, 1080px&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
	echo &#039;&amp;lt;div style=&amp;quot;max-width: 60%; float: right;&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;&#039; . get_the_excerpt() . &#039;&amp;lt;/h3&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
	?&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&amp;lt;!-- .entry-content --&amp;gt;&lt;br /&gt;
	&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
function _8j0rn_customise_storefront() {&lt;br /&gt;
	// Удаляем текущий вид&lt;br /&gt;
	remove_action( &#039;storefront_loop_post&#039;, &#039;storefront_post_content&#039;, 30 );&lt;br /&gt;
&lt;br /&gt;
	// Создаем свой собственный&lt;br /&gt;
	add_action( &#039;storefront_loop_post&#039;, &#039;custom_storefront_post_content&#039;, 30 );&lt;br /&gt;
}&lt;br /&gt;
add_action( &#039;init&#039;, &#039;_8j0rn_customise_storefront&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=283</id>
		<title>Wp:theme:storefront</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=283"/>
		<updated>2025-03-08T11:43:32Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сюда я буду заносить изменения которые я делаю в storefron&lt;br /&gt;
&lt;br /&gt;
# [[Wp:theme:storefront:create-your-signature-in-footer|Создание своей подписи в &amp;quot;подвале&amp;quot;]]&lt;br /&gt;
# [[Wp:theme:storefront:custom-login-page|Создание своей страницы логина для админ панели]]&lt;br /&gt;
# [[Wp:theme:storefront:appearance-of-list-of-posts|Исправление внешнего вида списка постов]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:custom-login-page&amp;diff=282</id>
		<title>Wp:theme:storefront:custom-login-page</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:custom-login-page&amp;diff=282"/>
		<updated>2025-03-08T11:39:06Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Подключаем свою страницу логина:&lt;br /&gt;
&lt;br /&gt;
Сначала вносим изменения в functions.php добавив следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Настройка страницы логина админов&lt;br /&gt;
&lt;br /&gt;
// Добавляем файл стилей в тег &amp;lt;head&amp;gt;. Функция, которая подключает наш файл стилей к странице входа&lt;br /&gt;
function custom_login_page() {&lt;br /&gt;
	echo &#039;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&amp;lt;&amp;lt;---папка-расположения-файлов---&amp;gt;&amp;gt;/custom-login-page.css&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;login_head&#039;, &#039;custom_login_page&#039;);&lt;br /&gt;
&lt;br /&gt;
function logo_link_url() {&lt;br /&gt;
	return get_bloginfo( &#039;url&#039; ); //Возвращаем ссылку с названием сайта&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;login_headerurl&#039;, &#039;logo_link_url&#039; );&lt;br /&gt;
 &lt;br /&gt;
function logo_link_title() {&lt;br /&gt;
	return &#039;Заголовок логин страницы&#039;;&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;login_headertitle&#039;, &#039;logo_link_title&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Затем открываем custom-login-page.css и вносим туда изменения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * @package			Bjorn_Main&lt;br /&gt;
 * Description:		&lt;br /&gt;
 * Version:			3.1.2025&lt;br /&gt;
 * Tested up to:	6.7.2&lt;br /&gt;
 * Requires PHP:	7.4.0&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* Фон страницы&lt;br /&gt;
*Может содержать цвет или изображение.&lt;br /&gt;
*НЕ ЗАБЫВАЙТЕ ИСПОЛЬЗОВАТЬ !important.&lt;br /&gt;
*/&lt;br /&gt;
body {&lt;br /&gt;
  background-color: #000;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*Логотип (ИСПОЛЬЗОВАНИЕ ИЗОБРАЖЕНИЯ ОБЯЗАТЕЛЬНО!)&lt;br /&gt;
* Не забудьте изменить размеры блока подходящие под Ваш логотип &lt;br /&gt;
*/&lt;br /&gt;
#login h1 a { &lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* &lt;br /&gt;
*Блок формы &lt;br /&gt;
*/&lt;br /&gt;
#login form {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Поля ввода&lt;br /&gt;
* «Имя пользователя» и «Пароль»&lt;br /&gt;
*/&lt;br /&gt;
#login .input {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Лейблы&lt;br /&gt;
* Текст над полями&lt;br /&gt;
*/&lt;br /&gt;
#login label {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
#login input[type=submit]:active {} &lt;br /&gt;
&lt;br /&gt;
#login input[type=checkbox], input[type=radio] {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Ссылки под формой&lt;br /&gt;
* «Назад к блогу» и «Забыл пароль»&lt;br /&gt;
*/&lt;br /&gt;
#nav a,&lt;br /&gt;
#backtoblog a {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#nav a:active, #nav a:hover,&lt;br /&gt;
#backtoblog a:active, #backtoblog a:hover {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*Ссылка под формой&lt;br /&gt;
* Политика конфиденциальности&lt;br /&gt;
*/&lt;br /&gt;
a {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a:active, a:hover {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Уведомления над формой логина */&lt;br /&gt;
#login .message {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Кнопка логина */&lt;br /&gt;
#login input[type=submit] {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Кнопка Изменения языка */&lt;br /&gt;
.login .language-switcher .button {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Естественно между {} каждого тега следует добавлять теги своего оформления.&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:custom-login-page&amp;diff=281</id>
		<title>Wp:theme:storefront:custom-login-page</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:custom-login-page&amp;diff=281"/>
		<updated>2025-03-08T11:38:33Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Подключаем свою страницу логина:&lt;br /&gt;
&lt;br /&gt;
Сначала вносим изменения в functions.php добавив следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Настройка страницы логина админов&lt;br /&gt;
&lt;br /&gt;
// Добавляем файл стилей в тег &amp;lt;head&amp;gt;. Функция, которая подключает наш файл стилей к странице входа&lt;br /&gt;
function custom_login_page() {&lt;br /&gt;
	echo &#039;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&amp;lt;&amp;lt;---папка-расположения-файлов---&amp;gt;&amp;gt;/custom-login-page.css&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;login_head&#039;, &#039;custom_login_page&#039;);&lt;br /&gt;
&lt;br /&gt;
function logo_link_url() {&lt;br /&gt;
	return get_bloginfo( &#039;url&#039; ); //Возвращаем ссылку с названием сайта&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;login_headerurl&#039;, &#039;logo_link_url&#039; );&lt;br /&gt;
 &lt;br /&gt;
function logo_link_title() {&lt;br /&gt;
	return &#039;Заголовок логин страницы&#039;;&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;login_headertitle&#039;, &#039;logo_link_title&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Затем открываем custom-login-page.css и вносим туда изменения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * @package			Bjorn_Main&lt;br /&gt;
 * Description:		Storefront - идеальная тема для вашего следующего проекта WooCommerce. &lt;br /&gt;
 * 					Разработанный разработчиками WooCommerce Core, он имеет индивидуальную &lt;br /&gt;
 * 					интеграцию с самой WooCommerce, а также со многими из самых популярных&lt;br /&gt;
 * 					клиентских расширений WooCommerce. Есть несколько вариантов макета и&lt;br /&gt;
 * 					цвета для персонализации вашего магазина, несколько областей виджетов,&lt;br /&gt;
 * 					адаптивный дизайн и многое другое. &lt;br /&gt;
 * 					Разработчикам понравится его компактная и расширяемая кодовая база,&lt;br /&gt;
 * 					что делает его приятным для настройки и расширения. Ищете тему для &lt;br /&gt;
 * 					WooCommerce? Не смотрите дальше!&lt;br /&gt;
 * 					А выбрав тему StoreFront Bjorn_Main идеальный помощник в ее кастомизации.&lt;br /&gt;
 * 					Зарегистрированные style.css, functions.php помогут кастомизировать не&lt;br /&gt;
 * 					только внешний вид, но и включать отключать любые хуки и блоки темы. &lt;br /&gt;
 * 					Есть так же возможность кастомизировать страницу входа в админ панель и&lt;br /&gt;
 * 					саму админ панель.&lt;br /&gt;
 * Version:			3.1.2025&lt;br /&gt;
 * Tested up to:	6.7.2&lt;br /&gt;
 * Requires PHP:	7.4.0&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* Фон страницы&lt;br /&gt;
*Может содержать цвет или изображение.&lt;br /&gt;
*НЕ ЗАБЫВАЙТЕ ИСПОЛЬЗОВАТЬ !important.&lt;br /&gt;
*/&lt;br /&gt;
body {&lt;br /&gt;
  background-color: #000;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/*Логотип (ИСПОЛЬЗОВАНИЕ ИЗОБРАЖЕНИЯ ОБЯЗАТЕЛЬНО!)&lt;br /&gt;
* Не забудьте изменить размеры блока подходящие под Ваш логотип &lt;br /&gt;
*/&lt;br /&gt;
#login h1 a { &lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* &lt;br /&gt;
*Блок формы &lt;br /&gt;
*/&lt;br /&gt;
#login form {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Поля ввода&lt;br /&gt;
* «Имя пользователя» и «Пароль»&lt;br /&gt;
*/&lt;br /&gt;
#login .input {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Лейблы&lt;br /&gt;
* Текст над полями&lt;br /&gt;
*/&lt;br /&gt;
#login label {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
#login input[type=submit]:active {} &lt;br /&gt;
&lt;br /&gt;
#login input[type=checkbox], input[type=radio] {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Ссылки под формой&lt;br /&gt;
* «Назад к блогу» и «Забыл пароль»&lt;br /&gt;
*/&lt;br /&gt;
#nav a,&lt;br /&gt;
#backtoblog a {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#nav a:active, #nav a:hover,&lt;br /&gt;
#backtoblog a:active, #backtoblog a:hover {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*Ссылка под формой&lt;br /&gt;
* Политика конфиденциальности&lt;br /&gt;
*/&lt;br /&gt;
a {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a:active, a:hover {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Уведомления над формой логина */&lt;br /&gt;
#login .message {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Кнопка логина */&lt;br /&gt;
#login input[type=submit] {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Кнопка Изменения языка */&lt;br /&gt;
.login .language-switcher .button {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Естественно между {} каждого тега следует добавлять теги своего оформления.&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:custom-login-page&amp;diff=280</id>
		<title>Wp:theme:storefront:custom-login-page</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:custom-login-page&amp;diff=280"/>
		<updated>2025-03-08T11:32:56Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «  &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt; // Настройка страницы логина админов  // Добавляем файл стилей в тег &amp;lt;head&amp;gt;. Функция, которая подключает наш файл стилей к странице входа function custom_login_page() { 	echo &amp;#039;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&amp;lt;&amp;lt;---папка-расположения-файлов---&amp;gt;&amp;gt;/custom-login-page.css&amp;quot; /&amp;gt;&amp;#039;; } add_action(&amp;#039;login...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Настройка страницы логина админов&lt;br /&gt;
&lt;br /&gt;
// Добавляем файл стилей в тег &amp;lt;head&amp;gt;. Функция, которая подключает наш файл стилей к странице входа&lt;br /&gt;
function custom_login_page() {&lt;br /&gt;
	echo &#039;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&amp;lt;&amp;lt;---папка-расположения-файлов---&amp;gt;&amp;gt;/custom-login-page.css&amp;quot; /&amp;gt;&#039;;&lt;br /&gt;
}&lt;br /&gt;
add_action(&#039;login_head&#039;, &#039;custom_login_page&#039;);&lt;br /&gt;
&lt;br /&gt;
function logo_link_url() {&lt;br /&gt;
	return get_bloginfo( &#039;url&#039; ); //Возвращаем ссылку с названием сайта&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;login_headerurl&#039;, &#039;logo_link_url&#039; );&lt;br /&gt;
 &lt;br /&gt;
function logo_link_title() {&lt;br /&gt;
	return &#039;Заголовок логин страницы&#039;;&lt;br /&gt;
}&lt;br /&gt;
add_filter( &#039;login_headertitle&#039;, &#039;logo_link_title&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=279</id>
		<title>Wp:theme:storefront</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=279"/>
		<updated>2025-03-08T11:13:10Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сюда я буду заносить изменения которые я делаю в storefron&lt;br /&gt;
&lt;br /&gt;
# [[Wp:theme:storefront:create-your-signature-in-footer|Создание своей подписи в &amp;quot;подвале&amp;quot;]]&lt;br /&gt;
# [[Wp:theme:storefront:custom-login-page|Создание своей страницы логина для админ панели]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:create-your-signature-in-footer&amp;diff=278</id>
		<title>Wp:theme:storefront:create-your-signature-in-footer</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront:create-your-signature-in-footer&amp;diff=278"/>
		<updated>2025-03-08T11:10:57Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Создание/изменение подписи в &amp;quot;подвале&amp;quot; (footer):  для создания/изменения подписи в &amp;quot;подвале&amp;quot; (footer) темы StoreFront нужно подключить свой functions.php (я это делаю при помощи своего плагина Bjorn Main, но есть и другие способы.  &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt; // Замена подписи в...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Создание/изменение подписи в &amp;quot;подвале&amp;quot; (footer):&lt;br /&gt;
&lt;br /&gt;
для создания/изменения подписи в &amp;quot;подвале&amp;quot; (footer) темы StoreFront нужно подключить свой functions.php (я это делаю при помощи своего плагина [[Wp:pligin:bjorn-main|Bjorn Main]], но есть и другие способы.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Замена подписи в подвале&lt;br /&gt;
&lt;br /&gt;
// Своя надпись (Замена подписи в подвале)&lt;br /&gt;
function custom_storefront_credit() {&lt;br /&gt;
	?&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;site-info&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?php /* echo esc_html( apply_filters( &#039;storefront_copyright_text&#039;, $content = &#039;&amp;amp;copy; &#039; . get_bloginfo( &#039;name&#039; ) . &#039; &#039; . date( &#039;Y&#039; ) ) ); */ ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php if ( apply_filters( &#039;storefront_credit_link&#039;, true ) ) { ?&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			if ( apply_filters( &#039;storefront_privacy_policy_link&#039;, true ) &amp;amp;&amp;amp; function_exists( &#039;the_privacy_policy_link&#039; ) ) {&lt;br /&gt;
				the_privacy_policy_link( &#039;&#039;, &#039;&amp;lt;span role=&amp;quot;separator&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039; );&lt;br /&gt;
			} ?&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
				echo &#039;&amp;lt;div&amp;gt;Здеся добавляем все что вам нужно, помимо подписи...&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
				echo &#039;&amp;lt;div class=&amp;quot;footer-developer&amp;quot;&amp;gt;Сайт разработан: &amp;lt;a href=&amp;quot;https://dagbok.ru&amp;quot; target=&amp;quot;_blank&amp;quot; title=&amp;quot;ᛒᛃᛟᚱᚾ&amp;quot; rel=&amp;quot;author&amp;quot;&amp;gt;&amp;amp;copy; ᛒᛃᛟᚱᚾ 2025 - &#039; . date(&amp;quot;Y&amp;quot;) . &#039;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&#039;; ?&amp;gt;&lt;br /&gt;
		&amp;lt;?php } ?&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&amp;lt;!-- .site-info --&amp;gt;&lt;br /&gt;
	&amp;lt;?php&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Убрать стандартную надпись в подвале и заменить на свою.&lt;br /&gt;
function custom_remove_footer_credit () {&lt;br /&gt;
	remove_action( &#039;storefront_footer&#039;, &#039;storefront_credit&#039;, 20 );&lt;br /&gt;
	add_action( &#039;storefront_footer&#039;, &#039;custom_storefront_credit&#039;, 20 );&lt;br /&gt;
}&lt;br /&gt;
add_action( &#039;init&#039;, &#039;custom_remove_footer_credit&#039;, 10 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=277</id>
		<title>Wp:theme:storefront</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=277"/>
		<updated>2025-03-08T11:03:17Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сюда я буду заносить изменения которые я делаю в storefron&lt;br /&gt;
&lt;br /&gt;
# [[Wp:theme:storefront:create-your-signature-in-footer|Создание своей подписи в &amp;quot;подвале&amp;quot;]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp&amp;diff=276</id>
		<title>Wp</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp&amp;diff=276"/>
		<updated>2025-03-08T11:00:13Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# [[wp:function|Custom function.php]]&lt;br /&gt;
# [[wp:style|Custom style.css]]&lt;br /&gt;
# [[wp:themes|Themes]]&lt;br /&gt;
# [[wp:plugins|Plugins]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:function&amp;diff=271</id>
		<title>Wp:function</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:function&amp;diff=271"/>
		<updated>2025-03-08T10:32:42Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# [[wp:function:changing-upload-location|Изменение места загрузки фотографий]]&lt;br /&gt;
# [[wp:function:adding-download-magnific_popup|Добавление загрузки magnific_popup js script]]&lt;br /&gt;
# [[wp:function:adding-download-fancybox|Добавление загрузки fancybox js script]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=270</id>
		<title>Wp:plugin:easy-property-listings</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=270"/>
		<updated>2025-03-08T10:20:31Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: /* 1. Сделал полный перевод плагину */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здеся я буду хранить все изменения что я внес в плагин Easy Property Listings Plugin:&lt;br /&gt;
&lt;br /&gt;
Делая сайт заказчику использовал плагин Property Listings Plugin. &lt;br /&gt;
&lt;br /&gt;
== 1. Сделал полный перевод плагину ==&lt;br /&gt;
Полный перевод плагина Property Listings Plugin: ([[:File:Easy-property-listings-ru RU.zip|Cкачать архив ZIP]])&lt;br /&gt;
&lt;br /&gt;
== 2. Исправления через functions.php ==&lt;br /&gt;
Основные исправления делал через [[Wp:function|functions.php]] и поскольку для заказчика использовалась тема [[Wp:theme:storefront|StoreFront]] то все изменения вносил через нее.&lt;br /&gt;
&lt;br /&gt;
=== 2.1. ===&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=269</id>
		<title>Wp:plugin:easy-property-listings</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:plugin:easy-property-listings&amp;diff=269"/>
		<updated>2025-03-08T10:19:00Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Здеся я буду хранить все изменения что я внес в плагин Easy Property Listings Plugin:  Делая сайт заказчику использовал плагин Property Listings Plugin.   == 1. Сделал полный перевод плагину == Полный перевод плагина Property Listings Plugin: (Cкачать архив ZIP)  == 2. Исправлен...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здеся я буду хранить все изменения что я внес в плагин Easy Property Listings Plugin:&lt;br /&gt;
&lt;br /&gt;
Делая сайт заказчику использовал плагин Property Listings Plugin. &lt;br /&gt;
&lt;br /&gt;
== 1. Сделал полный перевод плагину ==&lt;br /&gt;
Полный перевод плагина Property Listings Plugin: ([[Easy-property-listings-ru RU.zip|Cкачать архив ZIP]])&lt;br /&gt;
&lt;br /&gt;
== 2. Исправления через functions.php ==&lt;br /&gt;
Основные исправления делал через [[Wp:function|functions.php]] и поскольку для заказчика использовалась тема [[Wp:theme:storefront|StoreFront]] то все изменения вносил через нее.&lt;br /&gt;
&lt;br /&gt;
=== 2.1. ===&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Easy-property-listings-ru_RU.zip&amp;diff=268</id>
		<title>Файл:Easy-property-listings-ru RU.zip</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Easy-property-listings-ru_RU.zip&amp;diff=268"/>
		<updated>2025-03-08T10:07:01Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Перевод плагина Property Listings Plugin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Краткое описание ==&lt;br /&gt;
Перевод плагина Property Listings Plugin&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:pligin:bjorn-main&amp;diff=267</id>
		<title>Wp:pligin:bjorn-main</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:pligin:bjorn-main&amp;diff=267"/>
		<updated>2025-03-08T09:53:46Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Здеся нужно бы рассказать о моем плагине Bjorn Main»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здеся нужно бы рассказать о моем плагине Bjorn Main&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=266</id>
		<title>Wp:theme:storefront</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:storefront&amp;diff=266"/>
		<updated>2025-03-08T09:53:00Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «Сюда я буду заносить изменения которые я делаю в storefron»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сюда я буду заносить изменения которые я делаю в storefron&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:theme:smntcs-retro&amp;diff=265</id>
		<title>Wp:theme:smntcs-retro</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:theme:smntcs-retro&amp;diff=265"/>
		<updated>2025-03-08T09:51:46Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «=Здесь будет описано создание дочерней темы SMNTCS Retro=  ==Создание дочерней темы:== Создаем папку под дочернюю тему в папке &amp;quot;theme&amp;quot; с названием: &amp;lt;code&amp;gt;smntcs-retro-child&amp;lt;/code&amp;gt; Затем в созданной папке создаем файл: &amp;lt;code&amp;gt;style.css&amp;lt;/code&amp;gt; И уже в него вставляем следующий код: &amp;lt;syntaxhighlight lang=...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Здесь будет описано создание дочерней темы SMNTCS Retro=&lt;br /&gt;
&lt;br /&gt;
==Создание дочерней темы:==&lt;br /&gt;
Создаем папку под дочернюю тему в папке &amp;quot;theme&amp;quot; с названием:&lt;br /&gt;
&amp;lt;code&amp;gt;smntcs-retro-child&amp;lt;/code&amp;gt;&lt;br /&gt;
Затем в созданной папке создаем файл: &amp;lt;code&amp;gt;style.css&amp;lt;/code&amp;gt;&lt;br /&gt;
И уже в него вставляем следующий код:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Theme Name:		SMNTCS Retro Сhild&lt;br /&gt;
Theme URI:		https://8j0rn.dagbok.ru/edit/Wp:smntcs-retro&lt;br /&gt;
Author:			8j0rn&lt;br /&gt;
Author URI:		https://8j0rn.dagbok.ru&lt;br /&gt;
Description:	8j0rn Child Theme SMNTCS Retro is a minimalistic theme for the average nerd.&lt;br /&gt;
Version:		1.1&lt;br /&gt;
Tested up to:	6.2&lt;br /&gt;
Requires PHP:	8.1&lt;br /&gt;
License:		GNU General Public License v2 or later&lt;br /&gt;
License URI:	http://www.gnu.org/licenses/gpl-2.0.html&lt;br /&gt;
Text Domain:	SMNTCS Retro&lt;br /&gt;
Template:		smntcs-retro&lt;br /&gt;
Tags:			blog, one-column, custom-menu, featured-images, footer-widgets, rtl-language-support, sticky-post, theme-options, threaded-comments, translation-ready&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё, дочерняя тема создана, теперь следует добавлять изменения в тему чтобы ее адаптировать под свои нужды.&lt;br /&gt;
&lt;br /&gt;
==Изменяем &amp;lt;code&amp;gt;footer&amp;lt;/code&amp;gt;==&lt;br /&gt;
Функция вывода &amp;quot;копирайта&amp;quot; находится в файле: &amp;lt;code&amp;gt;template-tags.php&amp;lt;/code&amp;gt;, который находится в папке &amp;lt;code&amp;gt;inc&amp;lt;/code&amp;gt;&lt;br /&gt;
Функция называется: &amp;lt;code&amp;gt;smntcs_retro_site_footer()&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Displays the site footer.&lt;br /&gt;
 *&lt;br /&gt;
 * @since 1.0.0&lt;br /&gt;
 */&lt;br /&gt;
function smntcs_retro_site_footer() {&lt;br /&gt;
	$data[] = gmdate( &#039;Y&#039; );&lt;br /&gt;
	$data[] = get_bloginfo();&lt;br /&gt;
	$data[] = esc_html__( &#039;© 8j0rn&#039;, &#039;smntcs-retro&#039; );&lt;br /&gt;
	$data[] = sprintf(&lt;br /&gt;
		&#039;&amp;lt;a href=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
		esc_url( __( &#039;https://8j0rn.dagbok.ru&#039;, &#039;smntcs-retro&#039; ) ),&lt;br /&gt;
		esc_html__( &#039;Powered by WordPress&#039;, &#039;smntcs-retro&#039; )&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$wrapper = &#039;&amp;lt;div id=&amp;quot;site-footer&amp;quot;&amp;gt;&amp;amp;copy; %s %s. %s. %s.&amp;lt;/div&amp;gt;&amp;lt;!-- #site-footer --&amp;gt;&#039;;&lt;br /&gt;
	$html    = sprintf( $wrapper, $data[0], $data[1], $data[2], $data[3] );&lt;br /&gt;
	$html    = apply_filters( &#039;smntcs_retro_site_footer&#039;, $html, $data, $wrapper );&lt;br /&gt;
&lt;br /&gt;
	echo $html; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
	<entry>
		<id>https://8j0rn.dagbok.ru/index.php?title=Wp:themes&amp;diff=264</id>
		<title>Wp:themes</title>
		<link rel="alternate" type="text/html" href="https://8j0rn.dagbok.ru/index.php?title=Wp:themes&amp;diff=264"/>
		<updated>2025-03-08T09:51:14Z</updated>

		<summary type="html">&lt;p&gt;8j0rn: Новая страница: «# StoreFront Theme # SMNTCS Retro Chil Theme»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# [[wp:theme:storefront|StoreFront Theme]]&lt;br /&gt;
# [[wp:theme:smntcs-retro|SMNTCS Retro Chil Theme]]&lt;/div&gt;</summary>
		<author><name>8j0rn</name></author>
	</entry>
</feed>