• Как сделать aspect-ratio на основе переменных?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Реализуемо это на css?

    Да (на css3):
    :root {
        --w: 300px;
        --h: 200px;
    }
    
    // variant one
    
    div {
        width: var(--w);
        height: var(--h);
    }
    
    div::before {
        content: "";
        display: block;
        padding-top: calc(var(--h) / var(--w) * 100vh);
    }
    
    // variant two 
    
    div::before {
        content: '';
        display: block;
        width: var(--w);
        padding-top: calc((var(--h) / var(--w)) * 100%);
    }
    Ответ написан
    1 комментарий
  • Как через wpcf7mailsent добавить класс к одному попапу, а не всем, в которых данная форма?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    Если одна и та же форма вызывается в попапах на странице несколько раз, то как обратиться к родителю конкретной форме, т.к. this не работает?

    У анонимных функций в js нет своего this, соответственно берется this из скоупа выше.
    Но так, естественно, новый класс прикрепляется ко всем попапам.

    Можно попробовать искать ближайшего родителя с css классом modal-body (т.е. настоящей формы, где сработало событие wpcf7submit):
    document.addEventListener('wpcf7submit', (e) => {
        if ('123' === e.detail.contactFormId) {
            const form = e.target;
            const modalBody = form.closest('.modal-body');
    
            if(modalBody) {
                modalBody.classList.add('thanks-this');
            }
            else {
                console.log('Творится какая то дичь!');
            }
        }
    });
    Ответ написан
    Комментировать
  • Как прописать пограничный случай в коде?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    def has_char(string, char):
        i = 0
        while i < len(string):
            if char == string[i].lower():
                return True
            if char == string[i].upper():
                return True
            i += 1
        return False
    
    print(has_char('Hello', 'h'))  # True
    print(has_char('Hello', 'H'))  # True
    print(has_char('Hello', 'ё'))  # False, ;)

    Сравнение char с string[i] без учета регистра?
    def has_char(string, char):
        for i in range(len(string)):
            if char == string[i]:
            # if char.lower() == string[i].lower():
                return True
        return False
    
    print(has_char("Привет", "п"))  # True? False!

    И да, в Вашем случае, for будет лучше while, т.к. цикл не предполагает неопределенное количество итераций, читается лучше, да и сами проверки можно упростить:
    def has_char(string, char):
      for _char in string:
        if _char.lower() == char.lower():
          return True
      return False
    
    print(has_char('Hello', 'h'))  # True
    print(has_char('Hello', 'H'))  # True
    print(has_char('Hello', 'ё'))  # False, ;)
    Ответ написан
    1 комментарий
  • Как нажать кнопку на сайте пика через селениум?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Как нажать кнопку на сайте пика через селениум?

    4.6. Locating Elements by Class Name

    Вместо By.CLASS_NAME (можно передать лишь 1 наименование класса), используйте By.CSS_SELECTOR (можно передать любой селектор):
    # pahe = driver.find_element(By.CLASS_NAME, 'sc-gsnTZi fWJuXR').click()
    pahe = driver.find_element(By.CSS_SELECTOR, '.sc-gsnTZi.fWJuXR').click()


    И, если есть минутка - на скок понял это проверка сертификатов - как это поправить можно? (куда посмотреть)
    [8468:12460:0214/095050.752:ERROR:ssl_client_socket_impl.cc(974)] handshake failed; returned -1, SSL error code 1, net_error -101
    [8468:12460:0214/095050.866:ERROR:ssl_client_socket_impl.cc(974)] handshake failed; returned -1, SSL error code 1, net_error -101

    Проблемы с ssl соединением (handshake failed).
    Ответ написан
    Комментировать
  • Как вывести картинки?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    в папке images в папке проекта

    А папка images в яйце, а яйцо в другой папке. Предположу, что речь идет про папку images, которая находится в корне проекта, тогда обычно указывается относительный путь:
    <img src="/images/img.jpg" alt="" width="100px" height="100px"/>
    
    // or
    
    import Image from 'next/image';
    <Image src="/images/img.jpg" alt="" width={100} height={100}/>
    Ответ написан
  • Может ли работодатель запретить сотрудникам использовать личные пк?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Ст. 72 ТК РФ. Если коротко, то работодатель вправе устанавливать правила выполнения трудовых обязанностей работника в трудовом договоре (и любых допниках), при условие, если они не противоречат законам РФ.
    Кто как регламентировал такие моменты?

    Выполнение трудовых обязанностей работником происходит с использованием инструментов, определенными работодателем в должностной инструкции.

    https://www.9111.ru/questions/11162198/
    https://journal.tinkoff.ru/ask/taina/
    Ответ написан
    3 комментария
  • Какой есть онлайн-сервис, делающий css код кроссбраузерным?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    С натяжкой, можно сказать, что он старается сделать css код более кроссбраузерным + в онлайн варианте: Autoprefixer CSS
    Ответ написан
    Комментировать
  • Как сделать скрин отрывка в Selenium Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Сохраняем скрин всей страницы, затем вырезаем нужное из этого скрина:
    $ pip install --upgrade webdriver-manager
    $ pip install Pillow

    from selenium import webdriver
    from selenium.webdriver.edge.service import Service
    from PIL import Image
    from webdriver_manager.microsoft import EdgeChromiumDriverManager
    
    driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()))
    driver.get("https://pillow.readthedocs.io/en/stable/installation.html")
    path = "full.png"
    driver.save_screenshot(path)
    driver.quit()
    
    x = 100
    y = 100
    w = 500
    h = 300
    
    image = Image.open(path)
    cropped = image.crop((x, y, x+w, y+h))
    cropped.save("crop.png")

    КартинкО

    65cc62a645be7633087189.png
    65cc62ac23be7654822496.png
    65cc62b0ef884076037417.png

    Но обычно отправляют сразу изображение капчи (оно обычно в html в style как base64 вставлено), ничего не вырезая.
    Ответ написан
    2 комментария
  • Почему обычно React не рендерят прямо в body?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Почему мы не можем в React рендерить прямо в body?

    Не знаю, почему Вы не можете. createRoot().
    Ответ написан
  • Как загружать навбар?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Встал следующий вопрос - как реализовать подгрузку меню сайта (навбара), чтобы в случае необходимости (например нужно будеть добавить пункты меню для сайта) не пришлось переписывать все страницы сайта, а изменить только сам навбар, который все страницы сайта уже самостоятельно подгрузят себе.

    Фактически, 3 варианта:
    1. Динамическая подгрузка пунктов меню, через js. В таком случае, не нужны сборщики, но SEO данного блока будет так себе.
    2. Использование сборщика проектов, например, Webpack + шаблонизатор (EJS или Handlebars).
    3. Использование сборщика проектов, например, Webpack + React/Vue.
    Ответ написан
    4 комментария
  • Как из админки запустить php-скрипт по клику?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    Я бы использовал плагин, с личной админкой и кнопкой на панели меню:
    /*
    Plugin Name: Супер плагин
    Description: Невероятный плагин, взламывает пентагон по клику!
    Version: 0.1
    Author: Михаил Р.
    */
    
    function super_plugin_menu() {
        add_menu_page('Супер плагин', 'Супер плагин', 'manage_options', 'custom-php-executor', 'super_plugin');
    }
    
    function super_plugin() {
        if(isset($_POST['custom_php_code'])) {
            $code = stripslashes($_POST['custom_php_code']);
            update_option('super_plugin_custom_code', $code);
        } else {
            $code = get_option('super_plugin_custom_code', '');
        }
    
        ?>
        <div class="wrap">
            <h2>Супер плагин</h2>
            <form method="post">
                <textarea
                    name="custom_php_code"
                    style="width:100%;height:200px;"
                ><?php echo htmlspecialchars($code); ?></textarea>
                <input type="submit" value="Выполнить, как следует!" class="button button-primary">
            </form>
        </div>
    
        <?php
        if(!empty($code)) {
            eval($code);
        }
    }
    
    add_action('admin_menu', 'super_plugin_menu');

    КартинкО

    65ca1aaf1a6e2384036131.png
    65ca1ab6114ec549148365.png
    65ca1abcca92b540993230.png
    65ca1ac2ceaff186880778.png
    Ответ написан
    2 комментария
  • Contact Form 7 как сделать автоматический переход между полями?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Поля формы ограничены по количеству символов

    Т.к. надо угадать, что такое "ограничены по количеству символов", то предположу, что речь о length input.

    Подключить скрипт на сайт, и при необходимости, подкорректировать селектор полей формы:
    document.addEventListener('DOMContentLoaded', () => {
        const elements = document.querySelectorAll('.wpcf7-form input[type="text"], .wpcf7-form textarea');
    
        elements.forEach((el, i) => {
            const maxLength = parseInt(el.getAttribute('maxlength'), 10);
    
            el.addEventListener('input', () => {
                const length = el.value.length;
                if (length >= maxLength) {
                    if (i + 1 < elements.length) {
                        elements[i + 1].focus();
                    }
                }
            });
        });
    });
    Ответ написан
    Комментировать
  • Contact Form 7 как запретить ввод пробелов?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Подключить скрипт на сайт, и при необходимости, подкорректировать селектор полей формы:
    document.addEventListener('DOMContentLoaded', () => {
        const elements = document.querySelectorAll('.wpcf7-form input[type="text"], .wpcf7-form textarea');
    
        elements.forEach((el) => {
            el.addEventListener('input', (e) => {
                e.target.value = e.target.value.replace(/\s+/g, '');
            });
        });
    });

    UPD из комментов, ограничение на ввод в input только цифр (необходимо указать css класс такому input only-numbers):
    document.addEventListener('DOMContentLoaded', () => {
        const elements = document.querySelectorAll('.only-numbers');
    
        elements.forEach((el) => {
            el.addEventListener('input', (e) => {
                e.target.value = e.target.value.replace(/\D/g, '');
            });
        });
    });
    Ответ написан
    3 комментария
  • Как должен выглядеть location подмены картинок?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Можно заюзать алиасы:
    # /resize/422346/asjdhy37772jssh_500x500.webp > /home/bitrix/ext_www/images/resize/422346/asjdhy37772jssh_500x500.webp
    location /resize/ {
       alias /home/bitrix/ext_www/images/resize/;
    }

    А вообще, желательно проверять логи nginx по ~адресу /var/log/nginx/error.log.
    Ответ написан
  • 404 ошибка при переходе на страницу рубрик?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    Проблема 404 была при указание rewrite в cpt:
    'rewrite' => array('slug' => '/', 'with_front' => false),

    Проблема 404 была решена так:
    'rewrite' => array('slug' => 'services', 'with_front' => false),
    Ответ написан
    Комментировать
  • Как настроить редирект со всех страниц сайта на эти же страницы его копии на другом домене?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    301 редирект всех запросов со старого домена (http/https), на новый (https).

    .htaccess:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^old\.ru$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.old\.ru$
    RewriteRule ^(.*)$ https://new.ru/$1 [R=301,L]
    Ответ написан
    Комментировать
  • Как сделать пунктирное подчеркивание ссылок?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Ответ написан
    Комментировать
  • Есть ли способы борьбы со спамными лидами?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    С начала декабря видим увеличение спамных лидов, прогрессия примерно такая: ноябрь 3%, декабрь 10%, январь 20%.

    Среднее поведение.
    В заявках указаны реально существующие номера телефонов, ФИО полностью, но когда менеджеры по ним звонят, то люди либо орут, что их достали уже звонками, а они нигде свои заявки не оставляли, либо вовсе не берут трубку.

    Среднее поведение.
    смотрела по вебвизору - похоже на поведение людей, но странное. вход на страницу, сразу переход к форме

    Простое поведение.
    ввод данных, причем не вставка сразу номера или ФИО, а виден набор (иногда видно, как что-то стирают и вводят вновь)

    Сложное поведение.
    Кто-то уже сталкивался с подобным

    "Сталкивался".
    Контекстологи не понимают в чем дело

    Им это и не нужно понимать, т.к. этим должны заниматься те, кто пишет подобный софт.
    как боролись? какие вообще варианты есть?

    уверяют что нужно ставить проги антифрода, но что-то не верится, что это поможет...

    1. Антифрод поможет, если против Вас боты начального уровня, которые не сильно заморачиваются в маскировку.
    2. Подтверждение заявок через смс, клиент оставляет заявку, Вы просите подтвердить его номер через смс. Таким образом Вы убиваете сразу двух зайцев, боретесь со спамом и можете эффективнее настраивать конверсию из сделок в crm для контекстной рекламы.

    В любом случае, бороться с фродом Вы сможете лишь на своем сайте, т.е. в случае чего, повлиять, например, на скликивание рекламы Вы не сможете.
    Ответ написан
    Комментировать
  • Как организовать закрытие вкладок автоматически по определенному url?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Через какой то скрипт хотя бы подскажите направление. В tampermonkey не нашел ничего подобного.

    По соображениям безопасности, никакой js скрипт или скрипт в tampermonkey (там тоже js) не сможет закрыть вкладку, которую открыл пользователь руками.

    Если же вкладку открыл скрипт, то ее можно закрыть так:
    // открыто
    window.open('youtube.com', '_blank');
    
    // закрыто
    if ('/youtube\.com/'.test(window.location.href)) {
        window.close();
    }
    Ответ написан
  • Как передать собственный класс на метод в качестве параметра по умолчании?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Как передать собственный класс на метод в качестве параметра по умолчании?

    Можно ли такое осуществлять? Или такое не стоит сделать даже если возможно?

    Можно. Не стоит.

    Значение аргументов по умолчанию в функции вычисляется в момент объявления функции, а не в момент обращения к ней.

    Например, экземпляр класса Test, который Вы пытаетесь использовать в качестве значения по умолчанию, будет создан в момент определения метода test, что может быть не тем, что Вы ожидаете и может привести к сложно отлаживаемым ошибкам из за неочевидного разделения состояния между экземплярами.

    Также, Ваш код приведет к ошибке, так как в момент определения метода test класс Test еще не полностью определен, и Вы не можете создать его экземпляр.

    Вместо этого, можно использовать None для аргумента по умолчанию, а внутри метода проверять, был ли передан аргумент, и если нет, то создавать новый экземпляр класса:
    class Test:
        def test(self, x=None):
            if x is None:
                x = Test()
            print(type(x))
    
    x = Test()
    x.test()

    Поделитесь целью использования такой схемы?
    Ответ написан
    4 комментария