Ответы пользователя по тегу PHP
  • Изучения Larvel без ооп?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Laravel - ООП фреймворк. Единственный способ делать что-то на ларе - писать ООП. Грубо говоря, от него не отвертеться.

    Можно ли учить лару, пробовать что-то писать, изучая параллельно и ООП, и лару? Да, конечно. Совершенно ничего не мешает.
    Ответ написан
    2 комментария
  • Перемешать и переименовать классы html (css)?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    https://github.com/sndyuk/mangle-css-class-webpack...
    https://www.freecodecamp.org/news/reducing-css-bun...
    https://evilmartians.com/chronicles/postcss-module...

    Но в целом смысла в этом особого нету. Во-первых, повторяющиеся строки хорошо ужимаются с помощью gzip и brotli. Во-вторых, сами стили то никуда не денутся, подсмотреть и "стырить" все равно можно. Единственный реальный use case который мне приходит в голову это "нейтральные" названия классов, которые не будут вырезаться каким-нибудь AdBlock.
    Ответ написан
    Комментировать
  • Как в PHPStorm в коде добавить emoji?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Включить в PhpStorm шрифт, который поддерживает emoji.
    JetBrains Mono, например, поддерживает.

    И еще важный момент – то, что emoji не отображается в PhpStorm из-за шрифта, еще не означает, что на страничке оно не будет отображаться. Там же другой шрифт уже будет.
    Ответ написан
    Комментировать
  • Как заставить шорткод Wordpress не игнорировать место вставки?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    $content = '';
    
    foreach ( $world_table as $item ) {      
        $content .= " {$item->subject} - {$item->conf} ";     
    }
    
    return $content;
    Ответ написан
    Комментировать
  • Как внутри шаблона передать из js в php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Простым языком - дело в том, что:

    - сначала PHP код (все что между <?php и ?>) будет выполнен на сервере, и в вашем случае там будет пусто, потому что переменная $type будет существовать только на сервере в момент выполнения этого фрагмента кода, этот код в этом месте ничего не выводит (не делает echo, print, printf и тд).

    - далее будет сгенерирована HTML страничка, которая содержит JavaScript код (все что между <script> и </script>), но еще раз - PHP-кода там уже не будет (он выполнился), вместо него будет результат этого выполнения (в вашем случае - пусто, см. выше)

    - JavaScript код выполняется браузером, после того как он сгенерирован на сервере и скачан оттуда этим самым браузером. И в браузере ваш скрипт, с учетом что PHP там ничего не напечатал, будет выглядеть вот так:

    <script>
    if (screen.width>500) {
    } else {
    }
    </script>

    Таким путем как вы пытаетесь вы можете передать данные из PHP в JavaScript, например <?php echo $type; ?> выведет в JS значение переменной $type. Обратно из JS в PHP вы так данные не передадите, это как путешествие во времени в 1994й год.

    Для передачи данных на сервер используется ajax.
    Ответ написан
    Комментировать
  • Как задать класс изображениям внутри записи на Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Самый простой способ - на хуке the_content обычной заменой или регуляркой, но это если у картинок всегда одна структура (например, мы точно знаем что тег будет <img src="..." class="..." ...). Но вообще парсить html регулярками не самая светлая мысль - для этого есть DOMDocument:
    function add_class_to_images( $content )
    {
        $document = new DOMDocument();
        libxml_use_internal_errors(true); // чтобы не ругался на семантические HTML5 теги
        $document->loadHTML( $content );
        libxml_clear_errors();
    
        $images = $document->getElementsByTagName( 'img' );
    
        /** @var \DOMElement $image */
        foreach ( $images as $image ) {
            $image->setAttribute( 
                'class', 
                $image->getAttribute( 'class' ) . ' my-new-class'
            );
        }
    
        return $document->saveHTML();
    }
    add_filter( 'the_content', 'add_class_to_images' );
    Ответ написан
    9 комментариев
  • Загрузка изображения перед его загрузкой. Как это делают?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Для начала решите, что вам на самом деле нужно - предварительный просмотр изображения (чтобы выглядело как будто картинка загружена, пользователь видел ее в контенте который пишет) или реальная загрузка изображения на сервер. В зависимости от ответа будет разная техника.

    Осознанно учтите и взвесьте основные минусы загрузки на сервер. Самая главная - картинки на сервере будут накапливаться и вам придется разрабатывать систему определения "нужных" и "ненужных" а также механизм автоматического удаления ненужных. Потому что мусора будет много. Кто-то писал черновик и не опубликовал / закрыл окно и забил, а картинка (или даже несколько) уже загружена. Кто-то загрузил одну картинку, посмотрел, не понравилось, выбрал и загрузил другую. И так 10 раз подряд пока не подобрал картинку которая нравится. А у вас 9 ненужных картинок на сервере загружено. Через некоторое время у вас папка с загрузками вырастает до гигабайтов / тысяч файлов, вы смотрите на это и реально не понимаете что из этого используется, а что нет.

    Исходя из этого, в большинстве случае все, что вам нужно это предварительный просмотр на клиенте с помощью javascript. Это можно сделать ванильным js или использовать адекватную библиотеку типа https://github.com/blueimp/JavaScript-Load-Image которая уже решает кучу мелких задач, о которых вы еще даже не догадываетесь (например автоматический поворот по метаданным, ресайз превью в целях оптимизации производительности, crossorigin и тд).

    Если же все-таки вы решите грузить из сразу на сервер, то начните с минимального ТЗ. Используете ли вы какую-то CMS или фреймворк. Куда и как будете загружать файлы. Как будете хранить историю загруженных и очищать ненужные. И так далее. Сам процесс загрузки тривиален - у вас должен быть URL который методом PUT или POST принимает данные (изображение + любую полезную инфу, например ID/UUID черновика записи к которому картинка загружена), обрабатывает их и возвращает URL изображения. Аяксом туда шлете картинку, получаете ответ с адресом картинки на сервере, вставляете его в DOM.
    Ответ написан
    Комментировать
  • Запрос JavaScript =&gt; Wordpress, какой алгоритм?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Есть REST API - это более современная и более удобная практика, чем wp_ajax. Но и этот метод все еще активно используется и в целом вполне ок. Но, имхо, работать с wp_ajax привычнее и удобнее бекендерам. Фронтендерам будет значительно удобнее через REST API:

    https://woocommerce.github.io/woocommerce-rest-api...
    https://github.com/woocommerce/woocommerce-rest-ap...
    Ответ написан
  • Почему код не отрабатывает из-за кода сверху?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    <?php the_field('important__title', $post->ID); ?>

    Функция the_field() принимает 2 параметра - название поля и ID объекта, которому это поле принадлежит (выборка значения из БД происходит по этим 2м параметрам). Если второй параметр не указать, то ACF попытается использовать ID глобального $post. И если делать это в рамках стандартного цикла WordPress Loop, то это всегда будет работать как положено, отсюда привычка вызывать the_field() без второго параметра. Но у вас нету глобального цикла, соответственно глобальная $post - скорее всего вообще пуста. Поэтому вам нужно принудительно передать ID нужно поста, в данном случае - 34, если поле принадлежит записи которую вы получали выше. Если же должно принадлежать глобальной записи - не используйте переменную $post.
    Ответ написан
    3 комментария
  • Каким образом подключать оплату через Приват24 к landing page?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ну вот например https://github.com/sergeynezbritskiy/privatbank-api
    Гуглите privatbank api php sdk
    Ответ написан
    Комментировать
  • Как сделать бота, который будет оформлять покупки?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Мне кажется лучше сразу писать бота, который поедет в Китай, откроет там свою фабрику, которая будет фигачить нужные товары по прямому заказу мимо АлиЭкспресс, в идеале так чтоб заказ отправить можно было силой мысли. И при этом доставка бесплатная будет и вообще товар бесплатно - ведь фабрика то своя! Реально ли такое осуществить? Если да, то как, напишите пожалуйста в комментах.
    Ответ написан
  • Как исправить эту ошибку?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Проблема в области видимости - переменная $mysqli недоступна в функции fakePayout(). Решается одним из способов:

    1. Явной передачей переменной внутрь функции function fakePayout($mysqli, ...) {
    2. Корректным доступом к данной переменной, поместив ее в свойство класса, содержащего функцию fakePayout():
    class SomeClass 
    {
        private $mysqli;
    
        public function __construct(DataBase $mysqli)
        {
            $this->mysqli = $mysqli;
        }
    
        public function fakePayout($user, $amount, $time)
        {
            // Теперь можно использовать
            $this->mysqli->query()
        }
    }

    3. Вариации #2 с dependency injection контейнерами, фасадами и прочее.

    ЗЫ: Можно еще внутри самой функции создавать соединение, или хранить его в глобальной переменной / синглтоне - но это уже совсем дичь.
    Ответ написан
    24 комментария
  • Где могут быть заданы перенаправления сайта на другой домен?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Конфиг сервера. Это может быть .htaccess в корне проекта, а также кконфигурация самого virtual host. Еще вполне может оказаться что перед Apache стоит Nginx, тогда смотреть и его конфиг.
    2. Если п.1 мимо - смотрим wp-config.php, константы WP_HOME и WP_SITEURL
    3. Если п.2 мимо - константы не определены, то смотрим в базу данных, таблица wp_options, опции с такими же названиями (только в нижнем регистре).
    4. Если и в БД все ок, пробуем добавить выше упомянутые константы в конфиг и указать там нужные значения.
    5. Если это все не помогло - ищем по всему коду слово redirect.
    Ответ написан
    2 комментария
  • Почему не работает elseif в цикле?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы не можете прерывать поток if/elseif/else циклом for. В данном случае elseif перестает быть веткой логики if, а становится самостоятельной веткой внутри for, соответственно должен быть записан как if.
    Ответ написан
    Комментировать
  • Как изменить счетчик автоматического увеличения в MySQL на php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Как изменить счетчик автоматического увеличения в MySQL

    ALTER TABLE table_name AUTO_INCREMENT = value;

    на php?

    Выполнить этот запрос из PHP.
    Ответ написан
  • Как правильно избавиться от дублирования при описании структуры массива?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если это нужно только для подсказок в PhpStorm, то я бы рекомендовал использовать плагин deep-assoc-completion и не заморачиваться с docblock.
    Ответ написан
    2 комментария
  • Как лучше хранить изображений? Одна папка или много?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Это называется "отношение 1 к многим", оно же one to many, оно же 1:n. На уровне базы данных выглядит так:

    Таблица tasks:
    - id
    - ...

    Таблица photos:
    - id
    - task_id (foreign key)
    - ...

    Все фотографии для конкретного задания получаются запросом:
    SELECT * FROM photos WHERE task_id=X

    В каких папках их хранить на самом диске - вопрос отдельный и по большому счету несущественный.
    Ответ написан
    6 комментариев
  • Как решить правильно простенькую задачку по php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    // По вашему коду:
    $source_string = 'abcdefghijklmnopqrstuvwxyz';
    $string_randomized = str_shuffle($source_string); // Перетасовали буквы внутри строки
    echo substr($string_randomized, 0, 6); // Вывели первые 6, без повторений и каждый раз после str_shuffle - уникально-рандомно (относительно, но задача именно этого и требует)
    
    // По красоте:
    $characters = 'abcdefghijklmnopqrstuvwxyz';
    echo substr(str_shuffle($characters), 0, 6);
    
    // Тестируем в psych:
    >>> $characters = 'abcdefghijklmnopqrstuvwxyz';
    => "abcdefghijklmnopqrstuvwxyz"
    >>> echo substr(str_shuffle($characters), 0, 6);
    fzpvad
    >>> echo substr(str_shuffle($characters), 0, 6);
    bzeiyj
    >>> echo substr(str_shuffle($characters), 0, 6);
    pgkuaq
    >>> echo substr(str_shuffle($characters), 0, 6);
    otjszx
    >>> echo substr(str_shuffle($characters), 0, 6);
    zjwaox
    >>> echo substr(str_shuffle($characters), 0, 6);
    rxuhnv
    >>> echo substr(str_shuffle($characters), 0, 6);
    rihoec
    >>> echo substr(str_shuffle($characters), 0, 6);
    uwdfgn
    >>>
    Ответ написан
    5 комментариев
  • Как правильно написать формулу для вывода элементов на экран?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Для работы с кратностью есть такая штука как remainder или modulus. Тут подробнее. Условно проверка if ( $var % 6 ) возвращает 0 если переменная $var делится на 6 без остатка (то есть кратна 6). Все это есть и в документации PHP в разделе про арифметические операторы.
    Ответ написан
    1 комментарий
  • Как вывести список всех таблиц MySQL и количество строк в каждой из них впри помощи PHP?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    SHOW TABLES FROM database_name прекрасно работает когда база не выбрана. Здесь мы показываем таблицы в базе, а не в $db_table. Исходя из вашего нейминга, вы просите таблицу показать ее таблицы, что абсурдно само по себе. Обращайтесь к базе. Или, если вы базу предварительно уже выбрали, то достаточно SHOW TABLES.

    Далее, для SELECT * FROM table_name уже сначала нужно выбрать базу данных (которую вы опрашивали на предмет таблиц в первом запросе), или же обращаться к таблице в формате database_name.table_name.

    Ну и, вместо того чтобы делать выборку всех строк со всеми колонками, спросите сразу SELECT COUNT(*) FROM database_name.table_name.

    Еще проще и быстрее это сделать с помощью такого запроса:

    SELECT table_name, table_rows
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'your_database_name';


    Результат этого запроса:

    +-----------------------+------------+
    | table_name            | table_rows |
    +-----------------------+------------+
    | wp_terms              |         10 |
    | wp_yoast_seo_meta     |         61 |
    | wp_yoast_seo_links    |         33 |
    | wp_commentmeta        |          0 |
    | wp_term_taxonomy      |         10 |
    | wp_ewwwio_queue       |        352 |
    | wp_usermeta           |        114 |
    | wp_options            |        281 |
    | wp_users              |          5 |
    | wp_term_relationships |         49 |
    | wp_ewwwio_images      |       1048 |
    | wp_links              |          0 |
    | wp_postmeta           |      21408 |
    | wp_termmeta           |          0 |
    | wp_comments           |          0 |
    | wp_posts              |        738 |
    +-----------------------+------------+


    Единственное, что нужно учесть - если таблицы у вас InnoDB, то данные цифры будут более-менее точными, но не совсем. В силу механизмов оптимизации. Так что если нужно "приблизительно" понимать - используйте данный метод. Если нужно с точностью до одной строки - тогда COUNT.

    Ну и еще можно сделать SHOW TABLE STATUS, находять в выбранной базе данных. Точность подсчета количества строк на InnoDB такая же, как и предыдущем методе, но зато здесь будет еще много полезной информации. Например - avg_row_length, data_length, index_length и другое.
    Ответ написан
    4 комментария