Ответы пользователя по тегу WordPress
  • Как перенести стили в футер в новом WordPress 5.8?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Не надо так делать, это антипаттерн и дичайший костыль.
    Ответ написан
  • Как сделать свою проверку в Contact Form 7 перед отправкой?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    wpcf7_skip_mail - это фильтр, который контролирует отправку письма при сабмите формы. Фильтр может возвращать true (письмо не будет отправлено) или false (письмо будет отправлено). Вся остальная логика работы обработчика формы не меняется. Если именно такое поведение вам нужно - тогда работайте с ним.

    Ваша проверка не работает, потому что переменная $a находится вне области видимости функции maybe_skip_mail(). Это приводит к тому, что PHP генерирует ошибку, которая выводится в ответе и ломает формат этого самого ответа - поэтому кружочек и крутится.

    function maybe_skip_mail( $skip_mail ) 
    {
        if ( ! empty( $_POST['your_field_name'] ) ) {
    
            // Use appropriate sanitization method.
            $value = sanitize_text_field( $_POST['your_field_name'] );
    
            // Check whether this value already exists in the database.
            $result = ... // Your query here. Must return boolean.
    
            return $result;
        }
    
    	return $skip_mail;
    }
    add_filter( 'wpcf7_skip_mail', 'maybe_skip_mail' );

    Это основа, поиск номера в базе думаю сами сделаете.
    Ответ написан
    4 комментария
  • Куда логически правильно будет определить блог в wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Я поражаюсь свойству хомосапиенсов постоянно изобретать свои велосипеды там, где все уже сделано.

    1. Стандартный тип записей post это и есть блог.
    2. Если вам нужно поместить блог и все записи под префикс, допустим /blog/, тогда:
    - создаете страницу со слагом /blog/
    - в настройках чтения назначаете ее как страницу блога
    - шаблон для этой архивной страницы - home.php
    - условный тег для этой архивной странцы - is_home()
    - опционально идете в настройки постоянных ссылок и добавляете префикс /blog/ для singular ссылок
    3. Профит.
    Ответ написан
    Комментировать
  • Как получить массив товаров в корзине woocommerce?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Мне кажется вы немного термины путаете. Товары - это products. Это то что выводится в каталоге магазина. А в корзине - это order_item.

    // Получить объект корзины WC_Cart:
    WC()->cart;
    
    // Получить массив WC_Order_Item в корзине:
    WC()->cart->get_cart_contents()

    Распечатайте WC_Order_Item и увидите все что вам нужно.
    Ответ написан
    4 комментария
  • Вывести к-во комментариев оставленных автором и общее к-во комментариев к постам автора WP?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вся необходимая информация есть тут https://stackoverflow.com/questions/12426167/show-...
    Ответ написан
    Комментировать
  • Когда исполняется хук the_content в WordPress - в какой очередности?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Фильтр the_content вызывается уже после события init.

    Установите плагин Query Monitor и во вкладке Hooks & Actions (События и Фильтры) все сами увидите.
    Ответ написан
    1 комментарий
  • Таблица wp_postmeta весит более 1 гига, что делать?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вчера вечером как раз в телеграм канале задавался вопрос :)

    SELECT meta_key, meta_value, length(meta_value) 
    FROM wp_postmeta 
    ORDER BY length(meta_value) DESC
    LIMIT 10;


    - этот запрос покажет вам 10 самых тяжелых записей в этой таблице
    - изменяя LIMIT можно посмотреть больше/меньше записей
    - length(meta_value) покажет вес значения в байтах

    В итоге это позволило найти какие-то ненужные тяжелые записи в таблице и после чистки с 1+ гига уменьшилось до 300Мб.
    Ответ написан
    3 комментария
  • Как добавить языковый атрибут lang тега html?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Подсмотрите в темплейте header.php любой стандартной темы WordPress:
    <html <?php language_attributes(); ?>>
    Ответ написан
  • Как передать данные методом $_POST в WordPress или есть родные аналоги?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    WordPress прекрасно работает с $_POST.

    Сначала разберитесь что такое роутинг и ЧПУ в целом. Потом разберитесь с тем, как WordPress работает внутри, как он обрабатывает запросы. А потом разберитесь что такое хуки и как с ними работать.

    ЗЫ: В какой именно index.php вы ставите этот код? Какой к нему путь?
    Ответ написан
    5 комментариев
  • Wordpress в 2к20, ожидание vs реальность?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    На апворке на WordPress можно зарабатывать и $3000-$8000
    Ответ написан
    Комментировать
  • Вопрос по кешированию wordpress на выделенном сервере?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А как именно вы собираетесь кешировать в memcached, как его использовать? Как стандартный object cache? Fragment cache? Full page cache?

    Из всех вариантов кеширования самым быстрым будет Nginx fastcgi_cache, поскольку он будет отдавать статические HTML-страницы прямиком с диска, а то и из памяти – даже не обращаясь к PHP-процессу, не поднимая WordPress и тем более не трогая базу. Но это полная статика, а значит не подойдет если у вас необходимость показывать динамические данные на странице (авторизованные пользователи с личными кабинетами, корзины покупателей и тд).

    WP Super Cache по сути делает то же самое, но на уровне плагина - он генерирует статические HTML-страницы, и веб сервер конфигурируется чтобы отдавать их. Это тоже быстро, минусы плюс-минус те же, но как бонус есть возможность определенной настройки в админке и гибкости. Но это в экспертном режиме. Кроме него он может работать в cмешанных режимах где PHP все-таки задействован, не нужно менять конфиги сервера и при этом можно даже кешировать условно динамические страницы. Это огромное преимущество перед nginx fastcgi_cache, если сайту такая функциональность нужна.

    Нужно ли иметь одновременно и nginx fastcgi_cache и wp super cache? Нет. Выберите одно из двух. Если сайт может полностью жить в статике - nginx fastcgi_cache настроили и забыли. Если логика статики и динамики чуток посложнее - WP Super Cache.

    Независимо от первых 2х вариантов, можно использовать кеширующий бекенд (memcached, redis) для кеширования фрагментов, объектного кеша и любых других данных. Полезно для кеширования .mo файлов переводов, отрендеренных ресурсоемких фрагментов (меню, блоки/виджеты с калькуляциями и тд), стандартного объектного кеша WP и тд. Это второй, внутренний уровень кеширования и важен как раз для динамических запросов, которые не используют full page cache от Nginx / WP Super Cache.
    Ответ написан
    Комментировать
  • Не работает форма на openserver WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Обработчик по прямому файловому URL - это дичь. В WordPress для этих задач используются хуки и коллбеки на них.
    Ответ написан
    Комментировать
  • Как резолвить урл?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Посмотрите хуки template_include / template_redirect и что на них происходит. Ну и да, с помощью add_rewrite_rule или даже add_rewrite_endpoint можно создать дополнительные правила которые будут корректно отрабатываться.
    Ответ написан
    Комментировать
  • Можно ли не обновлять плагины на Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Можно ли не обновлять? Можно.
    Нужно ли обновлять? Нужно.

    Исписано на эту тему уж не знаю сколько...

    Обновления бывают нескольких типов. По semantic versioning это патчи, minor и major.

    Патчи обновлять ОБЯЗАТЕЛЬНО и КАК МОЖНО СКОРЕЕ, потому что в 99% случаев это либо security либо bug fix. От патчей ничего никогда не ломается (если только сильно-сильно не стараться строить свой код на баге в стороннем коде). Желательно обновлять их автоматически, без вашего участия вообще.

    Дальше у нас идут minor. Это как правило улучшения и небольшие дополнения. С полной обратной совместимостью. Их можно смело ставить, почитав changelog. Можно поклацать соответствующую фичу на сайте, чтобы проверить, сбросить кеши и тд. Если у вас что-то ломается от minor релизов, то в 99% у вас кривой код. Ваш код. Или какие-то дикие конфликты с другими кривыми плагинами. И то и другое - проблема, но она не из-за обновлений.

    И только major релизы подразумевают какие-то глобальные изменения (breaking changes) которые потенциально могут сломать ваш код и могут требовать вмешательства в ваш код, чтобы подогнать его к новым фичам. Если речь о конфликте с другими плагинами - надо ждать пока те обновятся. Такие обновления, естественно, не стоит ставить не думая. Сначала читаем changelog и (если есть) migration guide - чтобы понять, что изменилось и что нужно менять в своем коде. Дальше обновляем локально и/или на тестовом сервере, все проверяем. И только если мы убедились что все ок, или внесли необходимые изменения в свой код - вот только тогда обновляем на боевом сайте.

    Конечно, не все разработчики для своих плагинов используют корректную семантическую маркировку, поэтому в идеале надо всегда читать changelog, чтобы понимать что же было изменено и как это может повлиять на ваш сайт (и может ли вообще).
    Ответ написан
  • Как вывести секцию в админке wp в определенном месте?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    https://www.smashingmagazine.com/2011/10/create-ta...
    https://deliciousbrains.com/create-wordpress-plugi...
    admin-page-framework.michaeluno.jp/tutorials/04-cr...

    А вообще решений масса. Я бы советовал сначала подумать и прикинуть. Если у вас будет одна страничка и 2-3 таба, то делайте вручную. Если больше - имеет смысл использовать библиотеку/фреймворк для административный страниц, сильно упростит жизнь.
    Ответ написан
    2 комментария
  • Как в wordpress удалить домен в url меню?

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

    Например, вариант от WP_Panda абсолютно рабочий. Но меня напрягает использование get_home_url() - и в нем нет никакого смысла, если у вас не мультисайт (что чаще всего), достаточно использовать get_option( 'home' ). Эффект тот же, CPU cycles использовано - меньше.

    Дальше, мне не очень по душе перебирать длинные строки которые потенциально могут сломаться целиком, комфортнее работать с данными, до того как они собрались в HTML:
    function absolute_to_relative_url( $atts )
    {
        $atts['href'] = str_replace( get_option( 'home' ), '', $atts['href'] );
    
        return $atts;
    }
    add_filter( 'nav_menu_link_attributes', 'absolute_to_relative_url' );


    Но и здесь мой внутренний задрот все еще не будет удовлетворен, потому что у нас постоянно вызывается get_option( 'home' ) (или get_home_url()), хотя это значение не меняется. Плюс наша логика выполняется на фильтре, который запускается для каждого элемента меню - это все тоже лишние CPU cycles. Поэтому я бы сделал вот так:
    function absolute_to_relative_url( $sorted_menu_items )
    {
        $host = get_option( 'home' );
    
        foreach ( $sorted_menu_items as $item ) {
            $item->url = str_replace( $host, '', $item->url );
        }
    
        return $sorted_menu_items;
    }
    add_filter( 'wp_nav_menu_objects', 'absolute_to_relative_url' );

    Бенефиты - наш коллбек вызывается всего один раз для одного меню, адрес сайта получается один раз, простой цикл быстро перебирает объекты пунктов меню (данные).

    Этого можно не делать, можно просто отфильтровать HTML - и это будет работать, и заметной разницы в производительности не будет, если это сделано только в этом одном месте. Но важен ваш подход к написанию кода в целом. Если подходить без задротства, то в крупных и сложных проектах начнут появляться проблемы с производительностью. Решить эту задачу можно сразу "оптимальнее", по времени и количеству строк одно и то же, эффект тот же. Но в долгосрочной перспективе - как для конкретного проекта, так и для вашей карьеры в целом, больше пользы если решать задачи наиболее эффективным методом.

    ЗЫ: Задроты поймут, лентяи - нет :)
    Ответ написан
    4 комментария
  • Сделать массовый re-order (переворот порядка) WordPress-постов в кастомной таксономии (категориях)?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Ну, если вам нужна сортировка "вручную", то и делать ее придется вручную :)
    На самом деле можно сжульничать и частично автоматизировать или изменить программно, потом ручками пофиксить только то, что требует внимания.

    Для начала нужно понять как в WP делается подобная "ручная" сортировка. По умолчанию WP сортирует по дате создания, от свежих к старым. Теоретически, можно выбрать все записи составив произвольный запрос с нужной сортировкой, пройтись циклом по ним и изменить даты. Часто для произвольных типов записей дата сама по себе бессмысленна (данные не имеют возраста, как посты например) и нет ничего плохого в том, чтобы ее поменять.

    Второй вариант - использовать сортировку по menu_order ('orderby' => 'menu_order'). По умолчанию значение равно 0, можно точно так же выполнить WP_Query с нужными параметрами сортировки для текущих записей, потом пройтись по полученным записям циклом и установить нужный menu_order. Именно это значение используют плагины для drag-n-drop сортировки записей в админке.

    Ну и да, можно просто использовать нужную сортировку только в тех местах где надо - если это глобальный WP_Query, то через хук pre_get_posts, изолируя нужные условия, если это вторичный цикл - тогда просто через параметр order_by.
    Ответ написан
    Комментировать
  • Есть ли события в WPForms?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Да, поддерживает.
    Да, все это есть в документации.

    https://wpforms.com/developers/categories/actions/
    https://wpforms.com/developers/categories/filters/
    Ответ написан
    Комментировать