[英]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.