• Есть ли какой хороший бесплатный плагин импорта для Wordpress?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Я всегда пользуюсь All-in-One WP Migration. Там есть ограничения на размер импортируемого файла, но их можно обойти, загрузив файл напрямую на сервер.

    Не уверен, что он берёт кастомные поля, но меня никогда не подводил.
    Ответ написан
    1 комментарий
  • Что за javascript фреймворк на сайте мойгаз.смородина.онлайн?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    React.js
    Все остальные файлы и разметка подключаются и создаются динамически.
    Ответ написан
    3 комментария
  • Как применить стиль и разметку из примера?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    То, что вы предоставили - это формат шаблонизатора Pug. Ещё такие штуки называют препроцессорами HTML. Они аналогичны препроцессорам CSS: Sass, SCSS и другим. Позволяют меньше писать и кому-то нравятся больше. В чём-то удобнее и, самое главное, умеют работать с JavaScript.

    В вашем случае, чтобы получить чистый HTML достаточно нажать на кнопку View Compiled HTML:
    63cd4b6a0cb32326210456.png
    Ответ написан
    1 комментарий
  • Как убрать/изменить границу при сфокусированном textarea?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Попробуйте. Тоже самое работает с select и input.
    .chat-textarea:focus {
      outline: none;
    }
    Ответ написан
    Комментировать
  • Как поставить изменение картинки только в одном блоке?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    При условии, что в .company__item находятся и .web-active, и .direction-active
    let companyItem = document.querySelectorAll('.company__item');
    
    companyItem.forEach(e => {
        e.addEventListener('mouseover', ({ target }) => {
            target.querySelectorAll('.web-active').forEach(e => {
                e.src="img/web.png";
            });
        });
    });
    
    companyItem.forEach(e => {
        e.addEventListener('mouseout', ({ target }) => {
            target.querySelectorAll('.web-active').forEach(e => {
                e.src="img/web-static.png";
            });
        });
    });
    
    companyItem.forEach(e => {
        e.addEventListener('mouseover', ({ target }) => {
            target.querySelectorAll('.direction-active').forEach(e => {
                e.src="img/arrow-search-active.png";
            });
        });
    });
    
    companyItem.forEach(e => {
        e.addEventListener('mouseout', ({ target }) => {
            target.querySelectorAll('.direction-active').forEach(e => {
                e.src="img/arrow-search.svg";
            });
        });
    });
    Ответ написан
    3 комментария
  • Как ответить на callback?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Вам не нужно отвечать на предоставленное уведомление. Оно не требует ответа, это обычное сообщение, законченная транзакция.

    Если же речь идёт об ответе на запросы из inline клавиш, то ответить вы на них можете через метод answerCallbackQuery. В теле запроса нужно указать callback_query_id, на который вы отвечаете.

    Но ещё раз - на сообщения отвечать не нужно. Вы можете это делать, но это совершенно не обязательно. Главное отдать код ответа 200, чтобы телеграм понял, что вы получили уведомление.
    Ответ написан
  • Сервис/место для хранения файлов WP в 2023?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Самое простое и банальное - использовать S3-совместимое хранилище. Плагинов, которые обеспечат работу с таким хранилищем много, например:
    https://wordpress.org/plugins/amazon-s3-and-cloudfront/
    https://wordpress.org/plugins/ilab-media-tools/
    https://wordpress.org/plugins/wp-s3-smart-upload/

    S3 удобен тем, что вы будете платить только за используемое место, а так же место в облаке будет неограниченным. Самый популярный провайдер в мире - это Amazon Web Services. Но есть ещё Google Cloud Platform и российские Яндекс Облако, VK Cloud, Сбер чё-то там

    Из альтернатив - купить побольше хостинг, пара десятков гигабайт это не так уж и много, чтобы заморачиваться так сильно.
    Ответ написан
  • Можно ли разместить тег div внутри table?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Вы можете самостоятельно проверить валидность такой разметки в валидаторе (валидно)
    <!DOCTYPE html>
    <html lang="ru">
      <head>
        <title>test</title>
      </head>
      <body>
        <table>
          <tr>
            <td>
              <div>content</div>
            </td>
          </tr>
        </table>
      </body>
    </html>
    Ответ написан
    Комментировать
  • Регистрация/авторизации с помощью соц сетей?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Вообще, есть куча разных сервисов, которых предоставляют API авторизации сразу из коробки. Например, старинный uLogin. Он даёт сразу удобные данные в едином формате для многих социальных сетей. Он так же даёт уникальный ID аккаунта, по которому можно определить, зарегистрирован ли пользователь, или ещё нет.
    Но этот вариант плох по многим причинам, основная из которых - зависимость от сомнительного сервиса. Но есть менее сомнительные сервисы, которые выполняют такой функционал.

    Крутые ребята делают авторизацию напрямую. Например, тот же ВК. При авторизации он даёт уникальный ID профиля, по которому вы можете проверить уникальность. В идеальном мире в вашей базе данных будет отдельная таблица для авторизаций через Вконтакте, где будет содержаться VK ID и ID пользователя в вашей системе. При попытке зарегистрироваться вы должны проверить, если ли этот VK ID в вашей системе. Если есть - то авторизовать пользователя как уже зарегистрированного, если нет - внести нужные данные в базу и зарегистрировать нового пользователя.

    Проблемы начинаются, когда гейтвеев становится больше, чем один VK. В этом случае у вас сразу появляется большая куча лишних таблиц и много логики. Это не плохо само по себе, но не опытному программисту может очень сильно навредить в архитектуре. Поэтому проще всего использовать сторонние сервисы, которые предоставляют единый ID для всех социальных сетей, а вы на своей стороне уже можете даже в таблице с пользователями хранить этот ID для дальнейшей проверки. Но вопрос в цене, конечно. И в поддержке российских соц сетей.

    https://auth0.com/learn/social-login
    https://firebase.google.com/products/auth
    Ответ написан
  • Как подключить клиенский js и css к express?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    В вопросе вы не указали, что именно не работает, но смею предположить, что указаны неправильные ссылки на статичные файлы.

    Во-первых, строкой
    app.use(express.static(__dirname + '/public/css'));

    Вы открываете доступ только к папке /public/css. Если вы хотите открыть доступ ко всей папке public нужно использовать
    app.use(express.static(__dirname + '/public'));

    Во-вторых, вы подключаете скрипты и стили без ведущего слеша. Если перейти на внутреннюю страницу сайта, например на /subpath, то браузер будет искать стили в /subpath/css/index.css. Нужно загружать стили и скрипты с ведущим слешем, чтобы они всегда брались из корня:
    <link rel="stylesheet" type="text/css" href="/css/index.css">
    Ответ написан
    Комментировать
  • Объясните структуру веб-сервера на node js и socket.io?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    1. Epxress от Nginx отличается главным образом тем, что первый - это сервер для Node.js приложений, а второй для Linux. Вы можете не использовать Express, или не использовать Nginx. По отдельности эти технологии так же будут работать. Чаще всего, ставят связку Nginx + Express для упрощения администрирования нескольких сайтов на одном VPS. Nginx отвечает за внешний роутинг при обращению к сайту, он передаёт запрос нужному Node.js приложению (и не обязательно это должен быть Node.js + Express). А дальше уже Express разбирается с запросом и выполняет бизнес-логику.

    2. По большому счёту, в такой связке проще всего воспринимать Socket.io как расширение для Express, добавляющее поддержку сокетов. Технически, Socket.io не нуждается в Express и может работать на любом другом сервере. Но так как вы задействуете Express, запрос проходит сначала в него, а дальше управление передаётся в Socket.io. Если вас интересует более глубокое погружение - то лучше всего читать документацию Socket.io и смотреть, как работает он.

    3. https://socket.io/get-started/ https://socket.io/docs/v4/server-initialization/#w... - у Socket.io прекрасная документация, которая на примерах показывает различные варианты использования.
    Ответ написан
    1 комментарий
  • Как узнать что chat_id выключил бот?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    1) Вы получите повторные сообщения, если с первого раза Telegram не получил код ответа 200 от вашего бекенда.
    2) При попытке отправить сообщение человеку, который заблокировал вашего бота, вы получите 403 ошибку. На неё и ориентируйтесь. Это можно протестировать самостоятельно, остановив бота у себя на аккаунте.
    Ответ написан
    1 комментарий
  • Как изменить формат полученной даты?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Самое простое - использовать библиотеку типа Moment.js или Day.js. Они умеют работать с датами аккуратно и красиво. Если в проекте так или иначе отображаются даты, то вам эти библиотеки пригодятся.

    Для разового же использования куда проще и лучше не тянуть лишние зависимости и использовать нативный Date.

    В вашем случае строка 2023-01-09T05:39:26+04:00 легко распарситься:
    const date = new Date("2023-01-09T05:39:26+04:00")

    Далее, вы уже можете отформатировать её в нужном вам виде:
    console.log(`${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()} (${d.getHours()}:${d.getMinutes()}:${d.getSeconds()})`) //'2023-1-9 (7:39:26)'


    В примере выше числа будут без ведущего нуля. Как добавить нолик в начало, надеюсь, сможете разобраться самостоятельно.
    Ответ написан
    2 комментария
  • Тесты Laravel, config() или env()?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Используйте в основном коде и тестах только config().
    Это связано с тем, что у вас в приложении всегда должен быть только одни источник данных.

    Простой пример из дефолтной сборки Laravel. В app.php есть строка:
    'name' => env('APP_NAME', 'Laravel'),
    Самое просто, что вы можете сделать, это вызвать config('app.name') где-нибудь в коде, чтобы получить данные из этой настройки. Вот только если вы вызовите env('APP_NAME') вы, возможно, получите ошибку, в случае, если эта переменная не задана в переменных среды.
    Но как вы видите из кода выше, она совершенно необязательно должна быть задана в переменных среды, так как для неё задано значение по умолчанию: Laravel. А значения в конфиге могут быть вообще самой разной степени извращённости. И они могут составляться из частей. Например:
    'endpoint' => 'https://' . env('API_DOMAIN') . '/some/subroute',


    Это банальный и простой пример. Но на большой проекте с массой переменных и настроек вы однозначно столкнётесь с трудностями такого рода.

    Ваша задача сделать код удобным и читаемым. Чтобы будущие программисты могли распутать макаронину, что вы сплели. А разнообразие источников данных только запутает читателя.
    Ответ написан
    Комментировать
  • Как применить стиль к тегу сразу после его появления в DOM через js?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Вы что-то явно делаете не так в архитектуре изначально.
    Принцип должен быть такой:
    1) Если блок загружается сразу при загрузке страницы, тогда ваш прелоадер присутствует изначально на странице и имеет все необходимые стили (допустимо даже использовать inline стили в этом случае), чтобы перекрыть загружающуюся часть. Как только контент загрузился - прелоадер скрывается/удаляется из разметки.
    2) Если блок начинает загружаться динамически по требованию пользователя, тогда перед загрузкой, вы помещаете прелоадер в нужно место и начинаете делать под ним загрузку. Когда контент будет загружен - прелоадер можно будет так же скрыть/удалить из разметки.

    Если же у вас нет желания строить архитектуру правильно изначально, присмотритесь к MutationObserver
    Ответ написан
    Комментировать
  • Как сделать автоматическое маштабирование изображений при загрузке?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    В WordPress уже всё придумали за вас: add_image_size().
    Смысл в том, что вам нужно в своей теме зарегистрировать необходимые размеры изображений. И все новые изображения сразу будут обрезаться в указанных размерах. Далее, где это необходимо вы сразу сможете без труда получать нужные размеры по их названию, которое указали при регистрации.

    Важно понимать, что это работает только на новых картинках. Если вы хотите создать миниатюры для новых изображений - нужно использовать WP CLI или соответствующий плагин (подобных плагинов масса).

    А для оптимизации оригиналов на этапе загрузки можно использовать какой-нибудь плагин: https://wordpress.org/plugins/resize-image-after-u...
    Ответ написан
    3 комментария
  • Как сделать кнопку лайков NodeJs?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Вы должны разделять бекенд и фронтенд. Фронт - это то, что видит пользователь (HTML, CSS, клиентский JS), бек - это то, что вы пишите на Node.
    То, что вы хотите сделать вам нужно в первую очередь сделать на фронте, а уже затем ловить на бекенде с вашим Node.js.

    Чтобы отправить запрос без перезагрузки страницы подойдёт банальный fetch. Более извращённые варианты с сокетами не предлагаю.
    Далее, вы на фронте рисуете изменения, которые хотите: загрузку или отображение того, что лайк поставлен и отправляете запрос себе в бек ноды.

    У себя на Node ловите этот запрос, в зависимости от того, какой сервер используется.

    Примеров подобного в интернете полно. Например, вот первое видео из гугла.
    Ответ написан
    Комментировать
  • Как лучше хранить заявки из форм в БД?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    1) Всегда можно рассмотреть использование нереляционной базы данных на подобие MongoDB/YDB/CouchDB. Записи в таких базах подобны JSON-документам и не имеют строгой табличной структуры, как у реляционных аналогов.
    2) Ваш вариант с Many-to-many связями вполне неплох, если хотите использоваться всё же реляционную БД. Он не нарушает нормальных форм.

    Лично я считаю что нереляционные базы возможны только в прототипах, мелких проектах и "по приколу". Если вы планируете масштабироваться - в будущем вам точно захочется строгой типизации.
    Ответ написан