网站运行的时间长了,里面引用的一些链接可能就会已经失效了,甚至是跳转到一些赌博、色情网站,这个时候无论是打不开还是链接打开后和文章引用时候说的不一样,都是对用户非常不好的体验,所以我们就需要把这些失效链接删除,下面我就来分享WordPress去除文章失效链接的方法:
注意:操作之前先备份数据,先备份数据,先备份数据,重要的事情说三遍。养成好习惯。
使用代码实现
把下面代码添加到你主题的functions.php文件,既可以实现删除文章失效链接了:
function check_broken_links($content) {
// 使用正则表达式匹配所有的链接
$pattern = '/<a(.*?)href=["\'](http[s]?:\/\/[^"\']+)["\'](.*?)>(.*?)<\/a>/i';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$url = $match[2];
$link_text = $match[4];
// 使用cURL检查链接的有效性
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 如果返回的HTTP状态码不等于200、301或302,则认为链接失效
if ($retcode != 200 && $retcode != 301 && $retcode != 302) {
// 创建一个新的链接,使用删除线,并添加broken-link类
$new_link = '<span class="broken-link"><s>' . $link_text . '</s></span>';
// 在内容中替换旧的链接
$content = str_replace($match[0], $new_link, $content);
}
}
return $content;
}
// 将我们的函数添加到'the_content'过滤器
add_filter('the_content', 'check_broken_links');
上面的代码的作用是提取文章中所有的链接的,然后通过PHP的cURL函数检测这个链接是否有效(如果状态码不等于200、301或302就认为是无效)。注释写的很清除。就不重复叙述了。
这个函数会把检测到的失效链接的文字,增加删除线,并给它添加了一个类名为class=”broken-link”的span标签,方便你给这些失效链接增加样式来提醒用户,嘿嘿,我想的周到把。如下图所示:
如果你只是单纯的想去除链接,就可以使用下面的代码,一样是加到主题的functions.php文件即可。
function check_broken_links($content) {
// 使用正则表达式匹配所有的链接
$pattern = '/<a(.*?)href=["\'](http[s]?:\/\/[^"\']+)["\'](.*?)>(.*?)<\/a>/i';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$url = $match[2];
$link_text = $match[4];
// 使用cURL检查链接的有效性
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 如果返回的HTTP状态码不等于200、301或302,则认为链接失效
if ($retcode != 200 && $retcode != 301 && $retcode != 302) {
// 只保留链接的文字
$new_link = $link_text;
// 在内容中替换旧的链接
$content = str_replace($match[0], $new_link, $content);
}
}
return $content;
}
// 将我们的函数添加到'the_content'过滤器
add_filter('the_content', 'check_broken_links');
上面的两个函数是不会修改数据库中实际内容的。当你删除函数后,内容会恢复原样。如果你需要直接修改掉,则可以参看下面这个代码:
function update_broken_links() {
// 获取所有的文章
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$content = get_the_content();
// 使用正则表达式匹配所有的链接
$pattern = '/<a(.*?)href=["\'](http[s]?:\/\/[^"\']+)["\'](.*?)>(.*?)<\/a>/i';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$url = $match[2];
$link_text = $match[4];
// 使用cURL检查链接的有效性
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 如果返回的HTTP状态码不等于200、301或302,则认为链接失效
if ($retcode != 200 && $retcode != 301 && $retcode != 302) {
// 只保留链接的文字
$new_link = $link_text;
// 在内容中替换旧的链接
$content = str_replace($match[0], $new_link, $content);
}
}
// 更新文章内容
$post_id = get_the_ID();
$post = array(
'ID' => $post_id,
'post_content' => $content,
);
wp_update_post($post);
}
}
wp_reset_postdata();
}
注意,如果你的文章数量、链接有很多,则可能会对占用你服务器比较多的性能。
编辑当前主题的 functions.php 文件
WordPress网站后台 – 仪表盘 – 外观 – 主题文件编辑器(有的版本可能显示是编辑)>选择主题functions.php文件>添加代码>保存文件:
注意
上面添加到主题functions.php文件的这种方式添加的功能代码只在当前使用主题下有作用,如果你切换了主题,那么这个时候就会失效,所以要注意。
推荐
推荐你使用WPCode 代码片段插件,你可以直接将上述代码添加为一个新的代码片段开启,在不需要的时候也可以直接对这个功能代码选择关闭就行,这个插件可以非常方便的管理在WordPress网站上的功能代码,如下示例:
这个插件它的代码库中还有许多使用的功能代码片段,你可以选择你用得上的然后导入、选择开启就可以了,如下示例:
关于这个插件的介绍推荐你看我之前文章:WordPress代码片段插件 WPCode。
使用插件实现
推荐你使用Broken Link Checker插件来清理文章中的失效链接,插件的使用非常简单,下载后安装或者在线安装,启用后根据自己的需求进行一点简单的配置,插件就会自动检测了:比较详细的解释在之前的文章中有说:WordPress文章失效图片/链接检测插件推荐:Broken Link Checker,这里则不在重复叙述,下面附一下下载地址:
下载地址
Broken Link Checker WordPress插件库下载地址:Broken Link Checker – WordPress plugin | WordPress.org
你可以直接在WordPress网站后台搜索Broken Link Checker安装: