Intereting Posts
Индивидуальная разбивка по страницам, одностраничная страница Программная вставка терминов не обновляет пользовательский интерфейс администрирования Taxonomy Каковы наилучшие методы включения плагинов jquery Пользовательский запрос и переписанный URL Pagination 404 Меню jQuery в меню подчеркивания Хороший крюк для проверки авторизации и перенаправления? Почему после загрузки PNG-изображений в WordPress изображения теряют насыщенность цвета? Как отменить последние изменения, сделанные Как выводить изображение с образцом, если нет установленного изображения? Удалить повторяющиеся страницы, поэтому существует только оригинал Выполнение моей постоянной структуры? Пользовательская таксономия WooCommerce как мета? Как узнать, активирован ли подключаемый модуль Список пользователей с наибольшим количеством сообщений Я хочу, чтобы edit_post_link () открывался в новом окне / вкладке (target = "_ blank")

Переключение локалей с так называемой «языковой» таксономией

Я знаю, что можно переключить языковой стандарт WP, используя URL-параметры, как описано здесь , но я пытаюсь создать метод, который будет полностью опираться на пользовательскую таксономию «Язык».

В настоящее время у меня есть простой плагин, который регистрирует таксономию языка и реализует локальный коммутатор, если имеется таксономия:

<?php add_action( 'plugins_loaded', 'wpsx_register_taxonomies' ); function wpsx_register_taxonomies() { register_taxonomy('wpsx_language', array ( 0 => 'post', 1 => 'page', ), array( 'hierarchical' => true, 'label' => 'Languages', 'singular_label' => 'Language', 'show_ui' => true, 'rewrite' => false, ) ); } function wpsx_redefine_locale($locale) { global $post; if ( taxonomy_exists( 'wpsx_language' )) { $locale = 'de_DE'; // this does work !! if ( has_term( 'fr', 'wpsx_language' )) { $locale = 'fr_FR'; // this does not work yet :( } } return $locale; } add_filter('locale','wpsx_redefine_locale',10); ?> 

Таким образом, небольшая часть, которая не работает, – это has_term() . Мое впечатление, что локальный фильтр работает на раннем этапе последовательности загрузки, когда почтовый контент еще не is_single() , и поэтому условные тесты, такие как is_single() или has_term() , ничего не вернут.

Могу ли я принудительно загружать содержимое сообщения? Могу ли я задерживать локальный фильтр?

Я не могу найти решение для этого. В списке рассылки wp-hackers было предложено запустить global $post; но это не помогло.


Обновление: после предложения david.binda, я нашел обходное решение, сбросив таксономию и используя пост-пул в качестве триггера:

 function wpsx89972_redefine_locale($locale) { $wpsx_url = $_SERVER['REQUEST_URI']; $wpsx_url_lang = substr($wpsx_url, -4); // test for the last 4 chars: if ( $wpsx_url_lang == "-fr/") { $locale = 'fr_FR'; } else if ( $wpsx_url_lang == "-en/") { $locale = 'en_US'; } else { // fallback to default $locale = 'de_DE'; } return $locale; } add_filter('locale','wpsx89972_redefine_locale',10); 

Это требует, чтобы пользователь переписывал сообщения, такие как «my-post-title-fr» для французского, «my-post-title-en» для английского и т. Д. Немного менее удобный, чем использование языковых кеш-боксов, но он сохраняет код простым и просто работает.

Итак, теперь у меня есть функциональный многоязычный плагин, всего 13 строк кода 🙂

Тем не менее, я оставлю этот вопрос открытым на пару дней, чтобы увидеть, если кто-нибудь придумает решение, которое будет использовать таксономию …

Solutions Collecting From Web of "Переключение локалей с так называемой «языковой» таксономией"

Возможно, вас заинтересует функция url_to_postid

Используется следующим образом из вашей функции wpsx_redefine_locale:

 $url = $_SERVER['REQUEST_URI']; $postid = url_to_postid( $url ); 

Обратите внимание, что это не возвращает идентификатор сообщения для пользовательских типов сообщений, но функция находится в /wp-includes/rewrite.php и при необходимости может быть расширена.

ОБНОВЛЕНИЕ : вот ваш пример:

 function my_function(){ if ( ! wp_is_post_revision( $post_id ) ){ // unhook this function so it doesn't loop infinitely remove_action('save_post', 'my_function'); // update the post, which calls save_post again $my_post_args = array(); $my_post_args['ID'] = post_id; $p = get_post( $post_id ); $lang_tax = 'my_lang_tax_name'; $language_terms = get_post_terms( $post_id, $lang_tax ); $my_post_args['post_name'] = $p->name . '_' . $language_terms[0]->slug; wp_update_post( $my_post_args ); // re-hook this function add_action('save_post', 'my_function'); } add_action('save_posts', 'my_function'); 

Что нужно сделать дальше, но это зависит от вас. Вы должны дезинформировать ситуацию, когда пользователь изменил термин таксономии языка, назначенный на должность, так что вы не получите my-post_de_en вместо my-post_en на почте, которая была до этого и имела my-post_de slug. Это потребует некоторых регулярных выражений, но вы справитесь с этим;)

Вот лучшее решение, которое ничего не изменит в вашем посте, но добавит только мета

 // Set the post language when loading up the page based on the store meta function ppl_set_post_language() { $postID = url_to_postid( $_SERVER["REQUEST_URI"] ); if ($postID > 0) { $postLanguage = esc_attr( get_post_meta( $postID, '_ppl_post_language', true ) ); if ( ! empty( $postLanguage ) ) { global $locale; $locale = $postLanguage; } } } // Any call to 'url_to_postid' earlier then 'setup_theme' will generate a fatal error. add_action('setup_theme', 'ppl_set_post_language'); 

Для получения дополнительной информации проверьте мой ответ (по моему собственному вопросу) здесь: Установите язык за сообщение

И у меня есть плагин, который делает все для вас (ссылка также в моем ответе)