Как можно через add_filter перевести текст плейсхолдера в конкретном инпуте, а не во всех, где используется данная языковая переменная?

Ссылка скопирована
1 ответ

Есть плагин фильтрации 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 );

Вот интересно, а можно ли как-то доработать этот фильтр, чтобы в идентичных инпутах внутри родителей-дивов с разным классом был разный перевод?

Дополнительно:

Нужно решить такую задачу?

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

Заказать помощь
Лучший ответ
1
Backend-редакция Ответ

Через gettext нельзя надёжно перевести один и тот же плейсхолдер по-разному в зависимости от родительского div. Фильтр gettext работает на сервере в момент перевода строки и не знает, в каком HTML-контейнере потом окажется конкретный input. Поэтому он подходит для глобальной замены "Min" на "Минимум", но не для разных значений в одинаковых полях.

Правильные варианты:

  • если FacetWP даёт фильтр на HTML фасета — менять placeholder по имени фасета;
  • если нет удобного серверного фильтра — менять атрибут на фронте JavaScript-ом по родительскому классу;
  • если это разные фасеты — задавать разные настройки/labels для каждого фасета, а не переводить gettext.

Для 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);

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.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно