Как сделать так, чтобы постоянные ссылки Wordpress игнорировали пользовательскую перезапись URL - PullRequest
5 голосов
/ 15 марта 2012

В настоящее время я работаю над сайтом WordPress, который должен иметь возможность предлагаться на французском языке.я нашел способ заставить тему работать с файлами fr_FR po и mo, когда я добавляю переменную строки запроса l.т. е.

site.tld создаст сайт на английском языке vanilla, а site.tld/?l=fr активирует следующий код в моем functions.php для обслуживания французского перевода:

<?php
// http://codex.wordpress.org/Plugin_API/Filter_Reference/locale
add_filter( 'locale', 'set_my_locale' );
function set_my_locale( $lang ) {
    if ("fr" == substr(strtolower(trim(strip_tags(stripslashes($_GET['l'])))), 0, 2)) {
        // set language to french
        return "fr_FR";
    } else {
        // return original locale
        return $lang;
    }
}
?>

эта настройка ужеза работой.у меня вопрос: как мне переписать URL, чтобы вместо site.tld/?l=fr я мог просто предварять структуру папок с fr то есть site.tld/fr/?

, например, если есть страница site.tld/portoflio/autumn/ на английском,site.tld/fr/portfolio/autumn/ выплюнет французского.Я получил эту идею с веб-сайта Apple, где язык всегда добавляется к структуре папок.

Я уже могу сделать это с помощью внешнего перенаправления в htaccess:

RewriteBase /
RewriteCond ^[a-z]{2}/
RewriteRule ^([a-z]{2})/(.*)$ /$2?l=$1 [R,L]

это работает, но как только я убираю флаг R, он обслуживает переведенный на французский язык 404, который не найден.Я предполагаю, что я испортил правила переписывания WordPress, потому что мне нужно использовать красивые постоянные ссылки.сейчас я настроен на использование Month and name (/%year%/%monthnum%/%postname%/) в общих параметрах администратора.

мой вопрос: как заставить wordpress игнорировать часть /fr/ и по-прежнему отображать правильную страницу /post / etc?

это вообще возможно?я на правильном пути здесь?Мне нужна ваша помощь, особенно в том, что мудро, а не только в том, что хорошо.я попробовал это http://pmg.co/a-mostly-complete-guide-to-the-wordpress-rewrite-api но ради жизни я не могу заставить это работать.: /


ОБНОВЛЕНИЕ : хорошо, так что вот некоторый прогресс с @relu ниже:

я убедился, что мои правила были собраны с .htaccess

Затем я добавил правила из @relu, но следующим образом, потому что Relu всегда отправлял меня на один и тот же адрес без /fr:

<?
    // http://pmg.co/custom-wordpress-shortlinks
    add_action( 'init', 'pmgtut_add_rewrites' );
    function pmgtut_add_rewrites() {
        add_rewrite_rule( '^([a-z]{2})/?$', 'index.php?l=$matches[1]', 'top' );
        add_rewrite_rule( '^([a-z]{2})/(.*)$', 'index.php?l=$matches[1]&q=$matches[2]', 'top' );
    }
    add_filter( 'query_vars', 'pmgtut_query_vars', 10, 1 );
    function pmgtut_query_vars( $vars ) {
        $vars[] = 'l';
        return $vars;
    }
?>

, теперь /fr остается вадресная строка, так что это хорошо, но две проблемы сохраняются:

  1. WordPress обслуживает меня главная страница указателя.кажется, что он не использует часть правила &q=$matches[2]

  2. языковой стандарт по-прежнему не установлен должным образом.я проверил, получает ли переменная l корма, поэтому я добавил echo 'l: $l'; после $l = get_query_var('l'); и, что интересно, я получил два эха: один l: и другой l: fr сразу после этого.фильтр locale запускается дважды?Кажется, что в первый раз он не видит значение queryvar, а затем, кажется, во второй раз он выводит l: с fr уже там .. в конце дня локаль все еще не показываетне меняйся.

ааааа помощьэтот плагин qtranslate.делает то, что мне нужноспасибо, особенно за грандиозное усилие @ relu и оставайся в силе.

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

Добавьте это в ваши functions.php

add_filter( 'rewrite_rules_array','my_insert_rewrite_rules' );
add_filter( 'query_vars','my_insert_query_vars' );
add_action( 'wp_loaded','my_flush_rules' );

// flush_rules() if our rules are not yet included
function my_flush_rules(){
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['^([a-z]{2})/(.*)$'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

// Adding a new rule
function my_insert_rewrite_rules( $rules )
{
    $newrules = array();
    $newrules['^([a-z]{2})/(.*)$'] = 'index.php?l=$matches[1]&q=$matches[2]';
    return $newrules + $rules;
}

// Adding the l var so that WP recognizes it
function my_insert_query_vars( $vars )
{
    array_push($vars, 'l');
    return $vars;
}

Не проверял это, может потребоваться некоторая настройка, но это способ сделать это.

Я в основном адаптировал найденную версию здесь .

Он также регистрирует запрос " l ", чтобы вы могли получить его значение, вызвав: get_query_var

add_filter( 'locale', 'set_my_locale' );
function set_my_locale( $lang ) {
    $l = get_query_var('l');

    if ("fr" == $l) {
        // set language to french
        return "fr_FR";
    } else {
        // return original locale
        return $lang;
    }
}

UDATE: Игнорировать вышесказанное!


Снимите фильтр my_insert_query_vars() и замените его на:

function register_rewrite_tag() {
        add_rewrite_tag('%l%', '([a-z]{2})');
}
add_action('init', 'register_rewrite_tag'); 

Вот также обновленные рерайты для страниц и постов, я посмотрел на WordPress '1026 * и адаптировал их под этот особый случай:

function pmgtut_add_rewrites() {
        add_rewrite_rule( '^([a-z]{2})/?$', 'index.php?l=$matches[1]', 'top' );
        add_rewrite_rule( '^([a-z]{2})/(.?.+?)(/[0-9]+)?/?$', 'index.php?l=$matches[1]&pagename=$matches[2]&page=$matches[3]', 'top' ); // Pages
        add_rewrite_rule( '^([a-z]{2})/([^/]+)(/[0-9]+)?/?$', 'index.php?l=$matches[1]&name=$matches[2]&page=$matches[3]', 'top' ); // Posts
}
0 голосов
/ 27 июня 2012

возможно не по теме, но вот еще одно правило переписывания для языков формы; en_us / или jp /

add_rewrite_rule( '^([a-z]{2}_[A-Z]{2}|^[a-z]{2})/?$', 'index.php?l=$matches[1]', 'top' );
...