Intereting Posts
Echo список всех идентификаторов пользователя абонента Как добавить «data-toggle» в wp_bootstrap_navwalker? Как добавить поля ценообразования в форму гравитации? force https кроме одной страницы / сообщения WordPress, добавляющий элемент в меню, удаляет почтовые метаданные оператор switch для контента таксономии Плагин Custom Action Hook не работает Как изменить BuddyPress Mystery Man Graphic без перезаписи основного файла изображения Заказывать результаты архива по идентификатору сообщения в шаблоне пользовательской таксономии Как получить список флажков категории CPT и показать сообщение о выбранных (умнож.) Флажках через ajax? Глобальная переменная $ post возвращает неверный объект Как очистить заголовок сообщения запятыми Ошибка SQL wp_commentmeta – неправильное определение таблицы Как превратить страницу 404 в автоматический поиск с информацией из URL-адреса? Добавить размер изображения только для одной категории мультимедиа

У детей-тем автоматически загружается Перевод с родительской темы?

Достаточно ли просто создать style.css тему – скажем, технически, не добавляя ничего, кроме минимального минимального style.css чтобы иметь возможность автоматически трансформировать родительскую тему для дочерней темы?

child-theme/style.css

 /** * Theme Name: Child-Theme Child * Theme URI: http://example.com/ * Description: Child theme for the Twentytwelve theme * Author: Theme Author * Author URI: http://example.com/ * Template: twentytwelve * Version: 0.1.0 */ 

В тесте двадцать двенадцать есть стандартные языковые файлы перевода.

И если это не произойдет автоматически на моем сайте, что было бы хорошим местом для начала устранения недостающего перевода?

Достаточно ли просто создать дочернюю тему – скажем, технически, не добавляя ничего, кроме минимального минимального стиля style.css, чтобы иметь возможность автоматически трансформировать родительскую тему для дочерней темы?

В принципе, ответ НЕТ , но … есть вариант:

Добавьте mu-плагин.

Этот (MU-) плагин делает несколько вещей:

  1. Он перехватывает after_setup_theme по приоритету 20 – при условии, что родительский файл textdomain / i18n .mo загружен правильно с приоритетом по умолчанию на правильном крючке.
  2. Затем он извлекает instanceof WP_Theme – в данном случае WP_Theme тему.
  3. Затем он проверяет, действительно ли используется дочерняя тема.
  4. Если это верно, то он просто загрузит textdomain из родительского файла.

На самом деле это довольно просто, поскольку основной класс делает для нас много проверок: он извлекает другой экземпляр WP_Theme для родительской темы. Затем он проверяет, установлен ли заголовок TextDomain , используя: $current_theme->get( 'TextDomain' ); , Таким образом, в игру приходит одно соглашение : этот плагин будет работать, только если родительская тема получила Text Domain и (!) Набор заголовков Domain Path .

 <?php /** * Plugin Name: (#113391) Parent Theme i18n Autoloader * Description: Load Twenty12 Child theme translation files automagically from Parent */ add_action( 'after_setup_theme', 'wpse113391_parent_theme_i18n_autoloader', 20 ); function wpse113391_parent_theme_i18n_autoloader() { $current_theme = wp_get_theme(); if ( is_child_theme() ) $current_theme->parent()->load_textdomain(); } 

Теперь возникает проблема: Стандартные / стандартные темы Twenty *, поставляемые ядром, не имеют (!) Domain Path заголовка Domain Path . И это то, что мы должны исправить мгновенно, так как load_theme_textdomain() else ищет файл перевода не в папке «Родительская тема», но

  • сначала в папке дочерней темы: get_stylesheet_directory().WP_Theme::get( 'DomainPath' ) , что означает, что (A) должен быть установлен Domain Path к Domain Path и для него необходимо иметь префикс косой черты: / .
  • затем в папке дочерних тем: `get_stylesheet_directory (). '/ languages'.
  • и последний в WP_LANGUAGE_DIR.'/themes' .

Примечание. Я предполагаю, что это просто ошибка, которая никогда не будет исправлена ​​для «обратной совместимости», которая, другими словами, означает, что есть ошибка, но, возможно, разработчики уже работают над ней. :П

Тогда есть еще одна проблема. WP_Theme класса load_textdomain() внутренне передает $path to load_theme_textdomain() . И этот параметр $this->get_stylesheet_directory() . И этот метод возвращает $this->theme_root . '/' . $this->stylesheet $this->theme_root . '/' . $this->stylesheet $this->theme_root . '/' . $this->stylesheet . Таким образом, функция действительно будет работать неплохо , но она get_stylesheet_directory() просто вызвав внутреннюю замену для get_stylesheet_directory() (которая была бы фильтруемой). Теперь можно подумать

«Эй, класс implements ArrayAccess ! Просто установите отсутствующий массив ключей в Domain Path

Неправильно. Все свойства класса отмечены как private и недоступные.

Тогда вы можете подумать

«Почему бы просто не extend класс WP_Theme и определить метод set() чтобы мы могли вручную установить отсутствующие записи заголовков?»

Неправильно. Сам класс является final и не растяжимым.

Результат: у нас осталось то, что предлагает load_theme_textdomain() – последняя функция в цепочке вызовов. Теперь мы получили более крупный плагин, который перехватывает load_theme_textdomain() для загрузки правильного файла. Чтобы не беспокоить другие загрузки файлов i18n, он мгновенно удаляет обратный вызов из фильтра, чтобы поддерживать порядок в вашей среде.

 <?php /** * Plugin Name: (#113391) Parent Theme i18n Autoloader * Description: Load Twenty12 Child theme translation files automagically from Parent */ add_action( 'muplugins_loaded', array( 'WPSE113391Parenti18nLoader', 'getInstance' ) ); class WPSE113391Parenti18nLoader { public static $instance = null; private $theme = null; public static function getInstance() { null === self::$instance AND self::$instance = new self; return self::$instance; } public function __construct() { add_action( 'after_setup_theme', array( $this, 'i18nAutoloader' ), 20 ); } public function setTheme( $theme ) { return $this->theme = $theme; } public function getTheme() { return $this->theme; } public function i18nAutoloader() { if ( ! is_child_theme() ) return; $current_theme = wp_get_theme(); if ( '' === $current_theme->parent()->get( 'DomainPath' ) ) { $this->setTheme( $current_theme->parent() ); add_filter( 'override_load_textdomain', array( $this, 'overrideI18nLoader' ), 10, 3 ); } $current_theme->parent()->load_textdomain(); } public function overrideI18nLoader( $activate, $domain, $mofile ) { // Don't intercept anything else: Self removing remove_filter( current_filter(), __FUNCTION__ ); // Rebuild the internals of WP_Theme::get_stylesheet_directory() and load_theme_textdomain() $theme = $this->getTheme(); $path = trailingslashit( $theme->get_theme_root() ).$theme->get_template(); $locale = apply_filters( 'theme_locale', get_locale(), $domain ); load_textdomain( $domain, "{$path}/{$locale}.mo" ); // Return true to abort further attempts return true; } } 

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

Если это не работает, что-то не так. Это было в моем случае, вот как я справился с этим:

  1. Я активировал родительскую тему, чтобы увидеть, работает ли там перевод – это не так.
  2. Затем я установил плагин Debug Translations, чтобы узнать, какие языковые файлы были загружены.
  3. Затем я начал сеанс отладки Xdebug ( ?XDEBUG_SESSION_START=1 ) и проверил загрузочную позицию, о которой сообщалось, сломанной, поставив там ?XDEBUG_SESSION_START=1 останова и набрав ее.

Затем выяснилось, что WordPress ищет другое имя файла. Я скорректировал имя файла, и он сработал.

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


Дефектный:

 + wp-content +--+ themes | +--+ child-theme | | `--- style.css . . ... | `--+ twentytwelve | +--+ languages | | `--- twentytwelve-de_DE.mo <<< . ... 

За работой:

 + wp-content +--+ themes | +--+ child-theme | | `--- style.css . . ... | `--+ twentytwelve | +--+ languages | | `--- de_DE.mo <<< . ...