Php 有没有办法在WordPress中手动控制页面名?

Php 有没有办法在WordPress中手动控制页面名?,php,wordpress,url-rewriting,localization,Php,Wordpress,Url Rewriting,Localization,我正在为一个客户开发一个双语网站,提供英语和法语。我正在为内容使用qTranslate插件,它工作得很好。但是,客户机正在请求URL,URL也需要翻译成法语 在上面的示例URL中,“用户”需要在管理中使用与“用户”相同的页面。我已经支持englishdomain.com和frenchdomain.com的工作。我只需要找到一种方法,告诉WordPress在页面名为“用户”时使用“用户”页面 这个网站有很多部分,所以我想建立一个所有英语=>法语匹配的数组,然后从那里进行验证 有趣的目标。url

我正在为一个客户开发一个双语网站,提供英语和法语。我正在为内容使用qTranslate插件,它工作得很好。但是,客户机正在请求URL,URL也需要翻译成法语

在上面的示例URL中,“用户”需要在管理中使用与“用户”相同的页面。我已经支持englishdomain.com和frenchdomain.com的工作。我只需要找到一种方法,告诉WordPress在页面名为“用户”时使用“用户”页面


这个网站有很多部分,所以我想建立一个所有英语=>法语匹配的数组,然后从那里进行验证

有趣的目标。url实际上是基于页面slug创建的,它是单数的。。。因此,没有简单的方法将
/users/
/usilisateurs/
配对。或者至少不是一种土生土长的方式

你能做的最好的事情就是挂接WordPress的url重定向方法并搜索手动配置的English=>French页面段塞数组

刚开始的时候,
generate\u rewrite\u rules
可能是一个不错的动作挂钩

另一种可能是挂接到
query\u vars
过滤器中,并手动将所有法语页面替换为英语页面。然后,您的法语URL应该在WordPress数据库中查询与英语URL完全相同的页面。您只需要确保数据库中存在英语slug,否则您将遇到问题


未经测试的示例

诀窍是挂接WordPress的查询系统,并在运行时动态替换部分查询。假设从这样的数组开始(我只有一个元素,因为我不会说法语):

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

function translate_slug( $french ) {
    if( in_array( $french, array_keys( $translations ) ) {
        return $translations[$french];
    }
    return $french
}
接下来,我们连接到
query\u 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' );

这应该能让你改变现状,但正如我上面所说的,目前还没有经过测试。。。这只是一个你如何可能成功的想法。

这很棘手。你可以看看像WPML这样的插件,但我认为它们中的任何一个都不能满足你的需要

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

有一个“传递”动作可以用来做你想做的事情。您必须为每个页面定义重定向规则,但它应该做到这一点。

试试这个插件

它将qTranslate Slug translation小部件添加到编辑页面,允许您为每种语言指定单独的Slug


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

一种方法是在wp\u query设置值(pre\u get\u posts)之前捕获请求;和/或在wp_查询对象中覆盖它

这对我来说适用于globals$_请求并覆盖wp_查询参数,我不使用原始对象$wp_query->get('param')检查这一点

例如: 注意:最好的选择是将WP_查询对象传递给函数并返回它,而不是使用全局对象。 参见法典,wp_查询是通过引用传递的(http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts)


谢谢你,伊曼,我也这么想。。。。不过运气还不好。有没有可能发布一个示例?$qvars似乎传入了一个键数组,而不是值。我的错误,错误的筛选器。您希望在设置值之后但在处理查询之前挂接。看到我对上面的
filter\u french\u slugs()
所做的更改……我想差不多就在那里了。现在wordpress正在从法语重定向到英语URL。感谢您到目前为止的帮助,EAMann,上面的插件为我工作。这个插件不工作吗?谢谢,这个插件确实有效。啊,太棒了。我添加了它作为一个答案,并实际查看了它,因此我可以说一些不仅仅是URL。谢谢Eric,传递功能可以解决这个问题。如果我们不能使埃曼的解决方案起作用,我将使用它。我还需要知道En/Fr语言切换按钮的备选URL。因此,希望我们可以将其与PHP数组一起使用,并将其用于这两个方面。
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' );
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');