• Как решить правильно простенькую задачку по 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 комментариев
  • Что такое Cardinality и зачем оно нужно?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Cardinality характеризует уникальность данных. Высокая кардинальность - уникальные данные, низкая кардинальность - повторяющиеся данные. Например, в таблице customers имеем колонки:
    • gender - высокоповторяющиеся данные, низкая кардинальность
    • city - данные повторяются, но уже не так часто - нормальная кардинальность
    • phone - данные уникальны, высокая кардинальность


    Как кардинальность может слететь - впервые слышу. Это характеристика данных по их уникальности, а не индекс какой-нибудь. Она не слетает.

    Впрочем, иногда под кардинальностью (скорее ошибочно) подразумевают кардинальные отношения между таблицами (1:1, 1:n, n:n). В данном случае тогда речь может идти о слетевших связях (foreign keys слетевшие в результате некорректного импорта с переопределением autoincrements).
    Ответ написан
    2 комментария
  • Как принудительно подключить шаблон к страницам таксономии?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Уже спрашивали на Тостере миллион раз, и отвечали тоже. См. мой ответ тут - https://toster.ru/answer?answer_id=1346897
    Ответ написан
  • Как правильно сделать структуру репозитория на GitHub?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    На GitHub еще есть организации и проекты. А у BitBucket вообще все по красоте - под Instagram проект, в нем все репозитории.
    Ответ написан
    Комментировать
  • Какие best practice разработки с WordPress для новичка?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Во-первых, прекратите спамить всех подряд, такой подход не очень продуктивен.

    Во-вторых, у вас не вопрос. Вопрос - это как правило одна (иди хотя бы одна главная) проблема, которую можно решить одним ответом. Как правило не очень объемным, потому что S из SOLID, как мы знаем, это Single Responsibility Principle. Ваш вопрос его нарушает чуть более чем полностью. Из этого следует, что вам нужно разбить ваш вопрос на множество других. И задавать их желательно по порядку, получая ответы, применяя их в жизни, практикуясь, и только потом переходя далее. Ибо влить в мозг весь этот объем информации за раз можно только в фильме "Матрица", а мы, увы, не там.

    Тезисно пройдусь по пунктам, чтобы прояснить ситуацию.

    Хочу изучить новые инструменты и вообще понять что есть best practice в мире wp сейчас!

    Не существует единой best practice. Есть разные подходы, каждый из них имеет плюсы, минусы и право на жизнь. Все очень сильно зависит от команды, ее размера и опыта, компании и процессов, клиента, проекта, его размера и бюджета и тд. Ну а общие принципы мало отличаются от разработки в целом, будь то Symfony, Laravel, Ruby on Rails и тд.

    Я нашел много интересного, но пока не понимаю как это всё собрать воедино, что зачем нужно, много непонимания

    Это нормально. Почему - перечитайте абзац про Single Responsibility Principle выше.

    1. среду разработки использую PhpStorm, по университетской лицензии.

    Несущественно. PhpStorm отличная IDE, пожалуй лучшая для разработки на PHP в целом, WP или нет - не важно (сам использую именно ее). Но далеко не все могут использовать ее бесплатно по университетской лицензии, многие покупать не хотят, многим не нравится производительность. Стандарт ли это? Для кого как.

    2. для версий кода использую Git, храню локально и на Gitlab.

    Git - это наиболее популярная VCS на данный момент. Само использование системы контроля версий является стандартом, во всем мире разработки.

    3. при разработке пушу через SSH сразу на shared хостинг, а не на локальный сервер (никогда локальным не пользовался, а надо? каким?)

    Использование локального сервера - стандарт. Обязательно, не обсуждается. Пушить на shared - плохая практика (и пушить на прод, и shared). Изучаем про локальные сервера, Continuous Integration и Continuous Delivery. Впрочем, для WP важно понимать, что бОльшая часть проектов будет простая и небольшая, со скромным бюджетом, а там вся эта кухня может быть лишней (смотрим абзац про зависимость best practices от проекта и тд). Поэтому обычного простого деплоя по мерджу в мастер хватит. Гугл в помощь.

    4. работаю под Linux, знаком с консолью, bash, но не понимаю как использовать wp-cli, в чем он удобен?

    WP-CLI это инструмент. Использовать его - хорошо. Чем удобен / полезен поймете когда разберетесь с деплоями, автоматизацией и тд. Но не поймете если не начнете заставлять себя с ним работать.

    5. присматриваюсь к Roots и Bedrock, но не понимаю как к ним подступиться, нужно объяснение что и зачем делать, какие-то инструкции..

    Рано. Очень рано вам к ним присматриваться.

    6. хочу начать использовать composer

    Начинайте. Гуглите, материалы на эту тему есть. Будут конкретные вопросы - задавайте, будем отвечать.

    7. хочу начать писать тесты, PHPUnit?

    Если бы спрашивали за Laravel, то да. Но по WP - забудьте. Думать про тесты в WP вам рано и не нужно. Голову сломаете. Да и проекты, где это понадобится вам пока не светят.

    Сейчас как-то грустно, что wp любят поносить за его "легкий вход", "говнокод", "это не программирование" и т.д.

    Это не только сейчас и не только про WP. Добро пожаловать в прекрасный мир разработки, где каждый второй с радостью обосрёт инструмент, о котором мало что знает или потому что ему лично он не подходит / не нравится. Вырабатывайте свое личное мнение. WP сам по себе лишь инструмент. Хороший или плохой - не важно. Он решает определенные задачи, и делает это лучше / быстрее / дешевле / проще других.

    Как всё это собрать вместе?

    Постепенно. Шаг за шагом. Слона нужно есть по частям, иначе подавитесь.

    Прошу подробных ответов, по возможности со ссылками и/или инструкциями.

    Это придется накатать книгу, и не одну.

    Хочу учиться.

    Достойное желание. Учитесь, никто не мешает. Гугл, кодекс, кама и другие ресурсы в помощь.

    Бонус: запомните одну простую истину - вы не сможете что-то изучить или освоить, если не начнете с ним работать. Только на реальной практике можно понять и осознать. Можно прочитать 10 лучших книг про ООП (для примера), но пока вы не напишете, выбросите, перепишете несколько раз свой код на ООП, вы его не поймете.
    Ответ написан
    Комментировать
  • Как добавить локализацию?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Polylang
    WPML
    MultilingualPress
    qTranslateX
    и еще вагон и целая тежелжка плагинов, на любой вкус и кошелек.
    Ответ написан
  • Как смириться с тем, что нельзя убирать плохой код на проекте?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Сделать презентацию для бизнес-руководства, нарисовать в начале большую страшную проблему и графики роста стоимости поддержки и обслуживания, падения конверсии и тд. Дальше слайды с перечислением пользы рефакторинга. Например - внедрение новых фич сократится по времени и себестоимости на X и Y, изменения существующих фич - на 5X и 5Y. Себестоимость поддержки и развития проекта понизится в X раз, себестоимость тестирования снизится на Y. Нагрузка и расходы на сервера снизятся на X, скорость загрузки страниц увеличится на Y, показатели Bounce Rate снизятся до Z, конверсия вырастет минимум на X и тд и тп. Хорошо, если презентацию вместе с бизнесом будет смотреть маркетинг - для них такие штуки важны тоже. Бизнес понимает конкретные цифры, говнокод как философский концепт - не понимает.

    Ну и главное - презентация должна содержать конкретное предложение. Что-то типа "на рефакторинг понадобится Min-Max часов, но чтобы не останавливать работу, мы его делаем параллельно на 3м приоритете после баг/секюрити фиксов и критических новых фич, выделяя на это X часов в неделю."

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

    зы: это конечно все слегка преувеличено для наглядности, но суть думаю понятна.
    Ответ написан
  • WP получить acf поля из бд?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Выполнять отдельный SQL-запрос в каждой итерации цикла - не очень разумно и плохо для производительности. Давайте для начала получим количество элементов в рипитере:
    SELECT meta_value FROM wp_postmeta WHERE post_id=83 && meta_key='recipients'

    Результат:
    array:1 [
      0 => [
    	  'meta_value' => '3'
      ]
    ]

    Далее, сформируем на уровне PHP массив валидных ключей:
    $total = (int) $results[0]['meta_value']; // Значение в базе в string
    $keys = [];
    
    for ( $i = 0; $i < $total; $i ++ ) {
    	$keys[] = "recipients_{$i}_email";
    }
    
    dump( $keys );

    Результат:
    array:3 [
      0 => "recipients_0_email"
      1 => "recipients_1_email"
      2 => "recipients_2_email"
    ]

    А теперь можно одним запросом получить все значения для этих полей указав их в WHERE meta_key IN (). Получается у нас что-то типа такого:
    $keys = implode(',', $keys); // собираем строку для IN
    $query = "SELECT * FROM wp_postmeta WHERE post_id=83 AND meta_key IN ({$keys})";

    Единственное, что PHP склеит массив в строку без кавычек, а для IN нужно чтобы значения были в кавычках. Конкретно этот запрос ошибку выдаст. Не знаю, как у вас реализовано выполнение запросов, но PDO::quote() к примеру решает данную проблему. Думаю дальше сами разберетесь.
    Ответ написан
  • Как правильно написать формулу для вывода элементов на экран?

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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Везде пишут про специальные плагины для WP. Но можно ли обойтись без них?

    Можно и даже нужно.

    Ready-made плагины слайдеров для WP - адский треш и угар. Там обычно целый Adobe Premier и Adobe AfterEffects в админке, позволяющий настраивать эффекты переходов между слайдами, длительность (и даже кривую Bezier) анимаций и тд. Разумному человеку эта ересь конечно же не нужна.

    Для вывода загруженных картинок в свой слайдер вам всего лишь нужно получить нужные аттачменты (post type) с помощью запроса WP_Query. Как организовать механизм загрузки картинок в админке именно в нужном вам месте (Customizer, страница настроек, страница редактирования front page и тд) - зависит от того где вам это надо, но наиболее простой и удобный способ - воспользоваться плагином ACF (или аналогом).
    Ответ написан
    2 комментария
  • Как вывести медиафайлы по таксономии?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Создали таксономию вы правильно, все ок.

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

    2. Что касается вывода на странице - все просто. Картинки это post type 'attachment'. Таксономия ваша - это обычная таксономия вашего post type. Соответственно, вы можете спокойно создавать кастомный запрос WP_Query для post_type attachment, и в нем подзапрос - tax_query по вашей таксономии category_image. Подробнее в документации.
    Ответ написан
  • Ребят, откуда беруться эти класы?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Функция get_header() подключает шаблон header.php.
    2. В шаблоне header.php в теге body стоит вызов функции body_class().
    3. Функция body_class() строить атрибут class="" для тега body, собирая в строку определенное количество классов, в зависимости от страницы/шаблона, авторизован ли пользователь и тд, которые она получает функцией get_body_class().
    4. Функция get_body_class() получает массив предустановленных динамических классов, в зависимости от ряда условий - поддержка RTL, на какой странице (типе страницы) находимся, какой шаблон используется, авторизован ли пользователь и еще целый ряд других.
    5. Перед возвратом этого массива классов в функции стоит хук-фильтр body_class, подключившись к которому данный список можно изменить под свои нужды.

    Все это элементарно узнать одним из следущих способов:

    1. По очереди посмотреть документацию всех этих функций.
    2. Поискать эти функции в коде WordPress.
    3. Начать наконец использовать нормальный IDE (например PhpStorm) и перестать теряться с 3х соснах. Просто Ctrl/Cmd + Click на функции и переходим к ней. Дальше клацаем в ней и тд. Пару кликов - и все становится предельно понятно.
    Ответ написан
    1 комментарий
  • Почему такая ошибка "Your requirements could not be resolved to an installable set of packages."?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Конфликт версий зависимостей, между собой. Удалите composer.lock и установите (или укажите вручную в composer.json) совместимые версии согласно рекомендациям (весь лог не читал и не вникал, но по ходу doctrine/doctrine-orm-module просит более старую версию zendframework/zend-hydrator).
    Ответ написан
    Комментировать
  • Как создать время в bash терминале?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Я б отсюда начал: https://stackoverflow.com/a/27442175/1185107
    Ответ написан
    Комментировать
  • Когда и какие типы записей создавать в wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если у сущности должен быть свой автономный URI, нужно иметь возможность запрашивать пачками по критериям, сущность минимум требует даты, названия/слага, статуса и возможности эти сущности группировать - тогда Custom Post Type.

    Taxonomy - это свойство другой сущности, по которому нужно группировать, сортировать и выбирать сущности. Запросы по таксономиям (рубрики, метки, термины кастомных таксономий) быстрые и удобные, в том числе со своими уникальными URI и параметрами.

    Метаданные (post_meta) это просто дополнительная информация, по которой желательно ничего не группировать, не фильтровать и не сортировать без очень острой на то необходимости (а даже если она возникла, лучше трижды подумать). Просто любая дополнительная инфа в свободном формате. Основное предназначение - вывод на экран при просмотре конкретной сущности, которой эти метаданные принадлежат. Своего URI у таких данных нет.

    Собственно, не считая пользователей и комментариев, это все что вам доступно в WordPress из коробки.

    По конкретным блокам по ссылке:

    - "Исполнение заказа" и "Почему верта" - обычные метаданные
    - "Реализованные проекты" - custom post type
    - Какие-нибудь "категории" или "типы" или "виды" реализованных проектов - custom taxonomy
    Ответ написан
    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 комментария
  • Что делать когда лагает MBA 2018 8gb?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Да, Google Chrome, Google Mail (независимо от браузера) и еще много сервисов Google (Firebase, Tagmanager и тд) жрут память как не в себя. У меня 16GB, но я все равно пользуюсь Safari. Gmail терплю в нем, ибо почтовые клиенты не люблю, не приживаются они у меня.
    Ответ написан
    4 комментария
  • Wordpress: почему не работает адаптивная верстка с кэшированием?

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

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А где вы этот код выполняете?

    Вообще единственный быстрый и адекватный способ это сделать - именно поиск-замена в базе данных. Можно не делать прямо в самой базе запросом, а воспользоваться WP-CLI и ее командой wp search-replace.

    Синтаксис приведенной вами команды вроде в порядке:

    UPDATE table_name
    SET column_name=REPLACE( column_name, 'text_to_find', 'replace_with_this' );
    Ответ написан
    Комментировать