Ответы пользователя по тегу PHP
  • Ценится ли IT-специалист, который умеет все?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Могу по себе сказать. Так уж получилось, что карьера у меня началась с графического дизайна, но в это же время я увлекся html. Сделал карьеру в дизайне, доработался до старшего арт-директора крупного РА, потом креативного директора, получил несколько наград на фестивалях. Потом понял, что уперся в потолок, и ушел раззвиваться проджектом. Дослужился до технического директора интернет-департамента крупнейшего телеканала страны. В процессе сильно втянулся в программирование (html-css-js-php все это время было перманентным хобби и отчасти дополнительным фрилансом). Сейчас как раз выступаю в роли CTO в крупном стартапе, одновременно являясь "играющим тренером", пишущим большую часть кода и рисующим интерфейсы. Мое знакомство с компьютерами началось с Линукса - в универе в интернет-центре все компы были на нем. Итого, на выходе получился дизайнер, верстальщик, програмер, сисадмин, проджект-менеджер с хорошим пониманием всего процесса целиком и всех мелких процессов в каждом направлении, а также с четким понимаем того, как это все превращается в системный бизнес. На всех этапах моих карьер эти навыки приносили очень хороший доход. Но есть одно "НО" - у меня на это ушло 16 лет. Шестнадцать. Есть такое правило 7000 часов (если мне не изменяет память). То есть, занимаясь серьезно одним делом 7000 часов ты становишься профессионалом в этой сфере. Берем 8 рабочих часов в день, 40 часов в неделю, 50 недель в году. Итого - 2000 часов в год. 3,5 года, чтобы стать профессионалом в одной сфере. Это если отнестись к делу серьезно. Если же по-быстрому нахвататься обрывочных и общих знаний из разных областей - толку от этого мало. Такой "специалист" заявляет, что знает все, но на самом деле толком не знает ничего.
    Ответ написан
    Комментировать
  • Как добавить в кешированную страницу данные авторизованного пользователя?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Я делаю javascript'ом. Чем не нравится решение? В том месте в шапке сайта, где у нас аватар + имя пользователя и иконка его меню, я вывожу по умолчанию "заглушку" и вращающийся спиннер. Проверяем куку локальную, если авторизован - выводим туда аватар + имя, не авторизован - выводим ссылки на вход и регистрацию. Если это сделать с легкой анимацией, то смотрится вполне отлично. Если куки нет, то эту "заглушку" может быть видно 0.5-3 секунды, зависит от того как долго будет срикпт с сервером общаться, если же кука есть, то чаще всего вообще никто ничего не заметит. Дабы сократить FOUC данный скрипт стоит в самом хтмл прямо в том месте где надо. Чтобы не ждать всех загрузок и т.д. а выполниться максимально быстро.
    Ответ написан
  • Как выполнить функцию после сабмита формы?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Код и не мог работать на странице формы, WordPress не позволит. Почитай про lifecycle. Хукаться и выполнять другие низкоуровневые действия можно только из functions.php или из плагина. Непосредственно из файла темы (шаблона) работать не будет, если на пальцах - в тот момент, когда инклудится и выполняется файл темы, все основные экшны уже давно выстрелили.
    Ответ написан
    Комментировать
  • Правильно ли организована моя лента для Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Внимательно читайте документацию и best practices в блогах опытных разработчиков. На русском языке действительно качественной информации по WordPress очень мало. Читайте хотя бы Константина Ковшенина (блог на английском, блог на русском).

    1. Никогда не используйте query_posts. Это неэффективно - данная функция заменяет основной запрос (Main Query), но выполняется ПОСЛЕ него. То есть, выполняет запрос к БД повторно, уже с новыми аргументами. Кроме того, практически гарантированно вылезут проблемы с постраничной навигацией. И не забывайте, что все дополнительные данные (виджеты с категориями, последними постами и комментами и т.д.) будут продолжать пытаться использовать данные из основного запроса, а данная функция глобальные переменные заменит, большая часть template tags будет выдавать совершенно неожиданные вещи. Бардак обеспечен. При использовании этой функции нужно не забывать в нужных местах вставлять wp_reset_query(), с чем точно запутаетесь. Данную функцию можно использовать только в одном случае - вызывать ДО основного loop, чтобы изменить параметры запроса. В этом случае WordPress проигнорирует те параметры, которые получит в запросе (GET / ваш урл), и будет использовать те, которые ему передать через query_posts. Но для этих задач есть более правильные решения.

    2. Функция get_posts() предназначена для получения небольших, конкретных списков постов мимо основного Loop. Когда не нужна постраничная навигация и все дополнительное добро. Например, под статьей вывести список 5 последних статей из этого раздела. Или в боковой колонке вывести 10 статей, помеченных тем же тегом, что основная статья.

    3. Если КРОМЕ основного запроса нужно сделать еще один, используйте новый loop:

    $myquery = new WP_Query( $args );
    if( $myquery->have_posts() ) :
        while( $myquery->have_posts() ) : $myquery->the_post();
        ...
        endwhile;
    endif;

    Например, есть раздел "События", и этот раздел - не обычные posts, а custom post type 'event'. И нам в ленте надо вывести не в обычном виде, а 2 блока - первый это ближайшие события (по дате от сегодня и в будущее), второй - прошедшие события (по дате от сегодня и в прошлое). Первый блок выводим модифицированным основным запросом (см. дальше про модификацию основного запроса), второй - нашим новым лупом.

    3. Если нужно модифицировать основной запрос, и все что с ним связано (глобальные переменные и т.д.), единственно правильный способ - через хук pre_get_posts. Использовать надо в файле functions.php

    add_action( 'pre_get_posts', 'my_function' );
    function my_function( $query ) {
        // здесь можно (и нужно) использовать conditional проверки 
        // и модифицировать запросы для разных страниц и исловий, 
        // все в одной фукнции.
        if( $query->is_archive() && $query->is_main_query() ) :
            $query->set(
                'tag_id'                  => '1,10,15,2,30,31,32,35,89,55,120,140,150,4',
    	    'author'                 => '1,2,3,50,150,140,35',
    	    'posts_per_page'   => '10',
    	    'orderby'                => 'date',
            );
        endif;
    }

    Данный способ не плодит дополнительных запросов, модифицирует напрямую основной запрос, при этом остается возможность модифицировать его дополнителньо из других мест (например, из плагинов - тот же WPML или Polylang для мультиязычной подддержки), не вызывает никаких проблем с постраничной навигацией, правильно устанавливает все глобальные переменные, отчего все дополнительные плюшки (виджеты, последние комменты и посты, меню и прочее) работают корректно.
    Ответ написан
  • Как лучше сделать связь записей в CMS WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Advanced Custom Fields штука хорошая и удобная, но на больших сайтах со сложным контентом - жутко медленная. Если нужны именно кросс-связи между объектами (post types, users) - есть отличный плагин Posts-to-Posts. Ну и кастомные таксономии.

    Грубо говоря, логика такая:
    - все что похоже на самостоятельный объект со своей моделью -> custom post type
    - любые "поля" / даполнительные данные, по которым нужна агрегация, сортировка, фильтрация и тд -> custom taxonomy
    - любые поля, которые просто дают доп.инфу -> custom meta (postmeta, usermeta и т.д.)
    - у ACF у полей Relationship есть галочка "Загрузить значение основываясь на терминах записи и обновить термины записи при сохранении" - обязательно использовать ее
    - если нужно связать объекты напрямую - Posts-to-Posts.

    Например, есть событие (CPT), есть место/локация (CPT), есть пользователи. Есть таксономии страна/город, тип события. С помощью Posts-to-Posts связываем между собой событие и место, а также к событию привязываем несколько пользователей (например, организаторы события), и у события и у места есть таксономия страна/город. Таксономия тип события релевантна только для событий. Получается стройная и гибкая, расширяемая схема. И главное - это все быстро работает, никаких запросов по meta_key. А место ACF в этой схеме - например, для локации это адрес, карта, контакты, ссылка на сайт/соцсети, фотогалерея и тд. Для события - приглашение, расписание, фотографии и видео, дата и время проведения события и тд.

    Я описал на своем примере, но переложить логику на компании / лица не составит труда.
    Ответ написан
    Комментировать
  • Как решить MySQL проблему "Failed to read auto-increment value from storage engine" при установке Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Проблема 100% на уровне MySQL, WordPress тут вообще ни при чем. Простая переустановка не факт что поможет. С обычным MySQL давно не работаю, советую сделать то же самое - установить MariaDB 10 (и модуль php-mysqlnd понадобится).

    1. Здесь выбираем свою версию убунты и MariaDB, полученные данные добавляем в список репо
    2. Удаляем MySQL
    3. Устанавливаем MariaDB и php-mysqlnd
    4. Делаем mysql_secure_install
    5. Профит
    Ответ написан
  • Как можно отмониторить нагрузку на сервер через php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Внешним PHP никак, только если стучаться на что-то, что эти данные выдает - либо php-скрипт, либо страница статуса веб-сервера (nginx_stub_stats, apache_status), либо еще что-то подобное. Но, если сервер лежит - это вообще не вариант. Munin, Monit, Cacti - этих решений для мониторинга целая туча. Есть еще прекрасный во всех смыслах New Relic.
    Ответ написан
  • Как уменьшить вес шрифтов при верстке?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Кидать обычные ttf в папку - это вообще совсем неправильно. Это десктоп-версии шрифтов, они тяжелые.
    2. Необходимо использовать генератор webfonts, FontSquirrel - отличный вариант. Генерить только необходимые языки и символы, вырезать метаданные.
    3. Если нужна поддержка IE9+ (ну и все нормальные браузеры) - генерируйте только woff (см. поддержку). Это самый легкий формат.
    4. Если нужна поддержка IE8 и ниже - придется использовать EOT-формат.

    или использовать Google Fonts, который все это дело позволяет тоже настроить. К тому же, есть 2 бонуса:
    1. Это запросы на внешний домен, значит во время загрузки страницы свой файлы будут быстрее грузиться (загрузка будет идти параллельно с двух доменов)
    2. У многих пользователей шрифты уже будут в кеше.
    Ответ написан
    1 комментарий
  • Как сделать запрос wpdb, а затем привязать его к циклу?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Есть у WP вот такая штука, pre_get_posts:
    function my_modify_main_query( $query ) {
         $query->query_vars['posts_per_page'] = 5; // вносим изменения в запрос, таких строчек может быть много.
    }
    add_action( ‘pre_get_posts’, ‘my_modify_main_query’ );

    Что делает: изменяет параметры основного запроса в БД до того, как он будет выполнен. Таким образом, полученные результаты будут доступны через стандартный wordpress loop - не нужно будет писать лишний код, да и темы вручную тюнить.
    Ответ написан
    6 комментариев
  • Нармальный mysql

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    MariaDB - отличный вариант. Только, в любом случае - что с MariaDB, что с MySQL - надо попросту устанавливать именно то, что нужно, а не все подряд. Какая OS? Что мешает собрать отдельно только сервер?
    Ответ написан
    Комментировать
  • Кэш или локальное хранилище - что лучше?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Так это же разного поля ягоды. Кеш на стороне сервера и его задача ускорить выдачу данных и снижать нагрузку. Локал сторадж же для хранения небольших данных локально. Что конкретно и с какой целью надо хранить?
    Ответ написан
    6 комментариев
  • Как поменять домен Wordpress в файлах?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Можно в wp-config.php вручную прописать. Я вообще эти опции из базы никогда не использую. Во-первых - мешает синхронизации между локалкой, тестовым сервером и живым. Во-вторых это лишние запросы в бд.

    Оптимальный код (первые строчки - ответ на ваш вопрос, остальное - бонус):

    /**
     * Give WordPress it's own directory.
     */
    define( 'WP_SITEURL', 'http://' . $_SERVER['SERVER_NAME'] . '/core' );
    define( 'WP_HOME',    'http://' . $_SERVER['SERVER_NAME'] );
    
    /**
     * Link our custom wp-content directory.
     */
    define( 'WP_CONTENT_DIR', dirname( __FILE__ ) . '/content' );
    define( 'WP_CONTENT_URL', 'http://' . $_SERVER['SERVER_NAME'] . '/content' );


    В этом случае корневая директория у вас выглядит так:
    /core/ - оригинальная папка wordpress из архива, скачанного с wordpress.org (имя любое)
    /content/ - копия папки wp-content (плагины, темы, загрузки)
    index.php
    wp-config.php
    .htaccess

    Также не забудьте в оригинальной папке /wp-content/ грохнуть все плагины и темы, папки должны присутствовать, но быть пустыми (только index.php, который там валяется)
    Ответ написан
    Комментировать
  • Какую выбрать CMS на PHP?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Раз Jekyll не катит по идеологическим соображениям - тогда Sculpin.
    Но если WordPress "слишком сложен" - то да, наверное это вообще не сюда вопрос.
    Ответ написан