Как изменить строки WordPress по умолчанию?

Я хочу изменить некоторые (20-30) строк по умолчанию на WordPress back-end (не переводить).

Я знаю, что есть фильтр gettext, но я думаю, что это может привести к проблемам с производительностью, если у нас будет много строк.

Другой метод, который я пытался, – создать и использовать файл admin-en_US.po.

Какой из вышеперечисленных методов работает быстрее? Есть ли лучший способ? Что вы предлагаете без влияния на производительность?

Solutions Collecting From Web of "Как изменить строки WordPress по умолчанию?"

Кроме ответа kaiser, вы можете загружать настроенные файлы .mo, которые переопределяют исходный файл, используя фильтр load_textdomain_mofile . Например:

 add_filter( 'load_textdomain_mofile', 'cyb_filter_load_textdomain_mofile', 10, 2 ); function cyb_filter_load_textdomain_mofile( $mofile, $domain ) { if ( $domain == 'some-textdomain-to-override' ) { $mofile = WP_LANG_DIR . '/overrides/' . basename( $mofile ); } return $mofile; } 

Это может быть быстрее, но вам нужно будет проверить изменения в каждом обновлении, чтобы сохранить файл .mo, синхронизированный с оригиналом.

Да, вы можете использовать фильтр gettext . Нет, это не самый быстрый фильтр, но это верно только тогда, когда вы добавляете обратный вызов к этому фильтру в дикой природе:

Плохой пример

Это плохо, поскольку он делает сравнение строк для каждой из сотен переводимых запросов в текущем запросе:

 add_filter( 'gettext', function( $translated, $original, $domain ) { return 'foo' === $original ? 'bar' : $translated; }, 10, 3 ); 

Хороший пример

Вы можете ускорить процесс, добавив фильтр прямо перед его использованием , а затем удалите его:

Представьте себе следующий бит ядра, плагина или кода темы (пример):

 do_action( 'before' ); _e( 'foo', 'textdomain' ); 

Теперь давайте напишем обратный вызов для фильтра gettext :

 add_action( 'before', 'wpse228163GettextReplacement', 10, 3 ); function wpse228163GettextReplacement( $translated, $original, $domain ) { // Instantly remove the filter so it only runs once remove_filter( current_filter(), __FUNCTION__ ); return 'foo' === $original ? 'bar' : $translated; } 

ProTip: когда у вас есть несколько строк для замены, вы можете подключиться к последнему действию или фильтру перед первой строкой, а затем удалить обратный вызов в следующем действии или в фильтр после последней строки.

 do_action( 'before' ); _e( 'foo', 'textdomain' ); do_action( 'after' ); 

Добавить и удалить:

 add_action( 'before', function() { // Add filter add_filter( 'gettext', 'wpse228163GettextReplacement', 10, 3 ); // Remove filter when we are done add_action( 'after', function() { remove_filter( 'gettext', 'wpse228163GettextReplacement' ); } ); } ); 

После ответа kaiser я все еще чувствую желание указать, что вы вряд ли напишите PHP-код без доступа к БД, который будет влиять на производительность измеримым образом (если вы не полностью его испортите).

Теоретически вариант фильтра должен быть более эффективным, особенно в потреблении памяти (это связано с тем, что ядро ​​обрабатывает перевод не оптимизированным образом), но есть что сказать о сохранении вещей, которые на самом деле не принадлежат коду из код.