更新帖子中的固定链接(不是域名更改)

时间:2013-05-29 作者:Joe Block

我加入的一个小组在我加入之前创建了一个wordpress网站。他们没有为该站点设置永久链接。因此,当我接管网站维护工作时,我一直在优化网站的SEO和速度。因此,我开始讨论posts任务,其中包含指向同一站点上其他帖子的链接,但由于永久链接已关闭,它们看起来像http://THE_SITE/index.php?post_id=432 在每个岗位内。我已经启用了%postname%permalink,因此google已经在更新其URL,因为301的存在,但问题是这些帖子仍然有旧的默认链接。

所以问题是:更新新永久链接的旧链接的最佳方式是什么

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

我对这个问题很感兴趣,所以我试了一下。未测试,因此建议备份wp_posts 运行前的表(尽管您无论如何都应该这样做!)

如评论中所述,don\'t forget to replace "domain.com" in the regular expression with your own.

require \'wp-load.php\'; // Only needed if *not* a plugin.

function out_with_the_old( $match ) {
    global $links;

    if ( ! isset( $links[ $match[1] ] ) ) { // Cache to save subsequent hits. 
        $links[ $match[1] ] = get_permalink( $match[1] );
        clean_post_cache( $match[1] );
    }

    return $links[ $match[1] ] ? $links[ $match[1] ] : $match[0]; // Just fallback to original URL if new permalink void (for whatever reason).
}

$links = array();
$posts = get_posts(
    array(
        \'posts_per_page\' => -1,
        \'post_status\'    => \'any\',
        \'post_type\'      => \'any\',
        \'fields\'         => \'ids\', // Getting *everything* will most likely hit the memory limit.
    )
);

// Loop over each post & replace all old instances of the permalink with the new one.
foreach ( $posts as $post_id ) {
    $save = array();
    $post = get_post( $post_id );

    foreach ( array( \'post_content\', \'post_excerpt\' ) as $field ) {
        // Replace "domain\\.com" with your domain name, minus "www." (escape dots with a backslash).
        // The regex accommodates for various forms of the same URL, including SSL, no "www" & no index.php.
        $text = preg_replace_callback( "!https?://(?:www\\.)?domain\\.com/(?:index\\.php)?\\?(?:p|post_id)=([0-9]+)!", \'out_with_the_old\', $post->$field );

        if ( $text !== $post->$field )
            $save[ $field ] = $text;
    }

    if ( $save )
        $wpdb->update(
            $wpdb->posts,
            $save,
            array(
                \'ID\' => $post_id,
            ),
            \'%s\',
            \'%d\'
        );

    clean_post_cache( $post ); // Otherwise we might soon hit a memory limit.
}
您可以将其转换为插件,但最便宜、最简单的方法是将其转储到脚本中,通过FTP传输到WordPress所在的目录,然后在浏览器中运行。

结束

相关推荐

Taxonomy based permalinks

在我的网站上,我使用自己的分类法。我希望分类学与permalink相结合。因此,如果一个新闻页面有分类法,permalink就会改变。像这样:mysite。com/%custom\\u tax%/blog/%postname%,如果是一个页面,请点击:mysite。com/%custom\\u tax%/%postname%但如果没有我想要的分类法:mysite。com/blog/%postname%,如果它是一个页面:mysite。com/%postname%我怎样才能轻松地做到这一点?我已经设置了%c