同一帖子的多个固定链接

时间:2013-12-12 作者:Roscius

我希望能够为相同的基础帖子提供多个永久链接(出于i18n的原因)-例如

http://www.example.com/my-custom-post-type/this-is-a-cool-article
http://www.example.com/mon-type-de-poste-personnalise/cest-un-article-sympa
都指向同一个帖子页面。内置的WP i18n函数将处理帖子页面本身的语言切换。我更关心的是搜索引擎优化和最终用户美学的URL显示。

我不能使用301重定向,因为我不想更改浏览器URL。我知道如何将自定义的post-type-slug国际化,但不了解实际的post-slug。

我想我可以在post-meta字段中保存第二个post-slug,但我必须在路由中的某个位置进行挂钩才能启用它-我还没有找到正确的挂钩位置?有没有一个地方可以解决这个问题,或者有更简单的方法来解决这个问题?

1 个回复
SO网友:David

请求解析在中处理WP::parse_request(). 在那之后,有一个动作钩parse_request 这将为您提供wp 对象

我们假设http://www.example.com/my-custom-post-type/this-is-a-cool-article 是你的永久链接和http://www.example.com/mon-type-de-poste-personnalise/cest-un-article-sympa 最后是404。因此,首先要检查回调,如果wp 对象处于错误/404状态:

if ( ! empty( $wp->query_vars[ \'error\' ] && 404 == $wp->query_vars[ \'error\' ] ) {
    //…
}
编辑:我犯了一个错误:不确定$wp 别名URL上的状态始终为404。这在很大程度上取决于系统上的重写规则。因此,您需要直接检查别名cpt slug。

现在,您必须自己解析请求并查找元值以找到相应的帖子:

if ( ! empty( $wp->query_vars[ \'error\' ] && \'404\' == $wp->query_vars[ \'error\' ] ) {

    //look up for your post, this var should looks like 
    // \'mon-type-de-poste-personnalise/cest-un-article-sympa\' in your case:
    $wp->request;
    //e.g.
    $parts = explode( \'/\', $wp->request );
    // your language slug
    $slug = ( isset( $parts[ 1 ] ) ) ? $parts[ 1 ] : \'\';
    // do your query with your meta value $slug here

}
接下来,要设置$wp->query_vars 当我们面对最初的请求时,他们会是这样的:

if ( ! empty( $wp->query_vars[ \'error\' ] && \'404\' == $wp->query_vars[ \'error\' ] ) {

    //look up for your post, this var should looks like 
    // \'mon-type-de-poste-personnalise/cest-un-article-sympa\' in your case:
    $wp->request;
    //e.g.
    $parts = explode( \'/\', $wp->request );
    // your i18n post slug
    $slug = ( isset( $parts[ 1 ] ) ) ? $parts[ 1 ] : \'\';
    // do your query with your meta value $slug here
    // and setup the WP_Post object for the matching post
    $matching_post; // WP_Post

    // if you don\'t find any post, return here!

    // unset the error flag
    unset( $wp->query_vars[ \'error\' ] );

    // your cpt slug
    $cpt_slug = \'my-custom-post-type\';

    $wp->query_vars[ $cpt_slug ] = $matching_post->post_name;
    $wp->query_vars[ \'post_type\' ] = $cpt_slug;
    $wp->query_vars[ \'name\' ] = $matching_post->post_name;
}
您必须做的最后一件事是通过删除函数来防止WordPress自动重定向到规范URLredirect_canonicaltemplate_redirect 措施:

if ( ! empty( $wp->query_vars[ \'error\' ] && \'404\' == $wp->query_vars[ \'error\' ] ) {

    //look up for your post, this var should looks like 
    // \'mon-type-de-poste-personnalise/cest-un-article-sympa\' in your case:
    $wp->request;
    //e.g.
    $parts = explode( \'/\', $wp->request );
    // your language slug
    $slug = ( isset( $parts[ 1 ] ) ) ? $parts[ 1 ] : \'\';
    // do your query with your meta value $slug here
    // and setup the WP_Post object for the matching post
    $matching_post; // WP_Post

    # unset the error flag
    unset( $wp->query_vars[ \'error\' ] );

    # your cpt slug
    $cpt_slug = \'my-custom-post-type\';

    $wp->query_vars[ $cpt_slug ] = $matching_post->post_name;
    $wp->query_vars[ \'post_type\' ] = $cpt_slug;
    $wp->query_vars[ \'name\' ] = $matching_post->post_name;

    # don\'t redirect to the canonical url
    remove_action( \'template_redirect\', \'redirect_canonical\' );
}
将最后一个代码块放入函数中,并将其应用于parse_request 措施:

add_action( \'parse_request\', \'wpse_126309_parse_request\' );

/**
 * @wp-hook parse_request
 * @param WP $wp
 * @return void
 */
function wpse_126309_parse_request( $wp ) {
    // the code goes here
}
您应该测试这个示例的副作用(这只是概念验证)。

结束

相关推荐

Get posts by term slug only

我想做的是构建一个短代码,它将根据传递给它的分类法段塞显示一个帖子列表。但据我所知,你不能只使用一个术语的slug来引入帖子,而不必指定它所属的分类法。有没有可能只使用术语slug而不使用它所在的特定分类法来获取帖子或其他基于分类法的数据(术语meta、名称等)?