Wordpress: включить переменную языка в URL-адрес
Я разрабатываю языковой плагин для Wordpress, который работает полностью. Единственное, чего сейчас не хватает, это переписывание URL. Я смотрел на множество веб-сайтов, источники и другие вопросы о stackoverflow, но я не могу заставить мои постоянные ссылки работать.
Мне удалось добавить переменную строки запроса так:
public function append_query_string($url)
{
$args = array('lang' => $this->get_locale());
return add_query_arg($args, $url);
}
add_filter('page_link', array($this, 'append_query_string'));
add_filter('post_link', array($this, 'append_query_string'));
add_filter('the_permalink', array($this, 'append_query_string'));
Здесь, например, меняют ссылки на http://www.mylink.com?lang=en_us
. Теперь я хочу добавить модификацию, чтобы пользователь мог иметь довольно url (например, http://www.mylink.com/en/
)
Я добавил следующий фрагмент кода:
public function add_query_var($vars)
{
$vars['lang'] = $this->get_locale();
return $vars;
}
add_filter('request' , array($this, 'add_query_var'), 10, 2 );
public function custom_permastruct()
{
add_permastruct('language', '%lang%', false);
}
add_action('wp_loaded', array($this, 'custom_permastruct'));
Единственное, что мне сейчас нужно, это правило перезаписи, я полагаю, но я мог быть совершенно неправ. Любой, кто знает, какое лучшее решение для добавления этой permastruct?
ИЗМЕНИТЬ
Я пытаюсь получить эту работу в течение месяца, и я, похоже, не могу понять, что это касается постоянных ссылок, даже со всеми предыдущими ответами и моими собственными исследованиями. Поэтому, почему я снова натыкаюсь на этот пост с щедростью. Что мне нужно: у меня есть функция (get_locale), которая возвращает код языка. Этот код языка должен быть реализован в моем URL-адресе следующим образом: "http://www.mywebsite.com/LANGUAGE_HERE/..."
Я знаю, что мне нужно зарегистрировать свою собственную структуру ссылок для этого, но здесь все идет не так. Какие фильтры мне нужны и какие функции я должен использовать в своих фильтрах? Любая помощь очень ценится, потому что я становлюсь довольно отчаянным здесь.
РЕДАКТИРОВАТЬ 2
Итак, я добавил правила перезаписи, но они, похоже, тоже не работают. Я немного отчаялся здесь. В любом случае, это код для правил перезаписи:
public function add_rewrite_rules()
{
$languages = $this->get_all_languages();
foreach($languages as $language) {
add_rewrite_rule('^' . $language->code . '/([^/]*)/?$', 'index.php?lang=$matches[1]', 'top');
}
}
add_action('init', array($this, 'add_rewrite_rules'));
Ответы
Ответ 1
Правильно настроенная версия Wordpress 2.0+ перенаправит все запросы на /index.php, чтобы не требовать каких-либо обновлений htaccess, и ваша зарегистрированная perma-struct выглядит нормально. Я думаю, что все, что осталось, настройка wordpress для использования вашей структуры %lang
с использованием настраиваемой структуры, и вам должно быть хорошо идти
Ответ 2
Попробуйте использовать следующий код
function custom_rewrite_rules(){
global $langs;
//Array containing locale => pretty permalink key value pair
/*
$langs = array (
'en_us' => 'en',
)
*/
foreach($langs as $locale => $lang) {
add_rewrite_rule(
'^'.$lang.'/\/(.*)/?$',
'index.php?lang='.$locale,
'top'
);
}
}
add_action( 'init', 'custom_rewrite_rules' );
Ответ 3
У меня также были проблемы с структурами permalink. Иногда нажимайте постоянную ссылку, и вы снова сохраняете проблему. Поскольку WordPress перезаписывает htaccess
при сохранении.
Ответ 4
Хорошо, ну, вот блок кода, который достигает того, о чем вы просите.
public function init(){
$permalink_structure = get_option( 'permalink_structure' );
if( $permalink_structure != '' ){
global $wp_rewrite;
$lang = '/' . get_locale();
if ( ! got_url_rewrite() )
$prefix = '/index.php';
if ( is_multisite() && !is_subdomain_install() && is_main_site() )
$blog_prefix = '/blog';
if ( ! empty( $permalink_structure ) ) {
$permalink_structure = preg_replace(
'#/+#',
'/',
'/' . str_replace( '#', '', $permalink_structure )
);
if ( $prefix && $blog_prefix )
$permalink_structure = $prefix . preg_replace(
'#^/?index\.php#',
'',
$permalink_structure
);
else
$permalink_structure = $blog_prefix . $permalink_structure;
}
if( substr( $permalink_structure, 0, strlen($lang) ) !== $lang ){
$permalink_structure = $lang . $permalink_structure;
}
$wp_rewrite->set_permalink_structure( $permalink_structure );
}
}
Примечания:
1) Убедитесь, что вы используете функцию init
(вы можете дать функцию любому имени) в init
.
2) В папке wp-admin
найдите options-permalink.php
. Начиная с строки 75
, вы увидите некоторые интересные коды, которые составляют основу этого ответа.
3), вы также можете прочитать эту статью статьи в кодексе
Приведенный выше код не требует от пользователя ручной выбор структуры постоянной ссылки. Любая используемая структура permalink будет добавлена с помощью locale
.