Как можно через add_filter перевести текст плейсхолдера в конкретном инпуте, а не во всех, где используется данная языковая переменная?
Есть плагин фильтрации FacetWP. В нем имеется текстовое поле для фильтрации между min и max параметрами. Это поле на сайте используется несколько раз. По умолчанию в нем везде указаны плейсхолдеры из языкового пакета плагина: min, max.
Хотелось бы заменить этот текст на свой, в зависимости от ситуации. В доках есть такой пример перевода:
add_filter( 'gettext', function( $translated_text, $text, $domain ) { if ( 'fwp-front' == $domain ) { if ( 'Number' == $translated_text ) { $translated_text = 'Enter a number'; } elseif ( 'Min' == $translated_text ) { $translated_text = 'Minimum'; } elseif ( 'Max' == $translated_text ) { $translated_text = 'Maximum'; } } return $translated_text; }, 10, 3 ); |
add_filter( 'gettext', function( $translated_text, $text, $domain ) { if ( 'fwp-front' == $domain ) { if ( 'Number' == $translated_text ) { $translated_text = 'Enter a number'; } elseif ( 'Min' == $translated_text ) { $translated_text = 'Minimum'; } elseif ( 'Max' == $translated_text ) { $translated_text = 'Maximum'; } } return $translated_text; }, 10, 3 );
Вот интересно, а можно ли как-то доработать этот фильтр, чтобы в идентичных инпутах внутри родителей-дивов с разным классом был разный перевод?
Дополнительно:
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Через
gettextнельзя надёжно перевести один и тот же плейсхолдер по-разному в зависимости от родительского div. Фильтрgettextработает на сервере в момент перевода строки и не знает, в каком HTML-контейнере потом окажется конкретный input. Поэтому он подходит для глобальной замены "Min" на "Минимум", но не для разных значений в одинаковых полях.Правильные варианты:
Для FacetWP часто удобно использовать JavaScript после рендера фасетов:
document.addEventListener('facetwp-loaded', function () { const priceFacet = document.querySelector('.facet-price'); if (priceFacet) { const min = priceFacet.querySelector('input[placeholder="Min"]'); const max = priceFacet.querySelector('input[placeholder="Max"]'); if (min) { min.placeholder = 'Цена от'; } if (max) { max.placeholder = 'Цена до'; } } const areaFacet = document.querySelector('.facet-area'); if (areaFacet) { const min = areaFacet.querySelector('input[placeholder="Min"]'); const max = areaFacet.querySelector('input[placeholder="Max"]'); if (min) { min.placeholder = 'Площадь от'; } if (max) { max.placeholder = 'Площадь до'; } } });document.addEventListener('facetwp-loaded', function () { const priceFacet = document.querySelector('.facet-price'); if (priceFacet) { const min = priceFacet.querySelector('input[placeholder="Min"]'); const max = priceFacet.querySelector('input[placeholder="Max"]'); if (min) { min.placeholder = 'Цена от'; } if (max) { max.placeholder = 'Цена до'; } } const areaFacet = document.querySelector('.facet-area'); if (areaFacet) { const min = areaFacet.querySelector('input[placeholder="Min"]'); const max = areaFacet.querySelector('input[placeholder="Max"]'); if (min) { min.placeholder = 'Площадь от'; } if (max) { max.placeholder = 'Площадь до'; } } });
Если всё-таки делать через PHP, условие должно быть не по родительскому div, а по контексту, который доступен на сервере: имя фасета, shortcode-атрибут, текущая страница, тип записи. Обычный
gettextтакого контекста не имеет.Глобальный gettext-фильтр оставьте только для универсального перевода:
add_filter('gettext', function ($translated, $text, $domain) { if ($domain === 'fwp-front' && $text === 'Min') { return 'От'; } return $translated; }, 10, 3);
Для разных placeholder в одинаковых input используйте JS после события
facetwp-loaded. Это устойчивее, потому что FacetWP перерисовывает фильтры после AJAX.