基于自定义字段值的URL重写

时间:2011-03-23 作者:Simon Blackbourn

我正在从另一个CMS迁移到WordPress。旧站点的格式中有糟糕的SEO不友好URLhttp://example.com?lid=1234.

我们已将旧站点的所有帖子导入WordPress,并正在存储lid 作为自定义字段。

如果可能的话,我们希望旧的URL仍然可以工作,但因为大约有3000篇帖子正在使用。htaccess是不可能的。

所以我的问题是:如何创建一个重写规则来提取lid 值并重定向到自定义字段中包含该值的帖子?(thelid 值是唯一的,因此不必担心多个帖子具有相同的自定义字段值)

许多thanksSimon

2 个回复
最合适的回答,由SO网友:Bainternet 整理而成

这里有一个想法,首先添加lid 要查询\\u vars,请执行以下操作:

add_filter(\'query_vars\', \'lid_query_vars\');
function lid_query_vars($vars) {
    // add lid to the valid list of variables
    $new_vars = array(\'lid\');
    $vars = $new_vars + $vars;
    return $vars;
}
然后使用parse_request 挂钩以创建重定向

add_action(\'parse_request\', \'lid_parse_request\');
function lid_parse_request($wp) {
    // only process requests with "lid"
    if (array_key_exists(\'lid\', $wp->query_vars) && $wp->query_vars[\'lid\'] != \'\') {
        $args = array(\'meta_key\' => \'lid\', \'meta_value\' => $wp->query_vars[\'lid\']);
        $redirect_to_post = get_posts($args);
        foreach($redirect_to_post as $p){
            $link = get_permalink($p->ID);
            wp_redirect( $link , 301 ); 
            exit;
        }
    }
}

SO网友:MikeSchinkel

你好@Simon Blackbourn:

当我在写我的答案时,还没来得及发帖,@Bainernet也给出了一个很好的答案。他采取了稍微不同的方法,但他的作品和我的作品一样好。不过,既然我看到他的时候已经写了我的,我会把我的作为替代品提交给你考虑。

使用直接SQL:$post_id = $wpdb->get_var($sql)

我的解决方案使用的是直接SQL,这通常不是最好的方法,但我觉得这是公平的,因为这种SQL很简单(因此不太可能在将来中断),而且对于您的需要,使用相对较重的get_posts() 由于您的需求对于特定站点来说是一次性的,所以它需要处理挂钩。

使用直接URL参数:$_GET[\'lid\']

此外,我选择使用直接访问$_GET[\'lid\'] 而不是首先创建query_var 因为查询变量是基础URL重写系统使用的标准WordPress查询体系结构的一部分,并且对于您的用例,您明确没有利用WordPress查询体系结构。相反,您需要捕获传递到URL上的实际查询参数,因此我认为实际上不需要添加查询变量的开销(尽管使用查询变量不会有什么坏处,而且效果也很好)

使用\'parse_request\' 最后,我确实喜欢@Bainternet的使用\'parse_request\' 钩它在WordPress的默认MySQL查询之前运行,因此您不必运行您将丢弃的MySQL查询,而是在\'init\' 钩子意味着(大多数)允许插件修改永久链接的钩子将被添加,从而为重定向提供正确的URL。

放置在functions.php

您可以将以下代码放入主题的functions.php 文件:

add_action(\'parse_request\',\'oldsite_redirect\',0);  // 0=before (most) \'parse_request\' calls
function oldsite_redirect() {
  if (isset($_GET[\'lid\'])) {
    global $wpdb;
    $sql = "SELECT post_id FROM {$wpdb->postmeta} " . 
           "WHERE meta_key=\'lid\' AND meta_value=\'%s\'";
    $sql = $wpdb->prepare($sql,$_GET[\'lid\']);
    $post_id = $wpdb->get_var($sql);
    if ($post_id) {
      $permalink = get_permalink($post_id);
      if ($permalink) {
        wp_safe_redirect($permalink,301);
        exit;
      }
    }
  }
}
同样,任何一种解决方案都会奏效@班特网或我的;您可以选择使用哪个。

结束

相关推荐

URL redirect problem

我的wordpress 3.0.1站点中有2个页面,包含2个URLwww.mysite。co.uk/sub-page/child-of-sub-page/acculation/和www.mysite。co.uk/conditionment公司/但是,我的网站中的任何链接都可以链接到www.mysite。co.uk/acculation/访问www.mysite。co.uk/sub-page/child-of-sub-page/acculation/代替这是wordpress 3.0.1中的错误吗?还是有办