繁体   English   中英

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

[英]Is there a way to manually control the pagename in WordPress?

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

http://englishdomain.com/users

http://frenchdomain.com/utilisateurs

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

这个站点有很多部分,所以我想设置一个包含所有英语 => 法语匹配的数组,然后从那里进行验证。

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

您能做的最好的事情是连接到 WordPress 的 url 重定向方法并搜索手动配置的 English=>French page slugs 数组。

就在我的脑海里, generate_rewrite_rules可能是一个很好的动作钩子,适合初学者看。

另一种可能性是连接到query_vars过滤器,并手动将任何法语页面 slug 替换为其对应的英语页面。 然后,您的法语 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' );

这应该会为你改变一切,但正如我上面所说,它尚未经过测试......只是你如何可能实现这一点的想法。

一种方法是在 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');

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

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

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

有一个“通过”动作可以用来做你想做的事。 您必须为每个页面定义重定向规则,但它应该可以解决问题。

尝试带有小部件插件的qTranslate slug

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM