• Динамическая генерация страниц wordpress?

    Immortal_pony
    @Immortal_pony
    Динамический элемент сделать в виде шорткода.
    Ответ написан
    Комментировать
  • Как вырезать данные из столбца?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    SELECT REGEXP_REPLACE(
      'format|MP3||duration|01:42:46||year|2020||tracks|0||size|238 MB||torrent-mp3|[attachment=190:miami-cyber-nights-vol-1-2020.torrent]',
      '\\|tracks\\|[0-9]{1,}\\|',
      ''
    ) AS res;
    Ответ написан
    Комментировать
  • Как в цикле foreach удалить массив из многомерного массива по ключу?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Если есть вероятность, что ключа stocks не будет на месте, то не забудьте добавить соответствующую проверку.
    Аналогично с type

    foreach ($items as $itemIndex=>$item) {
        foreach($item['stocks'] as $stockIndex=>$stock) {
            if ($stock['type'] === "fbo") {
                unset($items[$itemIndex]['stocks'][$stockIndex]);
                $items[$itemIndex]['stocks'] = array_values($items[$itemIndex]['stocks']);
            }
        }
    }
    Ответ написан
    3 комментария
  • Как сделать скидку на товар в шаблоне Opencart через PHP?

    Immortal_pony
    @Immortal_pony
    Во-первых, если выполнить ваш код, то результат будет 193.71, а на 0.18. Проверьте, что в price у вас лежит именно то что вы написали.

    Во-вторых, формула для вычисления скидки у вас неправильная. Вы вычисляете 3%, а вам нужно уменьшить price на 3%. Например, так:

    $salePrice = $price - ($price/100*3);

    Ну и в шаблоне потом
    <?= $salePrice ?>
    Ответ написан
    Комментировать
  • Как найти два слова в диапазоне нескольких символов между ними?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Код предполагает, что в каждой строке искомое слово может встречать не более одного раза.
    То есть, в строке типа "word.........17199,word" пара найдена не будет.

    function findPair(string $text, array $words, int $range=5) {
        $rows = explode(PHP_EOL, $text);
        $numberLength = 5;
        $pair = null;
        $isNumberFound = false;
        
        foreach ($words as $word) {
            foreach ($rows as $row) {
                $wordPos = strpos($row, $word);
                $isWordInRow = $wordPos !== false;
                
                if (!$isWordInRow) {
                    continue;
                }
                
                
                
                /* Going backwards first */
                $backwardSearchStart = $wordPos-1;
                $backwardSearchEnd = $backwardSearchStart - $range;
                
                for ($symbolPos=$backwardSearchStart; $symbolPos>$backwardSearchEnd; $symbolPos--) {
                    // Stop backward search if we are in the very beginning of the row
                    if ($symbolPos <= 0) {
                        break;
                    }
    
                    $symbol = substr($row, $symbolPos, 1);
                    
                    if (is_numeric($symbol)) {
                        $lastNumberPos = $symbolPos - $numberLength;
                        $digits = [];
                        
                        for ($digitPos=$symbolPos; $digitPos>$lastNumberPos; $digitPos--) {
                            $digit = substr($row, $digitPos, 1);
                            
                            if (is_numeric($digit)) {
                                $digits[] = $digit;
                            } else {
                                break;
                            }
                        }
                        
                        $isNumberFound = count($digits) === $numberLength;
                        
                        if ($isNumberFound) {
                            $number = implode(array_reverse($digits));
                            $pair = [$word, $number];
                            break;
                        }
                    }
                }
                
                if ($isNumberFound) {
                    return $pair;
                }
                
                
                
                /* Forward search */
                $forwardSearchStart = $wordPos+1+strlen($word);
                $forwardSearchEnd = $forwardSearchStart + $range;
                
                for ($symbolPos=$forwardSearchStart; $symbolPos<$forwardSearchEnd; $symbolPos++) {
                    $symbol = substr($row, $symbolPos, 1);
                    
                    if (is_numeric($symbol)) {
                        $lastNumberPos = $symbolPos + $numberLength;
                        $digits = [];
                        
                        for ($digitPos=$symbolPos; $digitPos<$lastNumberPos; $digitPos++) {
                            $digit = substr($row, $digitPos, 1);
                            
                            if (is_numeric($digit)) {
                                $digits[] = $digit;
                            } else {
                                break;
                            }
                        }
                        
                        $isNumberFound = count($digits) === $numberLength;
                        
                        if ($isNumberFound) {
                            $number = implode($digits);
                            $pair = [$word, $number];
                            break;
                        }
                    }
                }
                
                if ($isNumberFound) {
                    return $pair;
                }
            }
        }
        
        return $pair;
    }
    
    $words = ["apple", "word", "new"];
    $text = <<<TEXT
    what, 10924
    59012, test
    VT 92918
    word, 18913
    site 85719
    12345 Wisconsin
    TEXT;
    
    
    $pair = findPair($text, $words);
    /* Result: 
    array(2) {
      [0]=>
      string(4) "word"
      [1]=>
      string(5) "18913"
    }
    */
    Ответ написан
    Комментировать
  • Слетели стили админки OpenCart. Как исправить?

    Immortal_pony
    @Immortal_pony
    Если магазин на ocStore, то никакого отношения в Wordpress он не имеет.
    Tryggvi что за плагин был поставлен и каким образом?
    Ответ написан
    Комментировать
  • Как безопасно разрешить отправлять ссылки в базу и выводить их в дальнейшем?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Более или менее надёжен HTML Purifier в этом вопросе (htmlpurifier.org)
    Ответ написан
    Комментировать
  • Group by. Как отфильтровать запрос?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    SELECT 
        ## product_id
        CASE 
            WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`product_id`)
            ELSE (
                SELECT 
                    `product_id` 
                FROM 
                    `products` AS `product_id_sub` 
                WHERE 1
                    AND `product_id_sub`.`group_id`=`products`.`group_id`
                    AND `product_id_sub`.`quantity` > `product_id_sub`.`minimum`
                ORDER BY 
                    `product_id_sub`.`minimum` DESC
                LIMIT 1
            )
        END AS 'product_id',
        
        ## name
        CASE 
            WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`name`)
            ELSE (
                SELECT 
                    `name` 
                FROM 
                    `products` AS `name_sub` 
                WHERE 1
                    AND `name_sub`.`group_id`=`products`.`group_id`
                    AND `name_sub`.`quantity` > `name_sub`.`minimum`
                ORDER BY 
                    `name_sub`.`minimum` DESC
                LIMIT 1
            )
        END AS 'name',
        
        ## quantity       
        CASE 
            WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`quantity`)
            ELSE (
                SELECT 
                    `quantity` 
                FROM 
                    `products` AS `quantity_sub` 
                WHERE 1
                    AND `quantity_sub`.`group_id`=`products`.`group_id`
                    AND `quantity_sub`.`quantity` > `quantity_sub`.`minimum`
                ORDER BY 
                    `quantity_sub`.`minimum` DESC
                LIMIT 1
            )
        END AS 'quantity',
        
        ## minimum       
        CASE 
            WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`minimum`)
            ELSE (
                SELECT 
                    `minimum` 
                FROM 
                    `products` AS `minimum_sub` 
                WHERE 1
                    AND `minimum_sub`.`group_id`=`products`.`group_id`
                    AND `minimum_sub`.`quantity` > `minimum_sub`.`minimum`
                ORDER BY 
                    `minimum_sub`.`minimum` DESC
                LIMIT 1
            )
        END AS 'minimum',
        
        ## group_id
        `group_id`    
    FROM `products`
    GROUP BY `group_id`


    Если устроит результат в виде JSON, то можно сократить количество подзапросов:
    SELECT 
        CASE 
            WHEN COUNT(`products`.`product_id`)=1 THEN JSON_OBJECT(
                'product_id', ANY_VALUE(`products`.`product_id`),
                'name', ANY_VALUE(`products`.`name`),
                'quantity', ANY_VALUE(`products`.`quantity`),
                'minimum', ANY_VALUE(`products`.`minimum`),
                'name', `products`.`group_id`
            )
            ELSE (
                SELECT 
                    JSON_OBJECT(
                        'product_id', `product_with_required_quantity`.`product_id`,
                        'name', `product_with_required_quantity`.`name`,
                        'quantity', `product_with_required_quantity`.`quantity`,
                        'minimum', `product_with_required_quantity`.`minimum`,
                        'name', `product_with_required_quantity`.`group_id`
                    )
                FROM 
                    `products` AS `product_with_required_quantity` 
                WHERE 1
                    AND `product_with_required_quantity`.`group_id`=`products`.`group_id`
                    AND `product_with_required_quantity`.`quantity` > `product_with_required_quantity`.`minimum`
                ORDER BY 
                    `product_with_required_quantity`.`minimum` DESC
                LIMIT 1
            )
        END AS 'product'  
    FROM `products`
    GROUP BY `group_id`


    PS В обоих запросах логика для не указанных чётко случаев следующая:
    1. Если нет ни одного записи с quantity>minimum, то пишем NULL
    2. Если больше чем одной записи с quantity>minimum, то выбираем запись с наибольшим quantity и пишем её данные
    Ответ написан
    Комментировать
  • Php как проверить два многомерных массива по id и вывести true?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Сдаётся мне, здесь путаница в терминологии.
    Магический шар мне подсказывает, что ситуация такая. У нас есть два численно индексированных массива, каждый элемент которых представляет собой ассоциативный массив определённого формата. Формат ассоциативных массивов одинаков для всех элементов каждого из численно индексированных массивов.

    Тогда код будет примерно таким:

    foreach ($secondArray as $secondArrayElement) {
        $secondArrayElement = (array)$secondArrayElement;  // вы везде пишете "массив", но, судя по вашему примеру, у вас тут объект, а не массив. Поэтому я сделал явное преобразование в массив на случай если была ошибка в формулировке.
        $doesExistInFirstArray = false;
    
        foreach ($firstArray as $firstArrayElement) {
            if ($firstArrayElement['ID'] == $secondArrayElement['id']) {
                 $doesExistInFirstArray = true;
                 break;
            }
        }
    
        $secondArrayElement['doesExistInFirstArray'] = $doesExistInFirstArray;
    }


    Код добавит каждому элементу второго массива информацию о том, существует и аналогичный элемент в первом массиве.

    Уточните, этого ли вы хотели? Если нет, то постарайтесь разобраться в терминолоии и задать вопрос правильно.
    Сейчас он звучит как полнейшая чушь.
    Ответ написан
    Комментировать
  • Рекомендуете платформа для интернет магазина?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Максимально быстро - Shopify.
    Второй вариант - обращайтесь на фриланс-биржу и там вам уже разработчики предложат стэк, который более удобен для них.
    Ответ написан
    Комментировать
  • Правильно ли я строю HTML конструкции на PHP?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Шаблоны выносить в отдельные файлы.
    Если тебе нужно весь этот HTML складывать в переменную, то вот тебе волшебная функция:

    function render($part, array $vars=[]) {
        extract($vars);
        ob_start();
        require __DIR__ . "/views/" . $part . ".php"; // путь тут поправь в соответствии с твоими реалиями
        return ob_get_clean();    
    }


    Всё, дальше свои шаблоны можешь складывать в папке /views.
    Итого, в твоем исходном файле будет вот такой код вместо твоей портянки:

    $user_html_entity = render("user_entity", compact(
        "user_id", 
        "user_avatar_link", 
        "user_nickname",
        "user_last_online_datetime",
        "user_initials_info_string",
        "user_location_string"
    ));


    А, твой шаблон будет лежать красиво отдельно и там будет HTML с минимальным количеством PHP для вывода динамически генерируемых данных.

    Вот так примерно:

    <a href="/user/<?= $user_id ?>" class="user" data-id="users___user_link">
        <div class="section_900">
            <img src="<?= $user_avatar_link ?>">
            <div class="no_image_content">
                <p class="nickname"><?= $user_nickname ?></p>
                <p class="online_status"><?= Get_Online_Status_From_Datetime($user_last_online_datetime) ?></p>
                <p class="initials"><?= $user_initials_info_string ?></p>
                <p class="location"><?= $user_location_string ?></p>
            </div>
        </div>
    </a>


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

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Выкинуть init()
    Сделать __contstruct. В нём принимать key
    Выкинуть проверки ключа из кода
    Не использовать underscore в названиях функций (вкусовщина, но PSR)
    Функцию перевода сделать не статической.
    В функции перевода никаких данных из $_GET не вытаскивать. Все параметры только принимать. Если нужно что-то из $_GET, то делать это вне этого класса, не забыв санитайзинг и валидацию
    Не использовать устаревший синтаксис array()
    Обязательно выставлять таймаут на ответ внешнего сервиса
    Обрабатывать ошибки если они произошли во время запроса (если сервер вернул 404, например. Или если он не ответил в таймаут)
    json_decode вызывать только с флагом JSON_THROW_ON_ERROR или явно проверять что json распарсился корректно
    Код ответа вытаскивать не из json'а, конечно.
    Валидировать корректность полученных данных перед возвратом (убедиться что все ожидаемые поля на месте и значения в пределах допустимых)
    Ответ написан
    Комментировать
  • Взять рандомную строку с удалением?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Ваш запрос похож на попытку удаления случайной строки из базы.
    Это действительно можно сделать одним запросом.
    Вот он:
    DELETE FROM `cat_product` WHERE `id` IN (SELECT `inner`.`id` FROM(
        SELECT  `cat_product`.`id` FROM `cat_product` ORDER BY RAND() LIMIT 1
    ) as `inner`)


    Если это не то чего вы хотели, то, пожалуйста, чётко сформулируйте в тексте вопроса желаемый результат. Максимально подробно.
    Ответ написан
    1 комментарий
  • Как сделать регистронезависимый поиск по longblob?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Поля данных BLOB/LONGBLOB вообще для хранения бинарных данных, а не для хранения текста, по которому может идти поиск.
    Если нужен поиск, то сделайте тип поля TEXT/LONGTEXT.

    Далее, что подразумевается под поиском?
    Есть в MySQL и LIKE, и REGEXP, и MATCH ... AGAINST

    Если речь о LIKE или MATCH ... AGAINST, то достаточно будет задать кодировку utf8_general_ci, да.
    Если говорим о REGEXP, то надо будет искомую строку в нижний регистр переводить. Например, с помощью LOWER()
    Ответ написан
    4 комментария
  • Как объединить 2 записи в одну по признаку?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    SELECT 
        ANY_VALUE(id) AS 'id',
        office_id, 
        IF(
            POSITION(',' IN GROUP_CONCAT(employee_id))=0, 
            GROUP_CONCAT(employee_id), 
            SUBSTR(GROUP_CONCAT(employee_id), 1, POSITION(',' IN GROUP_CONCAT(employee_id))-1)
        ) AS 'employee_id_first',
        IF(
            POSITION(',' IN GROUP_CONCAT(employee_id))=0, 
            NULL, 
            SUBSTR(
                RIGHT(GROUP_CONCAT(employee_id), LENGTH(GROUP_CONCAT(employee_id))-POSITION(',' IN GROUP_CONCAT(employee_id))),
                1,
                POSITION(',' IN RIGHT(GROUP_CONCAT(employee_id), LENGTH(GROUP_CONCAT(employee_id))-POSITION(',' IN GROUP_CONCAT(employee_id))))-1
            )
        ) AS 'employee_id_second'
    FROM 
        t
    GROUP BY
        office_id
    Ответ написан
    Комментировать
  • Как добавлять свои аватар пользователям сайта через mysql в phpmyadmin?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Для превращения картинки в код можно воспользоваться онлайн-сервисами. Например, вот: https://www.base64-image.de/
    Дальше этот код можно положить в базу
    Ответ написан
    Комментировать
  • Как при приеме вебхука от апи отсечь дублирующий запрос?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Ну в файл пишите id-шники обработанных webhook'ов. Или в сессию
    Ответ написан
    Комментировать
  • Как в Sql получить связь один ко многим, где многие будут сразу массивом?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    IF(COUNT(`spots_comments`.`id`) = 0, '[]', CONCAT(
        '[', 
        GROUP_CONCAT(JSON_OBJECT(
            'id', `spots_comments`.`id`,
            'created', `spots_comments`.`created`,
            'current', `spots_comments`.`text`,
        ) ORDER BY `spots_comments`.`created` DESC),
        ']'
    )) AS 'lastComments'
    Ответ написан
    Комментировать
  • Каким образом можно хранить массивы в ячейках в таблице?

    Immortal_pony
    @Immortal_pony Куратор тега MySQL
    Если вы хотите одним запросом вытаскивать, то JSON_ARRAYAGG вам в помощь.
    А так логика верная, только не все images вытаскивайте, а те, которые относятся к вашим постам.
    Ответ написан
    6 комментариев
  • Как получить $_POST запрос в functions.php в Wordpress?

    Immortal_pony
    @Immortal_pony
    Я не вижу в коде, что вы её получаете. Внутри функции calculate_discounted_price указанной переменной определённо нет. Ну, добавьте:

    function calculate_discounted_price( $price, $values ) {
        $pricequery = (float)$_POST['custom_price'];
        $price += $pricequery;
        return $price;
    }
    Ответ написан
    Комментировать