我有一个旧网站,我正在修改一个新的自定义Wordpress主题。旧站点有一个自定义(非基于WP的)下载存档,该存档映射了如下URL:
/downloads/view.php?id=2
ID映射到单独MySQL数据库中的下载项。
在这次刷新中,我想将所有内容都转移到Wordpress上,我将使用一个自定义帖子类型来处理下载部分,并使用一个自定义字段将“旧ID”映射到新帖子。这并不困难,我知道如何做到这一点,但问题是如何将旧URL重新映射到新位置。
我看到的问题是,旧的URL都是PHP文件(扩展名为.php
). 我将如何在我的主题函数中创建插件或Wordpress函数。php文件将这些旧URL重定向到新URL。本质上,我只需要一个Wordpress函数从/downloads/view.php?id=2
到/downloads/2/
, 或其他更优化的URL(/downloads/title-of-archive
).
我如何处理URL为“”的页面/downloads/view.php
“和”/downloads/download.php
“执行重定向?
我知道我可以使用.htaccess
文件,但为了便于移植,我更愿意直接在Wordpress插件中执行此操作。。。
最合适的回答,由SO网友:Andrew M 整理而成
我最终解决了这个问题template_redirect
“行动。之后,我检查页面是否is_404()
然后检查URL是否与我的模式匹配。我设置了适当的标题(301
与404
通常会触发)并执行重定向。我的代码如下。
add_action(\'template_redirect\', \'handle_download_urls\');
function handle_download_urls(){
if(is_404()){
if(preg_match(\'/\\/downloads\\/(?:view\\.php|download\\.php)/\', $_SERVER[\'REQUEST_URI\']) && isset($_GET[\'id\'])){
// Do lookup of post based on custom metadata field
// Redirect and change header
status_header(301);
header(\'Location: [URL]\');
}
}
}
SO网友:Derk-Jan
你可以通过重写来做到这一点,但老实说,这不是你想要的重写。重写只会使旧url与新url一样,而不是将其重定向到新位置。请不要说你还需要确定/downloads/id/
由WordPress处理。现在,您可以使用重写。
将以下代码添加到模板中function.php
:
if ( !function_exists( \'get_current_url\' ) ) {
/**
* Gets the current displayed url
* @returns the url
*/
function get_current_url( ) {
$url = isset( $_SERVER[\'HTTPS\'] ) && $_SERVER[\'HTTPS\'] == \'on\' ? \'https://\' : \'http://\';
$url .= ( strlen( $_SERVER[\'SERVER_NAME\'] ) ? $_SERVER[\'SERVER_NAME\'] : $_SERVER[\'HTTP_HOST\'] );
$url .= ( strval( $_SERVER[\'SERVER_PORT\'] ) != \'80\' ) ? $_SERVER[\'SERVER_PORT\'] : \'\';
$url .= $_SERVER[ \'REQUEST_URI\' ];
return $url;
}
}
/**
* Permanently redirects old /downloads/view.php?id=X and /downloads/download.php?id=X
* to /downloads/X/.
*/
function permanent_301_redirect_downloads() {
$matches = array();
$url = get_current_url();
// $matches[1] has view or download, and $matches[2] the id
if ( preg_match( \'/downloads\\/(view|download)\\.php\\?id=([0-9]+)\\/?$/\', $url, $matches ) ) :
// Fetch the title of the archive. Are these posts? I wouldn\'t know
$archive = $matches[2];
wp_redirect( trailingslashit( home_url(\'\') . \'/downloads/\' . $archive ) , 301 );
exit;
endif;
}
add_action( \'template_redirect\', \'permanent_301_redirect_downloads\' );
SO网友:shea
重定向/downloads/view.php?id={some-name}
到/downloads/{some-name}/
, 将以下内容添加到。htaccess文件,在默认WordPress规则之前
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^downloads/view.php?id=(.+) downloads/$1 [R=301,L]
</IfModule>
它还将让搜索引擎知道您的下载已移动,并更新其索引。