• Как заменить одну картинку на другую с помощью css?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    У картинки есть класс, но он привязан сразу к нескольким разным картинкам, а мне хотелось бы заменить только одну.

    Но сайт после перезахода меняет значения после "rev= " и получается новая ссылка и css уже не работает

    3 картинка по счету у одного родителя, у которой атрибут src начинается с https:/\/primer.ru/theme/image.php?theme=fordson&component=url:
    [src^="https:/\/primer.ru/theme/image.php?theme=fordson&component=url"]:nth-child(3) {
      content: url(http://ioioioio.png);
    }

    НО. При каждом входе сайт генерирует новую ссылку для изображения. Зачем так делать вообще?

    Загрузка изображения с сервера происходит с дополнительными параметрами, для чего ему эти параметры - спросите у разраба этого сервера.
    Ответ написан
    3 комментария
  • Почему много кликов по рекламе, но мало установок?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Нормально ли это число

    Зависит от Вашего бизнес плана.
    может ли влиять низкая оценка на принятие решения установить приложение (вероятно да)?

    Разумеется.
    Ответ написан
    Комментировать
  • Как сделать генерацию страницы на сервере?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Если Вам нужна генерация HTML на сервере, то соответственно один из вариантов:
    - Если есть знания: SSR или SSG фреймворк, если речь идет о NodeJS, то NextJS самый популярный.
    - Если знаний совсем нет: поднимать js сервер (например: express.js) и по условию - генерировать HTML (например: использовать сборщик WebPack).
    Ответ написан
    Комментировать
  • Почему не работает регулярка с максимальной длиной текста?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    return /^[А-Я][а-я]{0,17}[А-Яа-я]$/u.test(input.value);
    Ответ написан
  • Как управлять загрузкой страницы?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    <button id="myButton">Перейти в чат</button>

    const myButton = document.getElementById('myButton');
    myButton.addEventListener('click', function() {
      history.pushState(null, null, '?act=show&id=123');
    });

    Как выключить эту перегрузку?

    Давайте лучше перезагрузку, перегрузку мы всегда успеем организовать ;)
    Ответ написан
    1 комментарий
  • Как сделать звёздный рейтинг в сниппете?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Яндекс, страница товара или услуги:
    <div itemscope itemtype="http://schema.org/Product">
      <span itemprop="name">Название продукта</span>
      <span itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
        Рейтинг:
        <span itemprop="ratingValue">4.5</span> из 
        <span itemprop="bestRating">5</span>
        на основе 
        <span itemprop="ratingCount">10</span> оценок
      </span>
    </div>

    Яндекс, информационная страница:
    <article itemscope itemtype="http://schema.org/Article">
      <header>
        <h1 itemprop="headline">Заголовок статьи</h1>
        <div itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
          Рейтинг:
          <span itemprop="ratingValue">4.5</span> из 
          <span itemprop="bestRating">5</span>
          на основе 
          <span itemprop="ratingCount">10</span> оценок
        </div>
      </header>
      <div itemprop="articleBody">
        <!-- Текст статьи -->
      </div>
    </article>

    Гугл, страница товара или услуги:
    <html>
      <head>
        <title>Название страницы</title>
        <script type="application/ld+json">
        {
          "@context": "http://schema.org/",
          "@type": "Product",
          "name": "Название продукта",
          "image": "https://example.com/product-image.jpg",
          "description": "Описание продукта",
          "aggregateRating": {
            "@type": "AggregateRating",
            "ratingValue": "4.5",
            "bestRating": "5",
            "ratingCount": "10"
          },
          "offers": {
            "@type": "Offer",
            "priceCurrency": "USD",
            "price": "19.99",
            "availability": "http://schema.org/InStock"
          }
        }
        </script>
      </head>
      <body>
        <!-- Содержимое страницы -->
      </body>
    </html>

    Гугл, информационная страница:
    <html>
      <head>
        <title>Название страницы</title>
        <script type="application/ld+json">
        {
          "@context": "http://schema.org",
          "@type": "CreativeWork",
          "name": "Название статьи",
          "aggregateRating": {
            "@type": "AggregateRating",
            "ratingValue": "4.5",
            "bestRating": "5",
            "ratingCount": "10"
          }
        }
        </script>
      </head>
      <body>
        <!-- Содержимое страницы -->
      </body>
    </html>
    Ответ написан
    7 комментариев
  • Как убрать disabled?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Через флаг, allInputsFilled изначально установлен на false. В событии "input" для каждого поля ввода мы проверяем, заполнены ли все поля ввода, и, если это так, снимаем атрибут "disabled" с кнопки. Если же хотя бы одно из полей ввода пустое, кнопка остается заблокированной:
    <form>
      <input type="text" class="input" required>
      <input type="text" class="input" required>
      <input type="text" class="input" required>
      <button type="submit" class="form-btn">Отправить</button>
    </form>
    <button disabled type="button" class="btn">Просто кнопка</button>

    const massivInput = document.querySelectorAll('.input');
    const btnSubmit = document.querySelector('.form-btn');
    const btnDisable = document.querySelector('.btn');
    let allInputsFilled = false;
    
    massivInput.forEach(element => {
      element.addEventListener('input', () => {
        allInputsFilled = true;
        massivInput.forEach(input => {
          if (!input.value) {
            allInputsFilled = false;
          }
        });
        if (allInputsFilled) {
          btnDisable.disabled = false;
        }
      });
    });
    Ответ написан
  • Почему сайт медленно грузится?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    - Сервер не молниеносно отвечает (сейчас ~500мс).
    - Вынести js скрипты из шапки в подвал.
    - Сократить количество запросов на сервер (сейчас их 53).
    - Оптимизировать и перегнать изображения в webp.

    Больше инфы: https://pagespeed.web.dev/analysis/https-icunnt-co...

    В целом, не могу сказать, что сайт долго грузиться, что на компе, что на мобиле.
    Ответ написан
    5 комментариев
  • Как организуется процесс написания разметки React?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Сразу пишите в jsx

    Да.
    Как подключаете less/sass?

    Как css/sass modules.

    Структура:
    - Страница < компонент
    - Страница < компонент < компонент

    До "Страницы" желательно некий Middleware с управлением состояния и запросами на сервер.
    Ответ написан
    2 комментария
  • Как стилизовать тег в css?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Вы задаёте цвет текста тегу br, где нет текста...

    Необходимо обращаться к элементам, внутри которых находится контент, который собственно и хотите стилизовать, например так:
    <div class="text">
      123
      <br/>
      456
    </div>

    .text { color: red }
    Ответ написан
    4 комментария
  • Возможно ли используя style-dictionary создать переменную для @keyframe?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Пример styleDictionary конфигурации, которая определяет animationKeyframe переменную на основе Вашего JSON-объекта:
    {
      "source": ["tokens/**/*.json"],
      "platforms": {
        "css": {
          "transformGroup": "css",
          "buildPath": "build/",
          "files": [
            {
              "destination": "animation.css",
              "format": "css/variables",
              "filter": {
                "type": "animation",
                "property": "keyframe"
              },
              "options": {
                "outputReferences": true
              }
            }
          ]
        }
      },
      "properties": {
        "animation": {
          "keyframe": {
            "type": "animation",
            "category": "asset",
            "value": "@keyframes test { 0% { background-position: 0 } 100% { background-position: 100px } }"
          }
        }
      },
      "types": {
        "animation": {
          "type": "object",
          "properties": {
            "keyframe": {
              "type": "string",
              "transform": {
                "type": "name",
                "value": "animationKeyframe"
              }
            }
          }
        }
      }
    }

    out:
    .my-animation {
      animation-name: animationKeyframe;
      animation-duration: 2s;
      animation-timing-function: ease-in-out;
      animation-iteration-count: infinite;
    }
    Ответ написан
    Комментировать
  • Какой шаблонизатор посоветуете?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    В порядке убывания по фактору популярность:
    - Handlebars (мой выбор на 2023).
    - EJS.
    - nunjucks.
    Ответ написан
    Комментировать
  • Как изменить пути компиляции файлов?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    vite.config.js:
    export default {
      build: {
        outDir: 'dist', // имя общей выходной директории
        assetsDir: 'js' // имя директории со статикой
        //assetsDir: './' // размещение статики внутри "dist"
      }
    }

    Если через WebPack (webpack.config.js):
    module.exports = {
      entry: './src/index.js',
      output: {
        path: path.resolve(__dirname, 'dist/js'),
        //path: path.resolve(__dirname, 'dist'), // размещение статики внутри "dist"
        filename: 'bundle.js'
      }
    };
    Ответ написан
    1 комментарий
  • Помогает-ли mod_rewrite в SEO оптимизации?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    domain.com/kefevarki_darom поможет ли это с органической выдачей

    Не замечал разницу между domain.com/kefevarki_darom и domain.com/с123456789 при ранжирование.
    Ответ написан
    Комментировать
  • Как у слайдера Swiper реализовать пагинацию где числа будут обрезаться?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Моя заначка :)
    const swiper = new Swiper('.swiper-container', {
      // параметры слайдера
      pagination: {
        el: '.swiper-pagination',
        clickable: true,
        renderCustom: function (swiper, current, total) {
          let paginationHtml = "";
          const maxVisible = 3; // максимальное количество видимых элементов
          
          // добавляем первый элемент
          paginationHtml += '<span class="swiper-pagination-bullet">' + 1 + '</span>';
          
          // добавляем обрезанные числа, если их нужно показать
          if (total > maxVisible) {
            const start = current - 1;
            const end = current + 1;
            if (current < 2) {
              end += 2 - current;
            } else if (current > total - 2) {
              start -= current - (total - 3);
            }
            if (start > 1) {
              paginationHtml += '<span class="swiper-pagination-bullet">..</span>';
            }
            for (let i = start; i <= end; i++) {
              if (i > 1 && i < total) {
                paginationHtml += '<span class="swiper-pagination-bullet">' + i + '</span>';
              }
            }
            if (end < total) {
              paginationHtml += '<span class="swiper-pagination-bullet">..</span>';
            }
          } else {
            // добавляем остальные элементы
            for (let i = 2; i <= total - 1; i++) {
              paginationHtml += '<span class="swiper-pagination-bullet">' + i + '</span>';
            }
          }
          
          // добавляем последний элемент
          paginationHtml += '<span class="swiper-pagination-bullet">' + total + '</span>';
          
          return paginationHtml;
        }
      }
    });
    Ответ написан
    1 комментарий
  • Как перенести текст статьи из .txt в html?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Т.к. нет примера txt файла, и это нужно угадать, то предположу, что параграфы в txt разбиваются пустой строкой.
    Т.к. указан тег js, и нет указания, где именно задачу необходимо выполнить (на бэке или фронте), то напишу решение для фронта:
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>Пример чтения и вывода текстового файла в HTML</title>
      </head>
      <body>
        <div id="content"></div>
    
        <script>
          fetch('example.txt')
            .then(response => response.text())
            .then(text => {
              const paragraphs = text.split('\n\n');
              const contentElement = document.getElementById('content');
    
              paragraphs.forEach(paragraph => {
                const p = document.createElement('p');
                p.textContent = paragraph;
                contentElement.appendChild(p);
              });
            });
        </script>
      </body>
    </html>
    Ответ написан
    2 комментария
  • Какие медиа-запросы в CSS использовать для адаптации под планшеты?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Мой набор:
    breakpoints: {
      xs: '412px',
      sm: '576px',
      md: '768px',
      lg: '960px',
      xl: '1366px',
      '2xl': '1920px',
    },
    Ответ написан
    Комментировать
  • Как передвинуть цену товара под краткое описание товара (WooCommerce), тема My Theme Child?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    Изменил лишь порядок, и выравнивание цены. Отступы не убирал, т.к. не известно, может так задумано...
    Вложенность селекторов умышленно длинная, чтобы перебить специфичностью остальных селекторов, не используя important.

    .woocommerce.single-product .product .summary.entry-summary {
        display: grid;
    }
    
    .woocommerce.single-product .product .woocommerce-product-details__short-description {
        order: 1;
    }
    
    .woocommerce.single-product .product .summary.entry-summary .price {
        order: 2;
        float: none;
    }
    
    .woocommerce.single-product .product form.cart {
        order: 3;
    }
    
    .woocommerce.single-product .product .product_meta {
        order: 4;
    }

    Изменение css wp, через дочернюю тему:
    1. Войдите в админ-панель WordPress и перейдите в раздел "Внешний вид" -> "Редактор тем".
    2. Выберите дочернюю тему My Theme Child и откройте файл style.css.
    3. Внесите нужные изменения в файле style.css и сохраните изменения.
    Ответ написан
    3 комментария
  • Возможно ли взаимодействие самописного сайта с CMS?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Вижу тег wp, а значит:
    https://developer.wordpress.org/rest-api/
    https://github.com/wp-graphql/wp-graphql
    WP как админка, а front как сайт. Дешево, с душком, но простые задачи решает.

    Здравствуйте, изучаю веб-разработку не так давно, но уже слышал про CMS

    Предположу, что с такими знаниями будет тяжело тянуть отдельно wp и отдельно front.

    И насколько вообще важная штука CMS, и как частно нужно будет с ней работать?

    Зависит от требований заказчика, от 0 до 146%.
    Ответ написан
    Комментировать
  • Почему при запросе на сервер сбрасываются сессии?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    app.use(
      session({
        secret: SESSION_SECRET,
        resave: false,
        saveUninitialized: true,
        cookie: {
          secure: false,
          maxAge: 360000,
          sameSite: 'strict',
          domain: 'localhost', // добавил домен
        },
      }),
    );
    Ответ написан
    Комментировать