Ответы пользователя по тегу WordPress
  • Получить доступ к БД из своего класса WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ваш код выполняется ВНЕ контекста WP, поэтому global $wpdb всегда будет возвращать null - ибо в вашем текущем глобальном scope (вашего кастомного кода который никак не связан с WP) данной переменной нет. Чтобы она там появилась, вам нужно подгрузить минимально необходимую часть ядра WP:
    define( 'SHORTINIT', true );
    require( '/path/to/wp-load.php' );
    Ответ написан
    1 комментарий
  • Вывод предупреждения, что для работы собственного плагина необходимо наличие плагина стороннего. Как реализовать?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    ACF сам себя проверяет вот таким образом:
    if ( ! class_exists( 'ACF' ) ) :
        // ...
    endif;

    И это наиболее адекватный способ. А вот is_plugin_active() я бы не советовал использовать - ACF может работать как обычная PHP-библиотека, установленная с помощью того же Composer, и тогда она не будет в списке плагинов.
    Ответ написан
    7 комментариев
  • Как вывести все изображения при помощи wp_get_attachment_link?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Поле Gallery в ACF возвращает массив с данными картинок. По массиву следует проходить циклом. Примеры циклов есть в документации.

    зы: Certificates пишется через C а не S.
    Ответ написан
    Комментировать
  • Возможно ли для произвольного типа записи сделать отдельную таблицу?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Нет (*)
    2. Зачем?

    (*) - в принципе можно, но это большой кусок работы, к тому же он вполне может сломать 3rd-party функциональность.
    Ответ написан
  • Как верстать под wp?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Верстка под WP по сути укладывается всего в несколько отличий от верстки под что либо еще:

    1. В некоторых местах (body, меню, обертки страниц/записей и тд) WP генерит свой список классов. Его можно и нужно использовать, если тема предназначена на продажу или в репозиторий на .org, предполагается что ее будут крутить/развивать под свои задачи. Если для себя / для клиента, то можно не использовать, но как минимум с меню придется на бекенде несколько правок сделать.
    2. Контент, который редактируется в редакторе (старый TinyMCE или новый Gutengerg) либо лишен классов по умолчанию (тогда стучимся по классу контейнера), либо как разработчики намудрят (Gutenberg, всякие конструкторы страниц). В принципе, можно полностью под себя сделать с Gutenberg, но это дополнительные временные расходы.
    3. Статика (скрипты, стили) подключается из PHP, картинки и другие файлы - как правило тоже, через медиа-библиотеку.

    Иногда что-то по мелочи попадается, но в целом - это все.
    Ответ написан
  • Как принудительно подключить шаблон к страницам таксономии?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Уже спрашивали на Тостере миллион раз, и отвечали тоже. См. мой ответ тут - https://toster.ru/answer?answer_id=1346897
    Ответ написан
  • Какие 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
    и еще вагон и целая тежелжка плагинов, на любой вкус и кошелек.
    Ответ написан
  • 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() к примеру решает данную проблему. Думаю дальше сами разберетесь.
    Ответ написан
  • Как менять картинки в своем слайдере из админки в 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 комментарий
  • Когда и какие типы записей создавать в wordpress?

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

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

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

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

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

    - "Исполнение заказа" и "Почему верта" - обычные метаданные
    - "Реализованные проекты" - custom post type
    - Какие-нибудь "категории" или "типы" или "виды" реализованных проектов - custom taxonomy
    Ответ написан
    1 комментарий
  • 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' );
    Ответ написан
    Комментировать
  • Где получить сертификат по WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    У Upwork тоже можно пройти тест. Дают ли сертификат - хз, никогда в жизни не понимал зачем они нужны, кроме каких-нибудь энтерпрайз-инструментов, без которых в корпоративном секторе с тобой разговаривать даже не станут (SAP и все такое).
    Ответ написан
    Комментировать
  • Как в плагине carbon-fields динамично добавлять поле?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Это называется рипитер (repeater field). В Carbon Fields смотрите Complex Field и Repeating Groups.
    Ответ написан
  • Как вывести список меток в карточке товара в woocommerce?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Например, в карточке товара код выглядит вот так:

    Нормальный код, что вас в нем смущает? Переменная $product содержит в себе объект Product со всеми свойствами и методами. Это расширенный аналог объекта Post, только от WooCommerce.

    мне нужно выводить в карточке товара фразы по типу: "Нет в наличии", "Под заказ" и т. п. Ничего более умного, кроме как делать это через метки я не придумал.

    Зачем? У WooCommerce есть управления наличием товаров (Stock Management, не знаю как оно правильно в русской версии). И вся эта информация потом будет доступна в $product.

    Проблема в том, что метки тоже не выводятся. Я пытался между Артикулом и Ценой добавлять различный код, найденный в инете. Либо сайт падает с 500 ошибкой, либо ничего не меняется.

    Добавлял в functions.php код и вставлял шорткод в тоже место. Тоже не работает.

    Судя по всему вы не разработчик, поэтому оно вам так тяжело дается. Но вы совершенно не туда копаете. Советую обратиться к специалисту по WooCommerce, он решит эту задачу быстро и эффективно. Обучать вас на Тостере работе с платформой WooCommerce, основам ООП - не вариант.
    Ответ написан
    Комментировать
  • Какой плагин использовать на вордпресс для определения геолокации?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Первое что нужно понимать - геолокацию лучше всего делать на уровне сервера. У Nginx и Apache есть для этого модули, многие сервисы типа CloudFlare (если вы используете) делают геолокацию и передают данные в заголовках. В обеих случаях данные геолокации будут доступны в массиве $_SERVER. Это обеспечит максимальную производительность. Есть еще вариант на уровне модуля PHP, но имхо это полумера. Ну а если это на уровне PHP (а тем более на уровне WordPress), то скорость будет желать лучшего. Для геолокации нужно сверить IP по огромной базе данных. На уровне сервера это бинарный файл и все оптимизировано до максимума. На PHP это все runtime и крайне неэффективно.

    Впрочем, если вам все равно нужно простое и быстрое решение в виде плагина, несмотря на все недостатки - смотрите тут https://wordpress.org/plugins/tags/geolocation/.

    Есть еще вариант запрашивать сторонний API, передавая ему IP-адрес, но это вообще адски медленная муть по сравнению с серверной геолокацией.

    Дополнительно не забудьте учесть, что так или иначе данные геолокации вам будут доступны на уровне PHP. Это означает, что если вы используете плагин для кеширования страниц целиком (full page cache), то WordPress в этом случае не запускается вообще (а то и PHP не запускается - зависит от реализации механизма FPC). В этом случае придется опираться на Javascript. Для этого есть HTML Geolocation API, но он эффективен на устройствах с геолокацией и запрашивает у пользователя разрешение на доступ к данным геолокации. Более надежным (но менее производительным) будет что-то из разряда https://dev.maxmind.com/geoip/geoip2/javascript/. Ну или аналоги ищите.
    Ответ написан
    1 комментарий