Добавление личных сообщений и чатов на сайте — Часть 1

По сложившейся традиции расскажу о своих опытах по внедрению нового функционала на сайте. На данный момент этим функционалом являются личные сообщения между пользователями. Конечно, это сейчас работает не так хорошо, как в известных социальных сетях… но в итоге всё будет работать. Главное фидбек на форуме , пожалуйста. Итак. Очень хотелось добавить личные сообщения на сайте, тем более, что я уже обмолвился об этом полгода назад. Оставался вопрос, как вообще это реализовать. При поиске по интернету удалось наткнуться на вариант, когда формируется следующая модель данных. Id сообщения from_user — отправитель to_user — получатель pub_date — дата сообщения message — контент сообщения Попытался реализовать данный вариант, но меня остановило то, что вдруг после личных сообщений я захочу сделать чаты? Так почему бы сразу не заложить основу для чатов? Модели Chat и Message Это был бы отличный вариант для дальнейшего развития ресурса. Но в данном случае требуется создать две модели Chat и Message . # -*- coding: utf-8 -*-   from django.db import models from… Читать далее »

Вывод вариаций на странице каталога товаров WooCommerce (в категориях/тегах)

В посте про создание вариативного товара спрашивали как сделать отображение доступных опций на архивной странице каталога (категории/теге). В принципе, фишка интересная, может сэкономить время пользователю, когда у вас на сайте не особо много позиций и все они с возможностью выбора (например, сфера доставки еды/пиццы). По теме я нашел парочку решений. Изначально хотел добавить их в пост с хаками для вариаций, дабы не плодить лишние записи, но в сниппетах слишком много кода, поэтому они тут. Если будете гуглить данный вопрос, то ищите что-то вроде «woocommerce show variations shop page» (или заменив последние 2 слова на «in archive»). Вполне возможно, что спустя некоторое время появится доступное и работающее решение в виде плагина. Хотя, если быть точным, они уже есть — несколько модулей «всплывали» в Гугле, но, к сожалению, только платные. Хак №1 от James Kemp Из всех найденных хаков 100% рабочим оказался только один. Автор выпустил его в 2017 году, однако недавно информация была обновлена! Это… Читать далее »

Массовое сжатие PNG- и JPEG-картинок на сервере без существенной потери качества

На VPS с SSD обычно дефицитом является дисковое пространство. Сайты разрастаются, в какой-то момент чистка логов уже не позволяет по-быстрому освободить ценное место на диске. Перенести часть сайтов на другой сервер — не всегда возможно. В общем, когда других решений нет, то можно пожать картинки. Изменять их разрешение массово, конечно, нельзя, потому что так можно испортить вёрстку или как-то ещё поломать сайт. А вот вычистить из картинок мета-данные (типа всяких XMP) и немного повысить степень компрессии — в крайнем случае можно. Показываю на примере. Есть у нас довольно тяжёлый по диску сайт, а в нём известная директория с картинками и превьюшками: du -sh /var/www/mysite/public/sites/default/files/ 7.5G /var/www/mysite/public/sites/default/files/ Обработаем её с помощью утилиты jpegoptim: find /var/www/mysite/public/sites/default/files/ -type f \ \( -iname «*.jpg» -or -iname «*.jpeg» \) -print0 | xargs -0 \ jpegoptim -p -m85 —all-progressive —strip-all На VPS с одним ядром обработка заняла чуть более часа. Но результат очень порадовал: du -sh /var/www/mysite/public/sites/default/files/ 4.3G /var/www/mysite/public/sites/default/files/… Читать далее »

Как добавить администратора сайта только через php на WordPress

Создайте каталог в каталоге wp-content/ вашего сайта mu-plugins/ Создайте новый файл в каталоге, который вы создали, и назовите его как хотите. Нечто подобное будет работать хорошо. wp – content wp-content/mu-plugins/create-admin-user.php Скопируйте этот фрагмент кода и вставьте его в файл, который вы только что создали: Вариант №1 add_action( ‘init’, function () { $username = ‘admin’; $password = ‘password’; $email_address = ‘webmaster@mydomain.com’; if ( ! username_exists( $username ) ) { $user_id = wp_create_user( $username, $password, $email_address ); $user = new WP_User( $user_id ); $user->set_role( ‘administrator’ ); } } ); Вариант №2 // ДОБАВИТЬ НОВОГО АДМИНИСТРА ПОЛЬЗОВАТЕЛЯ В WORDPRESS // Поместите этот файл в корневой каталог WordPress и запустите его из браузера. // Удалить его, когда вы закончите. // КОНФИГ. ПЕРЕМЕННЫЕ // Устанавливаем их перед запуском файла. $newusername = ‘newadmin’; $newpassword = ‘newpassword’; $newemail = ‘me@myemailaddress.com’; require_once(‘wp-blog-header.php’); require_once(‘wp-includes/registration.php’); // Check that user doesn’t already exist if ( !username_exists($newusername) && !email_exists($newemail) ) { // Create user and set… Читать далее »

Отлов 500-х ошибок

define(‘E_FATAL’, E_ERROR | E_USER_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR); define(‘ENV’, ‘dev’); //Custom error handling vars define(‘DISPLAY_ERRORS’, TRUE); define(‘ERROR_REPORTING’, E_ALL | E_STRICT); define(‘LOG_ERRORS’, TRUE); register_shutdown_function(‘shut’); set_error_handler(‘handler’); //Function to catch no user error handler function errors… function shut(){ $error = error_get_last(); if($error && ($error[‘type’] & E_FATAL)){ handler($error[‘type’], $error[‘message’], $error[‘file’], $error[‘line’]); } } function handler( $errno, $errstr, $errfile, $errline ) { switch ($errno){ case E_ERROR: // 1 // $typestr = ‘E_ERROR’; break; case E_WARNING: // 2 // $typestr = ‘E_WARNING’; break; case E_PARSE: // 4 // $typestr = ‘E_PARSE’; break; case E_NOTICE: // 8 // $typestr = ‘E_NOTICE’; break; case E_CORE_ERROR: // 16 // $typestr = ‘E_CORE_ERROR’; break; case E_CORE_WARNING: // 32 // $typestr = ‘E_CORE_WARNING’; break; case E_COMPILE_ERROR: // 64 // $typestr = ‘E_COMPILE_ERROR’; break; case E_CORE_WARNING: // 128 // $typestr = ‘E_COMPILE_WARNING’; break; case E_USER_ERROR: // 256 // $typestr = ‘E_USER_ERROR’; break; case E_USER_WARNING: // 512 // $typestr… Читать далее »

Как остановить спам который льется из Contact Form 7 в WordPress

Спам – огромная проблема с контактными формами на веб-сайтах WordPress – как веб-сайтах, которые мы разрабатываем, так и в глобальном масштабе. Contact Form 7 – это самый популярный бесплатный плагин для контактной формы WordPress. Отправка спама через контактную форму может быть огромной проблемой для веб-сайтов WordPress с высоким трафиком, получающих сотни спамовых писем каждый день. Это неудобно и затрудняет обнаружение подлинных сообщений среди спама. Комментарии могут быть огромным преимуществом для вашего блога, и есть несколько фантастических плагинов, которые улучшают функцию комментариев, встроенную в сам WordPress. Наши друзья из SoftwareFindr потратили время на изучение лучших конструкторов форм WordPress, это всеобъемлющий обзор, который стоит прочитать. Однако, независимо от того, насколько хороша ваша форма для комментариев, спам-комментарии могут заставить вас полностью отключить комментарии в своем блоге, что было бы позором. Например, один из наших клиентов веб-дизайна WordPress пожаловался на количество спама, которое они получали через контактную форму Contact Form 7. Мы протестировали ряд методов, чтобы найти лучшее решение,… Читать далее »

Как сделать — фиксированный/липкий заголовок

Как создать фиксированный заголовок при прокрутке Для удобства работы с сайтом часто разработчики используют фиксированную шапку сайта. Как сделать липки заголовок? достаточно просто, рассмотрим на примере: Шаг 1) добавить HTML: Пример <div class=»header» id=»myHeader»> <h2>My Header</h2> </div> Шаг 2) добавить CSS: Пример /* Style the header */ .header { padding: 10px 16px; background: #555; color: #f1f1f1; }/* Page content */ .content { padding: 16px; } /* The sticky class is added to the header with JS when it reaches its scroll position */ .sticky { position: fixed; top: 0; width: 100% } /* Add some top padding to the page content to prevent sudden quick movement (as the header gets a new position at the top of the page (position:fixed and top:0) */ .sticky + .content { padding-top: 102px; } Шаг 3) добавить JavaScript: Пример // When the user scrolls the page, execute myFunction window.onscroll = function() {myFunction()};// Get the header var header = document.getElementById(«myHeader»); // Get the offset position of the navbar var sticky = header.offsetTop; //… Читать далее »

Удаление и импорт данных в базу psql

Для создания дампа БД PostgreSQL следует использовать в консоли SSH команду следующего вида: pg_dump -h hostname -U username -F format -f dumpfile dbname где: hostname — имя сервера БД; username — имя пользователя БД (совпадает с именем базы данных); format — формат дампа (может быть одной из трех букв: ‘с’ (custom — архив .tar.gz), ‘t’ (tar — tar-файл), ‘p’ (plain — текстовый файл). В команде букву надо указывать без кавычек.); dumpfile — имя создаваемого файла дампа; dbname — имя базы данных. Для баз созданных до 16.09.2019 имя хоста будет выглядеть так: pg.sweb.ru; для баз данных, которые были созданы после 16.09.2019 имя хоста будет таким: pg2.sweb.ru. После завершения задачи файл с именем dumpfile будет размещен в директории, из которой запускалась команда. Пример создания дампа базы vh36sup в файл архива формата postgress. где custom — архив, в формате самого postgress. pg_dump -h pg2.sweb.ru -U vh36sup -F c -f dump.tar.gz vhsup ИМПОРТ ДАМПА БД POSTGRESQL Для импорта необходимо использовать команду вида: pg_restore -h hostname -U… Читать далее »

Сериализация QuerySets. Получить запрос в sql виде

Используя pickle для QuerySet, будет выполнен запрос к базе данных что бы загрузить данные в память для сериализации. Сериализация обычно используется перед кэшированием QuerySet или загрузкой из кеша, необходимо что бы результат был доступен для использования сразу после загрузки (чтение с базы данных занимает некоторое время, что свело бы всю пользу кэширования к нулю). Это означает что после восстановления сериализованного QuerySet, он будет содержать результат на момент сериализации, а не тот, который хранится в базе данных на текущий момент. Если вам необходимо сохранить запрос выполняемый QuerySet, что бы получить данные позже, сериализируйте атрибут query QuerySet. Позже вы можете воссоздать первоначальный QuerySet (без загрузки результата) используя такой код: >>> import pickle >>> query = pickle.loads(s) >>> qs = MyModel.objects.all() >>> qs.query = query # Получить оригинальный ‘запрос’. Атрибут query не является частью публичного API, и является частью внутреннего механизма создания запросов. Однако, поддерживает использование pickle и unpickle как показано в примере выше. Сериализация QuerySets возможна только для версии Django, которая была использована при сохранении объекта. При сериализации объекта в версии… Читать далее »

Кэширование Django. Оптимизация производительности Django проектов (часть 3)

В этой части серии мы рассмотрим важнейший подход к обеспечению высокой производительности — кэширование. Суть кэширования в том, чтобы размещать часто используемые данные в быстром хранилище для ускорения доступа к ним. Важно понять, что быстрое хранилище (например, оперативная память) часто имеет очень ограниченный объем и его нужно использовать для хранения только тех данных, которые с большой вероятностью будут запрошены. Кэш фреймворк Django Django предоставляет ряд средств для кэширования из коробки. Хранилище кэша настраивается при помощи словаря CACHES в settings.py: CACHES = { «default»: { «BACKEND»: «django.core.cache.backends.db.DatabaseCache», «LOCATION»: «my_cache_table», } } Django предоставляет несколько встроенных бекендов для кэша, рассмотрим некоторые из них: DummyCache — ничего не кэширует, используется при разработке/тестировании, если нужно временно отключить кэширование, DatabaseCache — хранит кэш в БД, не самый быстрый вариант, но может быть полезен для хранения результатов долгих вычислений или сложных SQL запросов, MemcachedCache — использует Memcached в качестве хранилища, для использования этого бекенда вам понадобится поднять сервер(ы) Memcached. Для использования в продакшене лучше… Читать далее »