【问题标题】:Is there a way to manually control the pagename in WordPress?有没有办法手动控制 WordPress 中的页面名称?
【发布时间】:2020-04-16 23:29:26
【问题描述】:

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

http://englishdomain.com/users

http://frenchdomain.com/utilisateurs

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

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

【问题讨论】:

标签: php wordpress url-rewriting localization


【解决方案1】:

有趣的目标。该 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' );

这应该会为您转换,但正如我在上面所说的那样,它尚未未经测试......只是您可能会如何实现这一点的想法。

【讨论】:

  • 感谢 EAMann,我的想法是一样的……不过还没有运气。你有机会发布一个例子吗?
  • $qvars 似乎传递了一个键数组,而不是值。
  • 我的错误,错误的过滤器。您想在设置值之后但在处理查询之前挂钩。请参阅上面我对filter_french_slugs() 的更改...
  • 我想差不多了。现在 wordpress 正在从法语重定向到英语 URL。
  • 感谢您到目前为止 EAMann 的帮助,上面的插件对我有用。
【解决方案2】:

试试qTranslate slug with widget 插件。

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 感谢 Eric,直通功能可以解决这个问题。如果我们无法让 EAMann 的解决方案发挥作用,我会使用它。还有另一个要求,我需要知道 En/Fr 语言切换按钮的替代 URL。所以希望我们可以使用 PHP 数组来实现它,并将其用于两者。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      相关资源
      最近更新 更多