Подтвердить что ты не робот

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'));
4b9b3361

Ответ 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.