Ответы пользователя по тегу WordPress
  • Почему the_field acf работает именно так?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Потому что плагин (ACF) пытается максимально угадать, что же вы имели в виду. Посмотрите код функции acf_get_valid_post_id( $post_id ) в файле acf/includes/api/api-helpers.php. Именно эта функция вызывается в начале get_field() (которая, в свою очередь, вызывается в the_field()).
    Ответ написан
  • Как правильно сделать ajax фильтр поcтов wordpress?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Если отвечать на это, как на вопрос (а не задание, коим по сути данный вопрос является), то ответ сводится к оператору сравнения множественных аргументов параметров meta_query и tax_query. У вас, скорее всего, используется оператор AND - что подразумевает совпадение ВСЕХ перечисленных условий. А вам нужен оператор OR или комбинация операторов.
    Ответ написан
  • Чем верстать тему Wordpress?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    1. Как вы кастомизируете свои темы для Wordpress?

    С чужими стараемся не работать вообще. Если приходится, то кастомизируем так, как это ложится в существующую тему с ее возможностями и ограничениями. ACF Pro рулит, конечно же.

    2. Используете что-то типа Unyson?

    Нет. Сам по себе Unyson - не более чем разрекламированный "фреймворк" (на самом деле нет, не фреймворк). Есть стартовая тема _s, но у любой команды / разраба с опытом достаточно быстро появляются свои наработки и свой starter kit. У нас все свое.

    3. Верстать тему ручками моветон?

    Нет. Как раз наоборот, все крупные и серьезные проекты (да, на WP такие есть) делаются только так - с нуля, ручками, без каких-то "фреймворков". Чаще всего с нормальным шаблонизатором (Timber/Twig например). Моветон - это использовать "премиум"-темы "тысяча-фич-в-одном".
    Ответ написан
  • Кто использует стартовый шаблон bedrock на wordpress?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Вот прямо по вашей же ссылке чуть ниже на странице есть раздел Guides, в котором есть: Deploying to Kinsta with Trellis. А если перейти по ссылке All Guides, то там еще есть: Atomic Deployment with Sage 9 and DeployBot. А вообще у них еще свой стек - Trellis. Собственно, deployment - его важная часть. В документации все детально описано.

    Если же их схема вам не подходит, то деплоить можно как и любой другой проект под управлением Composer. Гуглите, тут вариантов и тонкостей вагон и тележка.
    Ответ написан
  • Какой плагин кеширования в Вордпрессе лучше других?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Ох, опять эта тема :)

    Для начала могу сказать какой точно никогда, ни при каких обстоятельствах не использовать - W3 Total Cache. Это адище с большой буквы. Туда же все остальные плагины, которые пытаются быть "все-в-одном" и предоставлять 120 страниц конфигурации. В топку.

    Далее, давайте мухи отдельно и котлеты отдельно. Есть object cache - у него свои задачи. Есть fragment cache - у него свои. Есть full page cache - это отдельная кухня. Есть кеширование на уровне сервера (nginx fastcgi_cache), все тот же full page cache но "навыворот". А еще Nginx умеет разговаривать с Memcached напрямую. И даже если сравнивать решения, которые делают одно и то же (например, тот же full page cache), разница в "эффекте" на разных серверах и даже на разных сайтах на одном сервере будет. Часто - существенная. Плюс, есть кеширование на многих уровнях на самом сервере - файловая система, кеши БД и тд. И все эти настройки будут влиять на поведение плагинов кеширования. Часто - существенно. Кеширование на стороне клиента - отдельная кухня, начиная с server push, prefetch и тд, выдача поддерживаемых форматов (brotli/gzip, woff/woff2/ttf, webp/jpg/png и тому подобное).

    В общем, performance - это целый комплекс мер, решений и инструментов. Подходить к этому надо с умом и четким планом, полным пониманием всего процесса от инициации запроса клиентом и до... а нету точки Б, потому что там свои моменты.

    А еще надо понимать, что ваш медленный DNS может убить всю экономию на PHP runtime. Или криво установленный SSL-сертификат. Или кеширование SSL-сессий, некорректно настроенное под специфику трафика конкретного проекта. Или канал на выходе перегруженный. Или далеко не оптимальный конфиг пула PHP. Или вообще Apache. Или I/O wait зашкаливает.

    Грубо говоря, если вы надеетесь найти один волшебный плагин, который будете лепить сверху на каждый сайт и всегда получать супер-мега-быстрый сайт - вы не на то тратите свою энергию. А проводить сравнительные тесты нет смысла, потому что по сути их результаты могут иметь хоть какой-то смысл только когда вы подбираете под один конкретный сайт. Если вы проведете все те же тесты на другом сайте и на другом сервере - получите уже другие результаты.

    И еще. Силы надо тратить на то, чтобы динамический сайт был быстрым. То есть, без плагинов кеширования вообще. Если сайт у вас тупит, то попытка замаскировать это сверху плагином кеширования - не самое разумное решение. Временное - да, возможно. Но не решает проблему.
    Ответ написан
  • Как вы разрабатываете и поддерживаете сайты на Worpdress?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    В целом все ок, разница всегда будет в каких-то нюансах. В зависимости от типа проекта, нюансов будет больше или меньше. У нас плюс-минус так:

    - Локальная разработка на macOS + Laravel/Valet (Nginx, PHP 7+, MariaDB, Redis/Memcached).
    -Staging/production могут быть как отдельными серверами, так и находиться на одном сервере, а также могут быть много сайтов на одном сервере, или это может быть не наш сервер, а какой-нибудь Kinsta или вообще клиентская инфраструктура к которой у нас доступа нет. Поэтому devops кухня вообще отделена. С нашей стороны только автодеплой из репы через CI/CD. Ветка develop -> staging, ветка master -> production.
    - WordPress, плагины, тема, и весь кастомный код являются зависимостями проекта, управляется с помощью Composer.
    - Работа с функциональностью WordPress строится полностью на командной строке с помощью WP-CLI. При необходимости пишутся свои команды для него.
    - Вся конфигурация проекта в .env (база, ключи, лицензии и прочее, что не попадает в git) и в папочке config в виде PHP-конфигураций (все что уже влияет на функциональность).
    - Медиа-файлы на локалке либо вообще не хранятся (Valet проксирует запросы на staging/production), либо синхронизируются со staging/production. Делается это с помощью отдельного cli-скрипта, который под капотом использует rsync.
    - Базы данных - отдельная история которая очень сильно зависит от специфики проекта. Где-то это простой push/pull с помощью WP Migrate DB, где-то тот же push/pull c помощью WP-CLI, где-то это целые миграции. В идеале надо стараться контент забирать с прода на стейдж и избегать публикации с dev/staging на продакшн. Но ситуации и проекты бывают разные, здесь нет одного правильного ответа.
    Ответ написан
  • Как вывести миниатюры последних страниц (не записей!) в сайдбаре Wordpress кодом php?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Берите код, который для записей, только там где 'post_type' = > 'post' меняйте на 'post_type' => 'page'.
    Ответ написан
  • Сортировка по кастомному полю WordPress?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    1. У WP_Query нет и никогда не было аргумента 'hide_empty'. Этот аргумент у таксономий встречается, в WP_Term_Query. Соответственно, его значения true или false никакого эффекта не дадут, он игнорируется. Уберите его.
    2. 'meta_key' => 'sort' инструктирует WP_Query в первую очередь выбрать записи, у которых данное мета-поле есть.
    Сортировка происходит (условно) после выборки, сортируются те результаты, которые соответствуют условиям выборки, в данном случае это записи у которых мета-поле sort существует.
    3. Попробуйте вот так:
    $args = [
    	'meta_query' => [
    		'relation' => 'AND',
    		'meta_exists_clause' => [
    			'key'     => 'sort',
    			'compare' => 'EXISTS',
    		],
    		'meta_value_clause' => [
    			'key'  => 'sort',
    			'type' => 'numeric',
    		],
    	],
    	'orderby' => [
    		'meta_exists_clause' => 'ASC',
    		'meta_value_clause'  => 'DESC',
    	],
    ];
    Ответ написан
  • Как написать консольный php скрипт для wordpress?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Включение wp-load.php в принципе и есть способом подключения WP. Но в случае с командной строкой есть нюансы - надо конечно смотреть ваши фаталы (поделитесь инфой из error.log), высока вероятность того, что он ругается на отсутствие некоторых переменных окружения - элементов массива $_SERVER например.

    Если вам нужно полноценно работать в CLI - используйте WP-CLI, пишите свои пакеты под него. Если какие-то простые задачи - вешайте через WP Cron API.
    Ответ написан
  • Как в WP разрешить чтение постов с другим статусом?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Плагин не плагин, а регистрируется post_status в конечном итоге с помощью функции register_post_status. Как и многие другие функции WP, она принимает ряд аргументов, в том числе такие:

    public
    (bool) (optional) Whether posts of this status should be shown in the front end of the site.
    Default: false

    internal
    (bool) (optional) Whether the status is for internal use only.
    Default: false

    private
    (bool) (optional) Whether the posts of this status should be accessible by their urls.
    Default: false


    Эти аргументы определяют, будет ли доступен данный статус на фронтенде и будут ли генерироваться ЧПУ. Скорее всего плагин конфигурирует их как приватные, поэтому они недоступны. Есть 3 варианта (возможных):

    1. В самом плагине есть возможность перенастроить эти свойства под себя.
    2. Плагин предоставляет фильтр, с помощью которого можно изменить эти аргументы.
    3. Менять эти аргументы напрямую в определении статусов, через глобальный доступ (фильтрами тут WordPress, увы, не радует):

    function make_archived_status_public()
    {
    	global $wp_post_statuses;
    
    	// Меняем public на true
    	$wp_post_statuses['archived']->public = true;
    
    	// Повторяем для других аргументов, если нужно
    	// ...
    }
    add_action( 'init', 'make_archived_status_public' );
    Ответ написан
  • Почему не работают функции WP?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    А как вы вызываете шаблон/страницу? По какому УРЛ открываете? Потому что у вас PHP ругается на первую же вордпрессовскую функцию в коде. Любую, которая попадается первой. Это говорит о том, что именно вордпрессовские функции не загружены, то есть вы исполняете файл темлпейта вне окружения WordPress. А это, вероятнее всего, потому что вы что-то делаете не так.
    Ответ написан
  • Как вывести все дочерние страницы определенной страницы wordpress?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Оденьте трусы или снимите крестик.

    Вы или начните читать документацию WordPress, разберитесь с тем, что такое WP_Query, Custom Post Types, Custom Taxonomies, Rewrite Rules, $query_vars, как WordPress обрабатывает запрос от начала до конца и тд, либо выбросьте WordPress и начните пилить так, как вам привычнее и удобнее - чистым PHP без каких-либо CMS (или на базе знакомого фреймворка). Потому что то, что вы пытаетесь сделать, это какой-то сюр. Перед тем, как садиться за столь нетривиальную задачу как создание региональной структуры на базе WP, необходимо начать с простого и понять как этот самый WP работает внутри. Не наоборот.
    Ответ написан
  • Как отобразить сумму значений из мета полей постов со статусом 'private'?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Внимательно читаем документацию:

    post_status (string / array) - use post status. Retrieves posts by Post Status. Default value is 'publish', but if the user is logged in, 'private' is added. Public custom statuses are also included by default. And if the query is run in an admin context (administration area or AJAX call), protected statuses are added too. By default protected statuses are 'future', 'draft' and 'pending'.


    То есть, значения по умолчанию вам не подходят и необходимо явно указать необходимые статусы. Минимум:

    $args = [
        'post_status' => [ 'publish', 'private' ],
    ];


    Или совсем явно:

    $args = [
        'post_status' => 'any',
    ];


    ЗЫ: И не делайте 'posts_per_page' => -1,, это плохая практика. Укажите пусть большое (с запасом), но конкретное число. Например 100, 500, 1000.
    Ответ написан
  • WordPress - Как в админ панели, в списке постов выделить цветом посты определенной категории?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    +1 к ответу yarovikov
    Вот пример вывода html одной строки таблицы:
    <tr id="post-25868" class="iedit author-other level-0 post-25868 type-post status-publish format-standard has-post-thumbnail hentry category-podrostkovye-strizhki category-strizhki">
    ...
    </tr>

    Категории добавляются в виде классов category-{term_name}. Соответственно, их можно спокойно стилизовать через CSS. Если же нужно цвета в админке настраивать - используйте метаданные терминов и храните в termmeta значение цвета для каждой категории. Потом на хуке admin_head берите оттуда все цвета и генерируйте стили.
    Ответ написан
  • Как подключить svg sprite на wordpress?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    ПУТИ К ФАЙЛАМ.
    Проверяйте, какие пути ваш препроцессор генерит. И потом сравнивайте с теми, которые получаются в итоге относительно папки темы.
    Ответ написан
  • Не отображаются фоновые иконки на псевдоэлементах?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Вам же прямым текстом говорят - 404, файл не найден. То есть, проблема в путях. В инструментах разработчика посмотрите, какой полный URL получился у этих картинок, и соотнесите его с тем, который должен быть. Потом подкорректируйте в CSS путь.

    ЗЫ: Относительный путь (../ и тд) будет считаться от места, где находится итоговый CSS-файл c вашими стилями. Если это главный файл стилей темы, то он будет в корне папки темы, и с помощью ../ вы выходите из папки темы вообще. Возможно дело в этом.
    Ответ написан
  • Как использовать post__not_in при подгрузке постов ajax'ом?

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

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Вы неправильно понимаете суть плагинов в WordPress. Воспринимаете это как что-то плохое, или сложное, или тяжелое, или как-то еще. Все на самом деле просто:

    1. WordPress в процессе выполнения подключает кучу файлов - и своих, из ядра, и пользовательских.

    2. Любой пользовательский код, где бы он ни находился - в mu-плагине, в обычном плагине, в шаблонах темы, в functions.php или в файле, который подгружается с помощью autoload вообще из другой папки при использовании Composer - абсолютно любой пользовательский файл подключается и выполняется идентично и одинаково. Для PHP и для WordPress это просто код, который надо выполнить.

    3. Разница между тем, куда помещать свой пользовательский код только в удобстве и очередности подключения и исполнения этого кода, а также обновления и прочие плюшки. Исходя из этого:

    - mu-плагин обычно 1 php-файл, его нельзя отключить в админке, выполняется из пользовательского кода условно первым. Не использует систему обновлений плагинов, поэтому изменения надо заливать вручную. Выполняется до pluggable функций WP, то есть может их переопределять. Используется для разных задач, когда конкретный пользовательский код нужно выполнить ДО обычных плагинов, когда он критичен для работы проекта и его нельзя отключать и тд. При смене темы сайта функциональность из mu-плагина остается.

    - обычный плагин - может быть как простым (1 файл), так и любой сложности. Выполняется после mu-плагинов, перед pluggable. Используется для всего остального. Можно выключить из админки, обновить (с WP.org, сайта разработчика и даже со своего репозитория), при смене темы сайта остается.

    - functions.php активной темы. Загружается после обеих типов плагинов, сразу перед срабатыванием хука init. При смене темы, разумеется, любая функциональность которая определена в этой файле будет утеряна. Обновляется вместе с темой. Еще стоит помнить про то, что их может быть 2 - родительской темы и дочерней.

    Еще важно - в теме принято держать только то, что касается вывода и отображения информации на фронте сайта. Тема - это про внешний вид, дизайн и оформление. Функциональность должна быть в плагинах.

    Для WordPress в целом абсолютно все равно, где будет ваш код. И да, ваша функция / класс будет идентично работать (и по производительности в том числе), не важно где она будет - в functions.php или в плагине. Это будет все та же функция или класс, только в случае с плагином в голове документа будет блок с комментарием, который и определяет, что это плагин. Все. Больше никакой разницы.
    Ответ написан
  • Почему worpress добавляет перед каждым символом (') или ("). (\) В методе get и post?

    HeadOnFire
    @HeadOnFire
    WordPress Evangelist
    Потому что безопасность. Читаем документацию PHP-функции addslashes() и возвращаемся к основам, учить матчасть.
    Ответ написан