有没有办法在Wordpress中手动控制页面名称?

时间:2011-01-18 20:40:21

标签: php wordpress localization url-rewriting rewrite

我正在为客户提供双语网站,英语/法语。我使用qTranslate插件的内容,这是很好的。但是,客户端要求将URL翻译成法语。

http://englishdomain.com/users

http://frenchdomain.com/utilisateurs

在上面的示例网址中,“utilisateurs”需要在管理员中使用与“用户”相同的页面。我已经支持englishdomain.com和frenchdomain.com工作......当页面名称为'utilisateurs'时,我只需要找到告诉wordpress使用'users'页面的方法。

这个网站有很多部分,所以我在考虑设置一个所有英语=>的数组。法国比赛,然后从那里验证。

任何帮助将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:1)

有趣的目标。 url实际上是基于页面slug创建的,这是单数...所以没有简单的方法/users//utilisateurs/。或者至少不是本土方式。

您可以做的最好的事情是使用WordPress的网址重定向方法并搜索手动配置的英语=>法语页面slugs数组。

就在我的脑海中,generate_rewrite_rules可能是一个很好的动作挂钩,可以为初学者留意。

另一种可能性是挂钩query_vars过滤器并手动替换任何法语页面slugs与他们的英语等价物。然后您的法语URL应该在WordPress数据库中查询与英文URL完全相同的页面。你只需要确保数据库中存在英文slug,否则你会遇到问题。


未经测试 示例

诀窍是挂钩到WordPress的查询系统并动态地替换部分查询。所以让我们说你从这样的数组开始(我只有一个因素,因为我不会说法语):

$translations = array(
    'utilisateurs' => 'users'
);

现在我们需要一个函数,它将接受一个法语字符串并返回其英语等价物:

function translate_slug( $french ) {
    if( in_array( $french, array_keys( $translations ) ) {
        return $translations[$french];
    }
    return $french
}

接下来,我们挂钩到query_vars过滤器并用所需的英语等价物替换我们的页面slug变量:

function filter_french_slugs() {
    global $wp_query;
    $wp_query->query_vars['pagename'] = translate_slug( $wp_query->query_vars['pagename'] );
    $wp_query->query_vars['name'] = translate_slug( $wp_query->query_vars['name'] );
}
add_filter( 'pre_get_posts', 'filter_french_slugs' );

这应该会为你转换一些东西,但正如我上面说的那样,未经测试到目前为止......只是想知道你如何能够解决这个问题。

答案 1 :(得分:0)

这很棘手。你可以看一下像WPML这样的插件,但我认为它们中的任何一个都不会做你想要的。

探索的一种可能性是使用Urban Giraffe的Redirection插件:

http://urbangiraffe.com/plugins/redirection/

可以使用“传递”操作来执行您想要的操作。您必须为每个页面定义重定向规则,但它应该可以解决问题。

答案 2 :(得分:0)

试用qTranslate slug with widget插件。

它在编辑页面添加了一个 qTranslate Slug翻译小部件,允许您为每种语言指定一个单独的slug。

据我所知,它仅适用于帖子和页面,不适用于分类法或自定义帖子类型。

答案 3 :(得分:0)

一种方法是在wp_query设置值(pre_get_posts)之前捕获请求;和/或在wp_query对象中覆盖它。

这适用于全局变量$ _REQUEST并覆盖wp_query参数,我不用原始对象$ wp_query-> get('param');

检查

实施例: 注意:相反使用全局对象,最好的选择是将WP_Query对象传递给函数并返回它。 参见Codex,wp_query通过引用传递(http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts)。

function filter_french_slugs(WP_Query $query) {
    // Don't forget sanitize $_REQUEST params, for safety. Eg. array_map()
    // Your request param (example post_type):
    $original_post_type = translate_slug($_REQUEST['my_localized_post_type']);
    // Or gettext
    $original_post_type = __($_REQUEST['my_localized_post_type']); // Sanitize this param

    // XXX The most important:
    $query->set('post_type', $original_post_type);

    // You can also work through an array of all query_vars

    // XXX Important
    return $query;
}
add_filter('pre_get_posts', 'filter_french_slugs');