Задать вопрос
  • Ошибка 1055 в MySQL означает что выбираемые значения должны быть и в GROUP BY и в SELECT одновременно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Любое поле/выражение выходного набора должно быть либо аргументом агрегатной функции, либо составной частью выражения группировки.

    В данном случае Вы выбираете p.name, которого нет в ->groupBy('p.user') и которое не есть аргумент агрегатки. Добавьте его в выражение группировки, ->groupBy('p.user, p.name') (а если оно уникально в пределах одного p.user, то хватит и ->groupBy('p.name')).
    Ответ написан
    Комментировать
  • Как удалять товар вместе с изображениями?

    Kozack
    @Kozack Куратор тега WordPress
    Thinking about a11y
    Ну, примерно так: вешаем на событие удаления поста — поиск всех прикреплённых изображений и поочерёдно их удаляем
    <?php
    add_action('before_delete_post', 'wps_remove_attachment_with_post', 10);
    function wps_remove_attachment_with_post($post_id)
    {
        // We check if the global post type isn't ours and just return
        global $post_type;
        if ($post_type != 'my_product_post_type')
            return;
        
        $media = get_attached_media('image', $post_id);
        foreach ($media as $image) {
            wp_delete_attachment($image->ID, true);
        }
        
    }
    ?>
    Ответ написан
    1 комментарий
  • Laravel.Комманда php artisan migrate выдает ошибку?

    @matt5346
    Привет, еще такой вариант возможен, для этого необходимо:
    1. Прописать php --ini, найти этот файл и открыть в редакторе,
    2. Разкомментить ;extension=pdo_mysql, для этого надо просто убрать ";" - точку с запятой,
    3. И затем пробовать php artisan migrate.
    Ответ написан
    3 комментария
  • Как правильно составить сложный запрос в Laravel?

    @ka4an90
    https://laravel.su/docs/8.x/queries#joins

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

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Пользователь должен прописать Ваш DNS (IP1, IP2) а дальше Вы вносите у себя все записи. Нет смысла пользователю заморачиваться еще с DNS и CNAME. Представляю как он будет "любить" подобные привязки после этого!)
    1. Проверяете принадлежность домена этому пользователю.
    2. Создаёте на DNS сервере A-запись (по-примеру!) A login.com xxx.xxx.xxx.xxx
    где xxx.xxx.xxx.xxx - IP вашего Web-сервера.
    3. Делаете роутинг на запросы к login.com к нужному серверу (например, через vhosts.conf):
    <VirtualHost XXX.XXX.XXX.XXX>
    ServerName yoursitename.com
    ServerAlias login.com
    ServerAlias login2.com
    ServerAlias blablabla.com
    DocumentRoot /home/www/yoursitename.com/htdocs/
    </VirtualHost>

    4. Дальше делаете обработку на основе запрошенного домена через mod_proxy/mod_rewrite и т.д.
    Ответ написан
    Комментировать
  • Laravel-mix, возможно ли использовать 2-е переменных mix в одном файле webpack.mix.js?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Сделайте два отдельных конфига и две команды билда в package.json
    webpack.mix.site.js
    webpack.mix.dashboard.js

    Собирайте их в разные папки, иначе манифесты перезатрутся
    mix.setResourceRoot('/static/frontend');
    mix.setResourceRoot('/static/dashboard');
    и подключайте с уточнением директории
    <link href="{{ mix('css/main.css', 'static/frontend') }}" rel="stylesheet">


    --------

    Можно еще попробовать два раза импортировать mix, но я не знаю, как поведет себя сборка

    const mix = require('laravel-mix');
    const mix2 = require('laravel-mix');
    
    mix.js('resources/js/app.js', 'public/js').vue()
    mix2.options({
        vue: {       customElement: true     }
    })
    mix2.js('resources/js/app2.js', 'public/js').vue()


    Скорее всего будет создано два манифеста, и второй перепишет первый.
    Ответ написан
  • Функция strlen() неправильно считает русские символы. Как исправить?

    @STZ
    mb_strlen
    mb_strtolower
    и т.д. привет юникод
    Ответ написан
    Комментировать
  • JavaScript: как не сбрасывать фокус при клике по элементу?

    @link_irk
    Попробуйте обрабатывать нажатие на кнопку по событию onmousedown, а не по клику. onmousedown наступает раньше и вы успеете нормально обработать событие, до потери фокуса. А чтоб выделение вообще не сбросилось напишите в конце обработчика return false;
    Ответ написан
    2 комментария
  • Как подключить нестандартные шрифты, чтобы они отрисовывались в canvas?

    @qo_0p Автор вопроса
    Собственно вопрос и есть решение, поэтому отмечу этот пост как решение)
    Ответ написан
    1 комментарий
  • Что значит оборачивание функции в скобки (function() { ... })?

    copist
    @copist
    Empower people to give
    Короткий ответ
    (function() { ... })()
    Это определение анонимной функции без параметров и непосредственный вызов её, так же, без параметров

    Длинный ответ
    Зачем оборачивать значение в круглые скобки?

    Оборачивание функции в скобки, так же как и оборачивание константы в скобки - это просто способ показать интерпретатору, что это значение внутри скобок может быть использовано как возвращаемое значение.
    var var_a = 5
    (var_a) /* или */ (5) // не является ошибкой, возвращает значение переменной или выражения
    function func_b() { }
    (func_b) /* или */ (function func_b() { }) // не является ошибкой, возвращает ссылку на функцию
    var var_c = { key: "val" }
    (var_c) /* или */ ({ key: "val" }) // не является ошибкой, возвращает объект
    var var_d = [ "one", "two" ]
    (var_d) /* или */ ([ "one", "two" ]) // не является ошибкой, возвращает массив


    Ну а раз (func_b) - это ссылка на функцию func_b, то значит её можно сразу же вызвать.
    A если (var_c) - это объект, то значит можно сразу же использовать его
    Аналогично (var_d) - это массив, то значит можно сразу же использовать его

    (func_b)() или (function func_b() { })() вызвать функцию
    (var_c).key или ({ "key": "val" }).key использовать объект
    (var_d)[0] или ([ "one", "two" ])[0] использовать массив

    Синтаксической ошибкой было бы использование функции, массива, объекта без скобок ( )
    function func_b() { }() ошибка "Unexpected token )"

    Хотя нет ошибки, по крайней мере в Google Chrome
    { key: "val" }["key"]
    ["one", "two"][0]

    Для чего вообще придумали самовызывающиеся функции?
    Для того, чтобы изолировать переменные и функции, чтобы они не попадали в глобальную область видимости.

    Сравни
    var a = "test"
    alert(a)

    по завершении этого блока переменная a болтается в глобальной области видимости

    и
    (function(){
        var a = "test"
    })()
    
    alert(a) // недоступно, потому что она была локальной переменной внутри анонимной функции


    Почему скобки ( ) пустые?
    В данном случае у функции function() { ... }нет формальных параметров, значит и вызывать можно без параметров.

    Но вообще в самовызывающуюся функцию можно передавать параметры. Это общая практика передачи ссылок на глобальные объекты:

    (function (w, d, $) {
       // некоторым нравится сокращать код путём использования коротких имён переменных
       w['fizz'] = "buzz" // вот так можно принудительно зарегистрировать
                           // глобальную переменную fizz
       $('body').css({background: 'red'}) // вот так можно работать с jQuery через привычную $
                           // даже если библиотека была загружена в режиме noСonflict
    }(window, document, jQuery))


    Некоторым не нравится длинный вариант проверки на undefined и они специально предусматривают лишний параметр, который не инициализируют

    (function (message1, message2, empty) {
        // это и есть проверка на undefined
        if (message1 === empty)
            alert('message1 is undefined')
        else
            alert('message1 = ' + message1)
    
        if (message2 === empty)
            alert('message2 is undefined')
        else
            alert('message2 = ' + message2)
    })("test") // вызвана только с одним параметром, значит второй по имени message2
    //  будет пустой, а третий empty специально ввели в качестве образца
    //  данных с типом "undefined", для служебного использования

    Зачем функция анонимная?
    Аналогично - чтобы не регистрировать её имя в глобальной области видимости, если она нужна один раз.
    Ответ написан
    7 комментариев
  • Расскажите подробно про php://input, как пользоваться?

    php://input возвращает все необработанные данные после HTTP-заголовков запроса, независимо от типа контента.

    Данные, могут быть:
    • application/x-www-form-urlencoded ( application/x-www-form-urlencoded тип application/x-www-form-urlencoded для простых форм- application/x-www-form-urlencoded ) или
    • multipart/form-data-encoded (в основном multipart/form-data-encoded для загрузки файлов)

    Это связано с тем, что это единственные типы контента, которые должны поддерживаться браузерами. Поэтому сервер и PHP традиционно не ожидают получения какого-либо другого типа контента (что не означает, что они не могли бы).

    Если вы просто отправляете POST-ом обычную HTML-форму, запрос выглядит примерно так:
    POST /page.php HTTP/1.1
    key1=value1&key2=value2&key3=value3

    Но если вы много работаете с Ajax, может понадобиться обмен более сложными данными с типами (строка, int, bool) и структурами (массивы, объекты), поэтому в большинстве случаев JSON является лучшим выбором. Но запрос с JSON-полезной нагрузкой выглядел бы примерно так:
    POST /page.php HTTP/1.1
    {"key1":"value1","key2":"value2","key3":"value3"}

    Теперь содержимое будет application/json (или, по крайней мере, ни один из вышеперечисленных), так что $_POST -wrapper из PHP не знает, как с этим справиться (пока).

    Данные всё еще там, вы просто не можете получить к нему доступ через $_POST. Поэтому вам нужно получить его с "сыром" виде помощью file_get_contents('php://input') (если он не закодирован в формате multipart/form-data).

    Это также способ доступа к XML-данным или любому другому нестандартному типу контента.
    Ответ написан
    Комментировать
  • Как узнать с помощью Chrome Dev Tools какой Event в JS меняет свойства элемента?

    Alexious_sh
    @Alexious_sh
    Если меняется непоследственно аттрибут style, или заменяется класс, то можно повесить breakpoint на изменение атрибутов. Просто нажать ПКМ на нужном элементе в дереве, и выбрать Break On/Attributes Modifications. Выполнение скрипта будет останавливаться при любой попытке изменить аттрибуты элемента, и в правой колонке будет виден стек вызовов.
    Ответ написан
    Комментировать
  • Как навесить обработчик на коллекцию элементов?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Проблема в том, что вы пытаетесь навесить обработчик на коллекцию элементов, которая возвращается функцией querySelectorAll. Такой возможности нет, нужно обходить эту коллекцию и навешивать обработчик на каждый элемент отдельно:
    var buttonItems = document.querySelectorAll('.button-item'),
        index, button;
    
    for (index = 0; index < buttonItems.length; index++) {
        button = buttonItems[index];
        button.addEventListener('click', function (event) {
            console.log('click');
            event.preventDefault();
        });
    }

    Пример

    Обратите внимание, что такой способ установки обработчика в цикле не очень хорош - при каждой итерации создается новая функция-обработчик, что засоряет память и этот обработчик невозможно потом удалить, поскольку создаваемая функция безымянна и ссылка на нее нигде не сохраняется.
    Ну в принципе такой код не очень опрятный.

    Лучше делать так:
    var buttons = document.querySelectorAll('.button-item'),
        index, button;
    
    for (index = 0; index < buttons.length; index++) {
        button = buttons[index];
        button.addEventListener('click', clickHandler);
        button.addEventListener('dblclick', doubleClickHandler);
    }
    
    function clickHandler(event) {
        console.log('click', this.innerText);
        event.preventDefault();
    }
    
    function doubleClickHandler(event) {
        console.log('doubleclick', this.innerText);
        this.removeEventListener('click', clickHandler);    
        this.removeEventListener('dblclick', doubleClickHandler);
    }
    Ответ написан
  • Как извлечь число из строки?

    var el = 'rate-55345'
    var numEl = parseInt(el.match(/\d+/))
    
    alert(numEl)
    Ответ написан
    Комментировать
  • Как в wordpress в post type убрать вывод слова архивы перед рубрикой, крошках и мета тайтле?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    add_filter( 'get_the_archive_title', function( $title ){
    	return preg_replace('~^[^:]+: ~', '', $title );
    });
    Ответ написан
    Комментировать
  • Как передать UTM-метки в CRM Битрикс 24 с помощью PHP?

    Итак, сначала нужно записать утм в массив $_cookie для того, что при переходе на другие страницы не потерялись значения, вот этот код отвечает за это:

    if(isset($_GET["utm_source"])) setcookie("utm_source",$_GET["utm_source"],time()+3600*24*30,"/"); 
    if(isset($_GET["utm_medium"])) setcookie("utm_medium",$_GET["utm_medium"],time()+3600*24*30,"/"); 
    if(isset($_GET["utm_campaign"])) setcookie("utm_campaign",$_GET["utm_campaign"],time()+3600*24*30,"/"); 
    if(isset($_GET["utm_content"])) setcookie("utm_content",$_GET["utm_content"],time()+3600*24*30,"/"); 
    if(isset($_GET["utm_term"])) setcookie("utm_term",$_GET["utm_term"],time()+3600*24*30,"/");


    Добавляйте его на каждую страницу↑.

    Затем создаем в форме невидимые поля, cо значениями:
    <input name="utm-source" type="hidden" value="<?=$_COOKIE['utm_source']?>">
    <input name="utm-medium" type="hidden" value="<?=$_COOKIE['utm_medium']?>">
    <input name="utm-compaign" type="hidden" value="<?=$_COOKIE['utm_compaign']?>">
    <input name="utm-content" type="hidden" value="<?=$_COOKIE['utm_content']?>">
    <input name="utm-term" type="hidden" value="<?=$_COOKIE['utm_term']?>">


    А в обработчике уже принимаем данные, как и все остальные поля:
    'UTM_SOURCE' => $_POST['utm-source'],
    	            'UTM_MEDIUM' => $_POST['utm-medium'],
    	            'UTM_CAMPAIGN' => $_POST['utm-campaign'],
    	            'UTM_CONTENT' => $_POST['utm-content'],
    	            'UTM_TERM' => $_POST['utm-term'],


    Результат:
    5ea8c07a0c226249777337.jpeg
    Ответ написан
    8 комментариев
  • Оптимизация сайта на Wordpress + Woocommerce?

    secsite
    @secsite
    Безопасные и быстрые сайты
    Кто что посоветует?

    Разбираться с причинами, а не бежать ставить костыли в виде кеш-плагинов.

    wordpress.tv/2013/08/19/konstantin-kovshenin-wordp...
    wordpress.tv/2015/08/20/konstantin-kovshenin-wordp...
    Ответ написан
    Комментировать
  • Оптимизация сайта на Wordpress + Woocommerce?

    maxxannik
    @maxxannik
    Сайты на WordPress + Интернет магазины WooCommerce
    W3 Total Cache на мой взгляд не лучшее решение. Рабочее, но не лучшее.
    Тут вероятно лучше Batcache. Он гибче.
    Далее есть кейсы когда все страницы жестко кешируются. И отдаются из мемкеша моментально.
    А весь интерактив и данные зависимые от авторизации подгружаются через AJAX.
    Плюс основная проблема в поиске. Часто нужен фасетный поиск. В этом случае ставят Эластик или Алголию.
    Ответ написан
    Комментировать
  • Как найти место взлома wordpress?

    @MrGroovy
    Уязвимости в WP бывают двух видов - устаревшая версия самого WP и уязвимости в плагинах и темах. Крайне опасно использовать "крякнутые" темы, в них часто вшивают вредоносный код. Чтобы найти уязвимости в Wordpress можно воспользоваться специальным сканером для WP. Навскидку, это:
    - https://metascan.ru;
    - wprecon.com;
    - hackertarget.com/wordpress-security-scan.
    И разумеется быть аккуратнее с бесплатными темами и сомнительными плагинами, так как они изначально могут содержать в себе вирусы.
    Ответ написан
    1 комментарий