Задать вопрос
  • Какой тип Redis выбрать для высоконагруженного сайта WP?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    Все очень субъективно, но некоторые особенности для каждого из решений можно выделить:
    • PhpRedis - это расширение, которое необходимо ставить вручную на Ваш сервер. Это может потребовать дополнительных технических знаний и доступа к серверу, но зато оно обеспечивает более высокую производительность.
    • Predis - простая установка через Composer, он не так быстр, как PhpRedis, но его легче добавить в проект.
    • Relay не рассматриваю, т.к. слишком новый (May 26, 2021).

    Если вам нужна максимальная производительность и Вы уверены в своих способностях по настройке сервера - выбирайте PhpRedis. Если же Вы цените простоту установки и удобство использования, Predis будет отличным выбором. Мой выбор для PHP сайтов - PhpRedis.
    Ответ написан
    1 комментарий
  • Инфоблоки как у битрикс, но в wordpress?

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

    Информационные блоки - модуль, позволяющий каталогизировать и управлять различными типами (блоками) однородной информации. С помощью информационных блоков может быть реализована публикация различных типов динамической информации: каталоги товаров, блоки новостей, справочники и т.д.

    Вам нужны кастомные типы постов - Custom Post Types.

    Пример создания костюмного типа поста, register_post_type():
    function true_register_post_type_init() {
     
    	$labels = array(
    		'name' => 'Лиды',
    		'singular_name' => 'Лид',
    		'add_new' => 'Добавить лид',
    		'add_new_item' => 'Добавить лид',
    		'edit_item' => 'Редактировать лид',
    		'new_item' => 'Новый лид',
    		'all_items' => 'Все лиды',
    		'search_items' => 'Искать лиды',
    		'not_found' =>  'Лидов по заданным критериям не найдено.',
    		'not_found_in_trash' => 'В корзине нет лидов.',
    		'menu_name' => 'Лиды'
    	);
     
    	$args = array(
    		'labels' => $labels,
    		'public' => true,
    		'publicly_queryable' => false,
    		'has_archive' => false,
    		'menu_icon' => 'dashicons-email-alt2',
    		'menu_position' => 2,
    		'supports' => array( 'title', 'editor' )
    	);
     
    	register_post_type( 'lead', $args );
    }
    
    add_action( 'init', 'true_register_post_type_init' );
    Ответ написан
    Комментировать
  • Как интегрировать vue 3 с этапом сборке на проекте с bitrix?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Как интегрировать vue 3 с этапом сборке на проекте с bitrix?

    Вариантов не много:
    1. Использовать тот подход, который используете сейчас.
    2. Писать отдельно фронт, а данные получать по api от битрикса.
    Ответ написан
  • Проблемы с циклом?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    // for (let i = 0; i = expenses_without_first.length; i += 8) {
    for (let i = 0; i < expenses_without_first.length; i += 8) {

    work_id_array[i / 8]

    Интересная конструкция, а если поделить 8/8, то что получится?
    Ответ написан
    9 комментариев
  • Нужно ли обычную форму обратной связи лендинга защищать от спам-ботов?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Нужно ли обычную форму обратной связи лендинга защищать от спам-ботов?

    Нужно.
    Если да, что можете посоветовать?

    От самопала, вроде скрытых полей, которые человек не увидит, зато увидит глупый спам-бот, до нормальных решений вроде reCAPTCHA или Yandex SmartCaptcha.

    Я использую именно reCAPTCHA (но не показываю ее, чтобы народ не злить), затем проверяю, если риски спама велики - шлю письма с высокими рисками на email с дополнительной пометкой (спам), письма автоматом сортируются в почтовом ящике по наличию спам метки, где приоритетные обрабатываются приоритетно (внезапно), а все остальные - если успеем.
    Ответ написан
    3 комментария
  • Как называется событие, когда добавляешь запись в WP?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    wp_after_insert_post?
    Fires actions after a post, its terms and meta data has been saved.
    Ответ написан
    Комментировать
  • Как получить тег из закомментированного блока?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    суть вопроса это вообще реально сделать силами BS?

    Реально, если DOM не динамический. Попробуйте, как то так:
    from bs4 import BeautifulSoup, Comment
    
    html = '''
    <div class="detail-product-buy__declaration-data delivery">
    <!--p><a href="#callback-modal-delivery" data-toggle="modal">Самовывоз</a><span> "ВОТ ЭТО ДОСТАТЬ" </span></p-->
    </div>
    '''
    
    bs = BeautifulSoup(html, 'html.parser')
    div = bs.find('div', class_='detail-product-buy__declaration-data delivery')
    
    c = div.find(string=lambda text: isinstance(text, Comment))
    
    if c:
        cs = BeautifulSoup(c, 'html.parser')
        ex = cs.get_text()
        print(ex)
    else:
        print("Не найдено нихрена")
    Ответ написан
    1 комментарий
  • Как правильно наполнять интернет магазин?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    И как искать то что нужно, если артикулов нет и иногда даже соответствие артикулов не гарантирует что это идентичные товары.

    Никак. "Серебряной пули" нет, придется балансировать между "парсит робот" и "исправляет человек". Подсчитайте, что дешевле, затем, выберите наилучший из вариантов.
    Ответ написан
    Комментировать
  • Как через JS проверить что пользователь пользуется встроенным браузером?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Есть ли какой-то media query для этого?

    Нет.
    Или всякими browser detector-ами пользоваться надо?

    Только косвенно, по User-Agent или отсутствию некоторых функций, например serviceWorker.

    Пример проверки "встроенных браузеров", используя User-Agent:
    function isEmbedded(userAgent) {
      const userAgents = ['FBAV', 'Instagram', 'Snapchat', 'Twitter'];
      return userAgents.some(id => userAgent.includes(id));
    }
    
    console.log(isEmbedded(window.navigator.userAgent)); // true

    Пример проверки "встроенных браузеров", используя отсутствие функции serviceWorker:
    if (!('serviceWorker' in navigator)) console.log('Embedded?');

    Библиотека Bowser позволяет проще получать данные о браузере.
    Ответ написан
    Комментировать
  • Как отправить решение капчи?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Подставить код-решение в поле, которое ранее необходимо было сделать display=block, а затем нажать на кнопку войти, ну или любое другое действие, которое отслеживает рекапча.
    КартинкО
    659abb0ea29eb164258346.png
    Ответ написан
  • Как найти элемент по index в selenium?

    Mike_Ro
    @Mike_Ro Куратор тега Selenium
    Python, JS, WordPress, SEO, Bots, Adversting
    Документация:
    fruit = driver.find_element(By.CSS_SELECTOR, '[index="76"]')

    Если элемент динамический, то необходимо его вначале дождаться, используя Waiting Strategies.
    Ответ написан
    Комментировать
  • Как проскролить страницу вверх при помощи puppeteer?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Можно крутануть саму страницу:
    await page.evaluate(() => {window.scroll(0,0)});

    Либо крутить колёсиком мыши:
    await page.goto(
      'https://mdn.mozillademos.org/en-US/docs/Web/API/Element/wheel_event$samples/Scaling_an_element_via_the_wheel?revision=1587366'
    );
    
    const elem = await page.$('div');
    const boundingBox = await elem.boundingBox();
    await page.mouse.move(
      boundingBox.x + boundingBox.width / 2,
      boundingBox.y + boundingBox.height / 2
    );
    
    await page.mouse.wheel({deltaY: -100});
    Ответ написан
    4 комментария
  • Может ли крупная компания добиться уголовной ответственности для спамеров, если они фактически сделали невозможной работу сайта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    И вот вопрос, а сможет ли крупная компания вроде Сбера, Яндекса, ВК добиться применения этих статей к подобным спамерам, если захочет?

    Вы не правильно поставили вопрос, перефразирую - сможет ли субъект со связями и соответствующим влиянием сделать X? - сможет!

    Абсолютно согласен с Drno , особенно про паяльник и дядей, которые будут вполне конкретными персонажами, с соответствующими сертификатами.
    Ответ написан
    6 комментариев
  • Что выбрать WP или Python+Django для сайта?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Короткий ответ (с учетом указанного ТЗ) - WP.

    Длинный ответ:
    публиковать страницы, создавать иерархию страниц, чпу url, какой то слайдер с картинками

    Учитывая типовое ТЗ, ответ - WP (все это уже реализовано, преимущественно бесплатно и в большом количестве).
    небольшое количество услуги в регионе

    Вы на старте выхода в интернет, предположу, что количество оказываемых услуг оффлайн - будет примерно равнозначно количеству оказываемых услуг онлайн, а значит производительность инструмента не первостепенна, ответ - WP.
    Нашли компанию, предлагает разработку сайта на WP или на Python+Django (дороже и дольше)

    Начнем с того, что это не равнозначные инструмент, ибо WP - это готовый движок/CMS для сайта + сам сайт (готовые шаблоны), развернул на хостинге и готово. А вот Django - это фреймворк, т.е. некий набор инструментов, да он позволяет сделать из него что угодно (ах*енно сделать (на правах отвечающего)), но потом. Соответственно, если вопроса в функционале и производительности не стоит (и предположу - сделать быстро) - выбираем WP, будет дешевле и быстрее.

    Что обычно я использую (от начального проекта к финальному):
    1. WP в стоке + сборка фронта (webpack) с оптимизацией + кэширование.
    2. Докупка железа и горизонтальное масштабирование п1 балансировщиком.
    3. Профилирование и переписывание определенных запросов под конкретные задачи в самом WP, обычно добавляет производительности в 2-3 раза (от wp там мало что остается, но ценник и сроки еще не такие, как в п4).
    4. Python + Django + кэширование (если нужно быстрее любого WP и более специфический функционал).
    5. П4 + FastAPI (если прям совсем прижало по производительности).
    Ответ написан
    6 комментариев
  • Как посчитать разницу между двумя датами в секундах, минутах, часах и т.д.?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Почему так происходит, и как такое можно решить?

    Потому что объект Date возвращает дату, а не интервал времени. Попробуйте так:
    function getTimeDiff(startDate, endDate) {
      const diff = endDate - startDate;
    
      const seconds = Math.floor(diff / 1000);
      const minutes = Math.floor(seconds / 60);
      const hours = Math.floor(minutes / 60);
      const days = Math.floor(hours / 24);
      const months = Math.floor(days / 30); // ~30
      const years = Math.floor(days / 365); // ~365
    
      return {
        years,
        months: months % 12,
        days: days % 30,
        hours: hours % 24,
        minutes: minutes % 60,
        seconds: seconds % 60
      };
    }
    
    const today = new Date();
    const targetDate = new Date("2023-12-29 00:00:00");
    const diff = getTimeDiff(targetDate, today);
    
    console.log(`Разница, лет: ${diff.years}, месяцев: ${diff.months}, дней: ${diff.days}, часов: ${diff.hours}, минут: ${diff.minutes}, секунд: ${diff.seconds}`);
    
    // Разница, лет: 0, месяцев: 0, дней: 0, часов: 9, минут: 51, секунд: 22
    Ответ написан
    Комментировать
  • Как в wordpress сделать чтобы url категории заканчивался слешем?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    WordPress functions.php (для категорий, нужно очистить кэш wp (если используется)):
    // add a slash at the end of the url for categories
    function add_url_slash_from_categories() {
        global $wp_rewrite;
        $wp_rewrite->category_base = 'category/';
        $wp_rewrite->tag_base = 'tag/';
        $wp_rewrite->flush_rules();
    }
    
    add_action('init', 'add_url_slash_from_categories');

    WordPress functions.php (для всех, нужно очистить кэш wp (если используется)):
    // add a slash at the end of the url of all urls, excluding files
    function add_url_slash($url) {
        if (!preg_match('/\.[a-zA-Z0-9]+$/', $url)) {
            $url = trailingslashit($url);
        }
        return $url;
    }
    
    add_filter('add_url_slash', 'add_slash_to_all_urls');

    .htaccess (для всех, 301 редирект):
    # set 301 redirects for all urls without a slash at the end to a slash
    RewriteEngine On
    RewriteBase /
    RewriteRule ^category/(.*)$ /category/$1/ [R=301,L]
    RewriteRule ^tag/(.*)$ /tag/$1/ [R=301,L]
    Ответ написан
    1 комментарий
  • Как подключить script src= прямо в файле JS?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    const loadedModule = require('./modulePath/index.js');
    
    loadedModule.counter()
    console.log(loadedModule.awesomeValue);

    Хорошее руководство
    Ответ написан
    1 комментарий
  • Как при парсинге на node js смотреть цвет шрифта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    1. Перейти на страницу.
    2. Получить все элементы по селектору.
    3. В цикле обойти каждый элемент, выполняя код на странице, который получит и вернет цвет элемента, затем проверить на белый.
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('//some.com')
    
    const symbol = "₽";
    const xpathExpression = `(//span[contains(text(), '${symbol}')])`;
    const els = await page.$x(xpathExpression);
    
    for (const el of els) {
      const c = await page.evaluate(_el => {
        const s = window.getComputedStyle(_el);
        return s.color;
      }, el);
    
      if (c === 'rgb(255, 255, 255)') console.log('White is detected!')
    }
    
    await browser.close();
    Ответ написан
    Комментировать
  • Снять сайт с теневого бана Google?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    После получения ссылки на пациента, все более менее прояснилось. Ниже список того, что лично меня напрягло, когда я увидел сайт (от наиболее приоритетного к наименьшему):
    - При переходе с главной по элементу каталога, я получаю url //openworkshop.su/?page=1&page_size=30&name=&game=108600&game_select=false&dependencies=false&sort=iMOD_DOWNLOADS, это же уже как бы внутренняя страница, но по url - это главная.
    - Очень похожие title и description на разных страницах.
    - Минимум текста на страницах.
    - Отсутствуют атрибуты rel="canonical".
    - Отсутствуют H1-3 заголовки.
    - Ранее был проиндексирован дубль по //5.44.41.136/, хоть и щас его нет здесь нет, но я бы все равно отдавал 403 код.
    - Слишком много "красного" и "желтого" при диагностике.
    КартинкО
    658d19b88c8e5000123808.png
    Ответ написан
    1 комментарий