• Кто и как подключает скрипты и стили на своем wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    is_home() — проверяет показывается ли страница с последними постами

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

    В качестве версии файла, четвертым параметром удобно передавать время последнего его изменения с помощью filemtime(). Это нужно, чтобы браузер не кешировал измененные файлы и всегда показывал только актуальную версию

    Т.к. я часто меняю что-то программно, то и id у меня могут измениться, а вот за слагами я слежу для SEO, поэтому во всех проверках типа is_page() проверяю слаги постов. Но это уже вкусовщина

    function custom_scripts_init() {
    
    	// общие стили
    	wp_enqueue_style( 'common-styles', get_theme_file_uri( 'assets/css/common.min.css' ) , array(), filemtime( get_theme_file_path( '/assets/css/common.min.css' ) ) );
    
    	// общие скрипты 
    	wp_enqueue_script( 'common-scripts', get_theme_file_uri( 'assets/js/common.min.js' ), array( 'jquery' ), filemtime( get_theme_file_path( '/assets/js/common.min.js' ) ), true );
    
    	// скрипты для страницы постов
    	if ( is_home() ) {
    		wp_enqueue_script( 'home-scripts', get_theme_file_uri( 'assets/js/home.min.js' ), array( 'jquery' ), filemtime( get_theme_file_path( '/assets/js/home.min.js' ) ), true );
    	}
    
    	// скрипты для массива страниц
    	if ( is_page( ['sample-page', 'contacts'] ) ) {
    		wp_enqueue_script( 'page-scripts', get_theme_file_uri( 'assets/js/page.min.js' ), array( 'jquery' ), filemtime( get_theme_file_path( '/assets/js/page.min.js' ) ), true );
    	}
    
    }
    add_action( 'wp_enqueue_scripts', 'custom_scripts_init' );
    Ответ написан
    3 комментария
  • Где и как применять классы?

    RAFAILgaley
    @RAFAILgaley
    классы не нужны
    они нужны маньякам и фанатикам, которые не могут жить без классов

    нет смысла всё так усложнять
    KISS
    js задуман как простой язык

    также некоторые не могут без статичной типизации и пишут на тайпскрипте
    они тупо не понимают прелесть динамической типизации

    Алан Кей сказал:


    ООП для меня это сообщения, локальное удержание и защита, скрытие состояния и позднее связывание всего.

    Я не против типов, но мне не знакома ни одна система типов, которая не вызывала бы боли. Так что мне все еще нравится динамическая типизация.

    Если вы используете языки с ранним связыванием, как это делает большинство, то вы запираете себя в рамки того, что уже написали. Переформулировать с легкостью уже не получится.

    Позднее связывание позволяет с меньшими усилиями встраивать в проект идеи, которые возникли позже в процессе разработки (по сравнению с системами с более ранним связыванием вроде C, C++, Java, и пр.)

    Ответ написан
    4 комментария
  • Как достать данные из массива?

    @Dark_Dante
    Например так
    $userIds = array_map(
        fn (array $array): int => $array['user_id'],
        $yourArray,
    );
    Ответ написан
    Комментировать
  • Как правильно отправлять почту через PHP?

    @Flying
    Очень странно, что письма, высланные через Mailgun имеют плохую доставляемость. Подобные сервисы как раз, в частности, и используют из-за того, что они нормально реализуют все стандартные средства идентификации отправителей, а также обладают хорошей репутацией с точки зрения spam list'ов и прочих сервисов мониторинга.

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

    Также не очень понятно само описание проблемы. "Из-за отсутствия шифрования" чего? Возможно вы просто что-то неправильно используете или не настроили?

    Возвращаясь к вопросу о библиотеках - я бы склонялся в сторону Symfony Mailer. Это "наследник" SWIFTMailer, который в свою очередь, думаю, был самым популярным решением для этой задачи на PHP, всё-таки больше 270 миллионов скачиваний, у PHPMailer в 10 раз меньше.

    Понятно, что Symfony Mailer хорошо интегрирован в сам Symfony, но он легко (хотя и менее удобно) используется и отдельно. Из несомненных плюсов данного подхода - возможность подключения различных транспортов (в том числе и того же Mailgun), что позволяет использовать разные методы отсылки писем без необходимости менять код. Также Symfony Mailer интегрируется с Symfony Messenger, который в свою очередь предоставляет mailer'у возможность асинхронной рассылки писем с retry стратегиями, отслеживанием ошибок отсылки и т.п.
    Ответ написан
    Комментировать
  • Как правильно отправлять почту через PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    И снова в который раз я поражаюсь той вакханалии безнаказанности, с которой роскомнадзор блокирует интернет для отдельных граждан страны.
    Казалось бы - взял теги и заголовок вопроса, PHP ЭЛЕКТРОННАЯ ПОЧТА ПОЧТОВЫЙ СЕРВЕР Как правильно отправлять почту через PHP?
    и скопипастил в адресную строку своего браузера - что может быть проще?
    Но коварное полицейское государство не дремлет, и вместо результатов поиска показывает только товарища майора, грозно покачивающего пальцем.
    Ответ написан
    1 комментарий
  • Как отменить зависимость блоков grid?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Можно ли как-то отменить эту зависимость?

    Можно, с помощью свойств align-items или align-self
    Ответ написан
    Комментировать
  • Как исправить ошибку Cannot set properties of null (setting 'className')?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для начала:
    var textel = document.getElementById(id)
    if (!textel) return console.error("HTML id not found:", id);

    А дальше методом исключения пробуй и щупай в консоли.
    Ответ написан
    Комментировать
  • Как изменить цвет картинки через CSS?

    Ugolnikovvv
    @Ugolnikovvv
    Junior Frontend-разработчик
    img {
      filter: invert(1);
    }
    Ответ написан
    Комментировать
  • Какие из бекенд фреймворков наиболее "самодостаточные"?

    @Kirill-Gorelov
    С ума с IT
    symfony....
    Ответ написан
    Комментировать
  • Какие из бекенд фреймворков наиболее "самодостаточные"?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Django, Spring
    Ответ написан
    Комментировать
  • Как сделать проверку на номер через смс?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Например, слать ему смс с кодом подтверждения.
    Ответ написан
    2 комментария
  • Как найти в тексте и заменить значение по маске?

    0xD34F
    @0xD34F
    preg_replace_callback('#\[~(.*?)~\]#', fn($m) => $arr['person'][$m[1]], $str)
    Ответ написан
    Комментировать
  • Как согнуть текст по картинке css?

    Комментировать
  • Как правильно подключить svg спрайт?

    delphinpro
    @delphinpro Куратор тега HTML
    frontend developer
    НО вот тут у меня сомнения, что каждый раз используя use xlink у меня будут идти запросы к этому файлу.

    Запрос будет один, потом файл попадет в кэш браузера.
    Ответ написан
    1 комментарий
  • Как создать страничку новостей на WordPress?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    Я относительно недавно начал заниматься версткой и взял заказ на создание сайта.


    А Зачем? Если вы самую тривиальную задачу не можете.

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

    Однажды шагнув в асинхронщину, из нее не вылезешь.
    В синхронном коде результат Промиса обрабатывается в then
    https://habr.com/ru/company/vk/blog/269465/

    mainFunc(rightElem).then(result => {
      console.log("mainFunc", result)
    });
    Ответ написан
    Комментировать
  • Чем отличаются разные способы подключения шрифтов?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Способ подключения шрифта есть только один – директива @font-face в css.

    подключала шрифты через линку в html-файле

    Таким образом вы подключали css файл, в котором были директивы font-face.

    через import в SCSS

    Полагаю, подключали scss файл, в котором были директивы font-face.

    В общем, технически способ только один. А как вы раскидываете свои файлы - без разницы.
    Ответ написан
    Комментировать
  • Как добавить общую обёртку дочерним узлам?

    0xD34F
    @0xD34F Куратор тега JavaScript
    оборачивается не полностью

    Почему так: childNodes представляет собой динамическую коллекцию, т.е., при добавлении или удалении узлов она обновляется без каких-либо действий с вашей стороны. Поэтому, когда вы добавляете в wrapper нулевой узел, он тут же пропадает из item.childNodes, а у оставшихся узлов позиция уменьшается на единицу - тот, что был первым, становится нулевым, второй первым и так далее. Так что когда for...of переходит к следующему узлу, им оказывается не тот, что изначально имел индекс 1, а расположенный за ним. Бывший первый, а теперь нулевой, оказывается пропущен. Аналогичным образом будут пропущены и все последующие узлы, изначально имевшие нечётные индексы.

    Что тут можно сделать:

    Вариант раз - вместо перебора узлов всегда работать с тем, что имеет нулевой индекс:

    while (item.childNodes.length) {
      wrapper.appendChild(item.childNodes[0]);
    }

    Два - перебирать childNodes от конца к началу:

    for (let i = item.childNodes.length; i--;) {
      wrapper.prepend(item.childNodes[i]);
    }

    Три - перебирать не childNodes, а массив:

    for (const n of [...item.childNodes]) {
      wrapper.append(n);
    }

    А вообще, нет необходимости работать с каждым узлом индивидуально, метод append может принимать несколько параметров, так что переносим сразу всё:

    document.querySelectorAll('.www').forEach(n => {
      const wrapper = document.createElement('div');
      wrapper.classList.add('red');
      wrapper.append(...n.childNodes);
      n.append(wrapper);
    });

    Или, можно и вовсе узлы не трогать, если перезаписывать разметку:

    for (const n of document.getElementsByClassName('www')) {
      n.innerHTML = `<div class="red">${n.innerHTML}</div>`;
    }
    Ответ написан
    Комментировать