彻底移除并关闭WordPress的RSS feed功能

网上流传的关闭WordPress的RSS feed功能多为下面的代码(在主题的functions.php中加入下面的代码)

function disable_all_feeds() {
   wp_die( ‘本站不提供feed’ );
}
add_action(‘do_feed’, ‘disable_all_feeds’, 1);
add_action(‘do_feed_rdf’, ‘disable_all_feeds’, 1);
add_action(‘do_feed_rss’, ‘disable_all_feeds’, 1);
add_action(‘do_feed_rss2’, ‘disable_all_feeds’, 1);
add_action(‘do_feed_atom’, ‘disable_all_feeds’, 1);

这种方法实现的效果是,当你打开博客的feed地址(如https://www.XXX.com/feed)时,页面会直接显示设置的错误信息,feed代码已经被删除,也就是说这个feed地址仍然存在,而不是打开这个链接直接显示404。

下面的代码可以彻底干净的移除并关闭WordPress的RSS feed功能

// 删除 wp_head 输入到模板中的feed地址链接
add_action( ‘wp_head’, ‘wpse33072_wp_head’, 1 );
function wpse33072_wp_head() {
    remove_action( ‘wp_head’, ‘feed_links’, 2 );
    remove_action( ‘wp_head’, ‘feed_links_extra’, 3 );
}

foreach( array( ‘rdf’, ‘rss’, ‘rss2’, ‘atom’ ) as $feed ) {
    add_action( ‘do_feed_’ . $feed, ‘wpse33072_remove_feeds’, 1 );
}
unset( $feed );

// 当执行 do_feed action 时重定向到首页
function wpse33072_remove_feeds() {
    wp_redirect( home_url(), 302 );
    exit();
}

// 删除feed的重定向规则
add_action( ‘init’, ‘wpse33072_kill_feed_endpoint’, 99 );

function wpse33072_kill_feed_endpoint() {
    global $wp_rewrite;
    $wp_rewrite->feeds = array();
    // 运行一次后,记得删除下面的代码
    flush_rewrite_rules();

将以上php代码放入当前主题的functions.php中,然后登陆进入WordPress后台,随便打开一个页面,然后回来在主题的functions.php中将:flush_rewrite_rules(); 这行代码删除即可。

为什么要移除或者关闭WordPress的RSS feed功能?

因为很多时间博客基本没有人订阅,却有一堆机器人来采集博客的feed,方便了别人复制你的文章不说,还造成了不必要的资源消耗。

阻止采集feed的方式很多,比如feed中只输出文章摘要,而不输出全文,这个在WordPress后台 – 设置 – 阅读中就可以设置。但是出于某些目的,并不完全是为了防采集,不想开放博客的feed功能,这就可以采用上面的方法了。

资料来源:https://www.ludou.org/how-to-remove-feeds-from-wordpress-totally.html

给WordPress分类目录和页面添加斜杠(排除文章页面/内分页和自定义文章类型)

给WordPress分类目录和页面添加斜杠(排除文章页面和内分页),我们只要把以下代码加在主题目录的 functions.php 中即可:

function nice_trailingslashit($string, $type_of_url) {

if ( $type_of_url != ‘single’ && $type_of_url != ‘single_paged’ )

$string = trailingslashit($string);

return $string;

}

 

add_filter(‘user_trailingslashit’, ‘nice_trailingslashit’, 10, 2);

如果你希望页面也不要加斜杠,那么把上面其中的内容修改为

if ( $type_of_url != ‘single’ && $type_of_url != ‘page’ && $type_of_url != ‘single_paged’ )

如果你的网站还有自定义文章类型,并且自定义文章类型也不想添加斜杠,那么可以修改为

function nice_trailingslashit($string, $type_of_url) {

global $post_type;

if ( $type_of_url != ‘single’ && $type_of_url != ‘single_paged’ && $post_type !== ‘projects’  )

$string = trailingslashit($string);

return $string;

}

 

add_filter(‘user_trailingslashit’, ‘nice_trailingslashit’, 10, 2);

其中 $post_type !== ‘projects’中的 projects即为你的自定义文章类型。

wordpress批量删除及重命名自定义域栏目

wordpress通常是只可以添加和删除自定义栏目,但不能重命名。常规的方法是进数据库修改,但修改数据库有风险,下面代码可以实现免进数据库修改wordpress自定义域栏目

将以下代码添加到主题 functions.php 文件中:

global $wpdb;

$wpdb->query( "

UPDATE `wp_postmeta`

SET `meta_key` = ‘NEW NAME’

WHERE `meta_key` = ‘OLD NAME’

" );

替换上面代码中新的自定义栏目名称和原自定义栏目名称。

批量删除WordPress自定义栏目

将下面的代码添加到当前主题functions.php中:

global $wpdb;

$wpdb->query( "

DELETE FROM $wpdb->postmeta

WHERE `meta_key` = ‘自定义栏目名称’

" );

然后打开一下网站,指定删除的自定义栏目会自动从数据库中被清理掉。

上述两种功能的代码运行一次就够了,没有必要留在主题中,用后删除即可。

WordPress实现文章中远程(外链)图片自动本地化的方法

WordPress文章中远程图片自动保存到本地服务器,最大的好处就是复制粘贴,方便对文章的转载复制.

实现方法:

复制下面的代码,然后粘贴到你当前WordPress主题的模版函数(functions.php)文件中保存即可。

//自动本地化外链图片
add_filter(‘content_save_pre’, ‘auto_save_image’);
function auto_save_image($content) {
$upload_path = ”;
$upload_url_path = get_bloginfo(‘url’);
//上传目录
if (($var = get_option(‘upload_path’)) !=”){
$upload_path = $var;
} else {
$upload_path = ‘wp-content/uploads’;
}
if(get_option(‘uploads_use_yearmonth_folders’)) {
$upload_path .= ‘/’.date(“Y”,time()).’/’.date(“m”,time());
}
//文件地址
if(($var = get_option(‘upload_url_path’)) != ”) {
$upload_url_path = $var;
} else {
$upload_url_path = bloginfo(‘url’);
}
if(get_option(‘uploads_use_yearmonth_folders’)) {
$upload_url_path .= ‘/’.date(“Y”,time()).’/’.date(“m”,time());
}
require_once (“../wp-includes/class-snoopy.php”);
$snoopy_Auto_Save_Image = new Snoopy;
$img = array();
//以文章的标题作为图片的标题
if ( !empty( $_REQUEST[‘post_title’] ) )
$post_title = wp_specialchars( stripslashes( $_REQUEST[‘post_title’] ));
$text = stripslashes($content);
if (get_magic_quotes_gpc()) $text = stripslashes($text);
preg_match_all(“/ src=(\”|\’){0,}(http:\/\/(.+?))(\”|\’|\s)/is”,$text,$img);
$img = array_unique(dhtmlspecialchars($img[2]));
foreach ($img as $key => $value){
set_time_limit(180); //每个图片最长允许下载时间,秒
if(str_replace(get_bloginfo(‘url’),””,$value)==$value&&str_replace(get_bloginfo(‘home’),””,$value)==$value){
//判断是否是本地图片,如果不是,则保存到服务器
$fileext = substr(strrchr($value,’.’),1);
$fileext = strtolower($fileext);
if($fileext==””||strlen($fileext)>4)
$fileext = “jpg”;
$savefiletype = array(‘jpg’,’gif’,’png’,’bmp’);
if (in_array($fileext, $savefiletype)){
if($snoopy_Auto_Save_Image->fetch($value)){
$get_file = $snoopy_Auto_Save_Image->results;
}else{
echo “error fetching file: “.$snoopy_Auto_Save_Image->error.”<br>”;
echo “error url: “.$value;
die();
}
$filetime = time();
$filepath = “/”.$upload_path;//图片保存的路径目录
!is_dir(“..”.$filepath) ? mkdirs(“..”.$filepath) : null;
//$filename = date(“His”,$filetime).random(3);
$filename = substr($value,strrpos($value,’/’),strrpos($value,’.’)-strrpos($value,’/’));
//$e = ‘../’.$filepath.$filename.’.’.$fileext;
//if(!is_file($e)) {
// copy(htmlspecialchars_decode($value),$e);
//}
$fp = @fopen(“..”.$filepath.$filename.”.”.$fileext,”w”);
@fwrite($fp,$get_file);
fclose($fp);
$wp_filetype = wp_check_filetype( $filename.”.”.$fileext, false );
$type = $wp_filetype[‘type’];
$post_id = (int)$_POST[‘temp_ID2’];
$title = $post_title;
$url = $upload_url_path.$filename.”.”.$fileext;
$file = $_SERVER[‘DOCUMENT_ROOT’].$filepath.$filename.”.”.$fileext;
//添加数据库记录
$attachment = array(
‘post_type’ => ‘attachment’,
‘post_mime_type’ => $type,
‘guid’ => $url,
‘post_parent’ => $post_id,
‘post_title’ => $title,
‘post_content’ => ”,
);
$id = wp_insert_attachment($attachment, $file, $post_parent);
$text = str_replace($value,$url,$text); //替换文章里面的图片地址
}
}
}
$content = AddSlashes($text);
remove_filter(‘content_save_pre’, ‘auto_save_image’);
return $content;
}
function mkdirs($dir)
{
if(!is_dir($dir))
{
mkdirs(dirname($dir));
mkdir($dir);
}
return ;
}
function dhtmlspecialchars($string) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = dhtmlspecialchars($val);
}
}else{
$string = str_replace(‘&’, ‘&’, $string);
$string = str_replace(‘”‘, ‘”‘, $string);
$string = str_replace(‘<‘, ‘<‘, $string);
$string = str_replace(‘>’, ‘>’, $string);
$string = preg_replace(‘/&(#\d;)/’, ‘&\1’, $string);
}
return $string;
}

以后你发表文章时就不用去管文章中的外链图片了,因为上面的代码会自动将文章中包含的外链图片自动保存到本地.

资料来源:http://boke112.com/3452.html

WordPress 代码实现相关文章(列表模式)功能

WordPress代码实现相关文章这个代码所实现的相关文章的相关度非常高(优先通过 Tags 标签相关,之后是同分类下文章,排除当前文章.

<h3>Related Posts</h3>
<ul>
<?php
$post_num = 5; // 數量設定.
$exclude_id = $post->ID; // 單獨使用要開此行 //zww: edit
$posttags = get_the_tags(); $i = 0;
if ( $posttags ) {
$tags = ”; foreach ( $posttags as $tag ) $tags .= $tag->term_id . ‘,’; //zww: edit
$args = array(
‘post_status’ => ‘publish’,
‘tag__in’ => explode(‘,’, $tags), // 只選 tags 的文章. //zww: edit
‘post__not_in’ => explode(‘,’, $exclude_id), // 排除已出現過的文章.
‘caller_get_posts’ => 1,
‘orderby’ => ‘comment_date’, // 依評論日期排序.
‘posts_per_page’ => $post_num
);
query_posts($args);
while( have_posts() ) { the_post(); ?>
<li><a rel=”bookmark” href=”<?php the_permalink(); ?>” title=”<?php the_title(); ?>”><?php the_title(); ?></a></li>
<?php
$exclude_id .= ‘,’ . $post->ID; $i ++;
} wp_reset_query();
}
if ( $i < $post_num ) { // 當 tags 文章數量不足, 再取 category 補足.
$cats = ”; foreach ( get_the_category() as $cat ) $cats .= $cat->cat_ID . ‘,’;
$args = array(
‘category__in’ => explode(‘,’, $cats), // 只選 category 的文章.
‘post__not_in’ => explode(‘,’, $exclude_id),
‘caller_get_posts’ => 1,
‘orderby’ => ‘comment_date’,
‘posts_per_page’ => $post_num – $i
);
query_posts($args);
while( have_posts() ) { the_post(); ?>
<li><a rel=”bookmark” href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></li>
<?php $i++;
} wp_reset_query();
}
if ( $i == 0 ) echo ‘<li>没有相关文章!</li>’;
?>
</ul>

资料来源:https://zww.me/archives/25353

wordpress最新、热评和随机日志(文章)函数三体合一

最新日志、热评日志、随机日志这三个功能在函数上是很相近的,无非就是一个排序的不同,最新日志是按照发布时间排序,热评日志是按照评论数量排序, 随机日志则是随机排序。所以我索性就把这三个函数合并为一,一方面减少 functions.php 中代码的冗余,另一方面也方便自己管理。

把以下函数复制到 WordPress 主题目录下的 functions.php 中: 

 

function get_posts($orderby = '', $plusmsg = '') {

$get_posts = query_posts('posts_per_page=10&caller_get_posts=1&orderby='.$orderby);

foreach ($get_posts as $get_post) {

$output = '';

$post_date = mysql2date('y年m月d日', $get_post->post_date);

$commentcount = '('.$get_post->comment_count.' 条评论)';

$post_title = htmlspecialchars(stripslashes($get_post->post_title));

$permalink = get_permalink($get_post->ID);

$output .= '<li><a href="' . $permalink . '" title="'.$post_title.'">' . $post_title . '</a>'.$$plusmsg.'</li>';

echo '<ul>'.$output.'</ul>';

}

wp_reset_query();

}

 

调用方法分别如下:

<?php

//最新日志

get_posts( $orderby = 'date', $plusmsg = 'post_date' );

//热评日志

get_posts( $orderby = 'comment_count', $plusmsg = 'commentcount' );

//随机日志

get_posts( $orderby = 'rand', $plusmsg = 'post_date' );

?>

可以看到它们三者共用一个函数,而只是参数不同罢了,如题,最新、热评、随机日志函数三体合一就完成了。

下面我介绍一下把 WordPress 的最新、热评、随机日志这三体合一的函数设置在 30 天内的时间范围里,效果就见本站上的侧边栏上的这些日志吧,都在 30 天之内。

首先把以下函数放在 WordPress 主题文件夹里的 functions.php 中:

function filter_where($where = '') {

$where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";

return $where;

}

function some_posts($orderby = '', $plusmsg = '',$limit = 10) {

add_filter('posts_where', 'filter_where');

$some_posts = query_posts('posts_per_page='.$limit.'&caller_get_posts=1&orderby='.$orderby);

foreach ($some_posts as $some_post) {

$output = '';

$post_date = mysql2date('y年m月d日', $some_post->post_date);

$commentcount = '('.$some_post->comment_count.' 条评论)';

$post_title = htmlspecialchars(stripslashes($some_post->post_title));

$permalink = get_permalink($some_post->ID);

$output .= '<li><a href="' . $permalink . '" title="'.$post_title.'">' . $post_title . '</a>'.$$plusmsg.'</li>';

echo $output;

}

wp_reset_query();

}

可以看到第二行中的 30 就是指最近 30 天,也可以根据你自己的需要修改这个时间。至于调用则和升级版之前的一样,下面只是比上次多加了一个 $limit 参数:

<?php

//最新日志

some_posts( $orderby = 'date', $plusmsg = 'post_date', 10 );

//热评日志

some_posts( $orderby = 'comment_count', $plusmsg = 'commentcount', 10 );

//随机日志

some_posts( $orderby = 'rand', $plusmsg = 'post_date', 10 );

?>

 

OK,接下来我要把点击最高的排行榜也改成 30 天内的排名,这样对经常来光顾的用户来说应该更合理吧,否则看来看去就那几篇,标题都看烂了。

资料来源:http://www.16css.com/cmsjc/wordpress/422.html

WordPress 技巧:使用文件缓存侧边栏

下面的代码除了可以缓存侧边栏,也可以把你想要缓存的多数内容缓存。

几点说明:

1. 可以自己修改缓存时间,怎么修改,看下面代码的唯一的注释。
2. 一旦采用这样的缓存,在缓存时间内对 sidebar 做任何修改都不会生效(可以上服务器上直接把缓存文件删除即可更新)。
3. 如果你又想缓存又想修改东西,你可以把缓存时间修改为1秒,作了修改之后,让 sidebar 缓存生成之后,再把缓存时间修改为原来的。
4. 如果你的 sidebar 为不同页面不同 sidebar,那么你要根据自己的 sidebar 生成不同 sidebar 缓存,如:sidebar_home, sidebar_single,基本代码类似。
5. 会对 Recent Post, Recent Comment 这些插件产生延迟,在缓存的时间内,如果这些列表更新了会不能及时体现。
下面是具体的步骤和代码:

1. 进入 WordPress 后台,点击外观 => 主题编辑 => Sidebar (sidebar.php)。

2. 在 sidebar.php 开头加入以下代码:

<?php 
$sidebar_html = ABSPATH . "wp-content/cache/sidebar.txt";
$have_cached = false;
if (file_exists($sidebar_html)){
    $file_time = filemtime($sidebar_html);
    if (($file_time + 3600) > time()){ //缓存1小时
        echo "<!-- cached sidebar -->";
        echo(file_get_contents($sidebar_html));
        echo "<!-- end of cached sidebar -->";
        $have_cached = true;
    }
}
if(!$have_cached){
    ob_start();
?>

3. 在 sidebar.php 结尾加入以下代码:

<?php
    $sidebar_content = ob_get_contents();
    ob_end_clean();
    $sidebar_fp = fopen($sidebar_html, "w");
 
    if ($sidebar_fp){
         fwrite($sidebar_fp, $sidebar_content);
         fclose($sidebar_fp);
    }
 
    echo $sidebar_content;
}
?>
资料来源:http://blog.wpjam.com/m/cache-sidebar/

实用的WordPress外链跳转代码

实用的WordPress外链跳转代码分享。来自张戈博客,备忘。

PHP版

<?php

//防止 WordPress 遭受恶意 URL 请求。From:http://blog.wpjam.com/m/block-bad-queries/

if(strlen($_SERVER[‘REQUEST_URI’]) > 384 ||

strpos($_SERVER[‘REQUEST_URI’], "eval(") ||

strpos($_SERVER[‘REQUEST_URI’], "base64")) {

@header("HTTP/1.1 414 Request-URI Too Long");

@header("Status: 414 Request-URI Too Long");

@header("Connection: Close");

@exit;

}

//通过QUERY_STRING取得完整的传入数据,然后取得url=之后的所有值,兼容性更好

$t_url = preg_replace(‘/^url=(.*)$/i’,’$1′,$_SERVER["QUERY_STRING"]);

//此处可以自定义一些特别的外链,不需要可以删除以下5行

if($t_url=="zhangge" ) {

$t_url="//zhangge.net";

} elseif($t_url=="baidu") {

$t_url="https://www.baidu.com/";

}

//数据处理

if(!empty($t_url)) {

//判断取值是否加密

if ($t_url == base64_encode(base64_decode($t_url))) {

$t_url = base64_decode($t_url);

}

//对取值进行网址校验和判断

preg_match(‘/^(http|https|thunder|qqdl|ed2k|Flashget|qbrowser):\/\//i’,$t_url,$matches);

if($matches){

$url=$t_url;

$title=’页面加载中,请稍候…’;

} else {

preg_match(‘/\./i’,$t_url,$matche);

if($matche){

$url=’http://’.$t_url;

$title=’页面加载中,请稍候…’;

} else {

$url = ‘http://’.$_SERVER[‘HTTP_HOST’];

$title=’参数错误,正在返回首页…’;

}

}

} else {

$title = ‘参数缺失,正在返回首页…’;

$url = ‘http://’.$_SERVER[‘HTTP_HOST’];

}

?>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<meta name="robots" content="noindex, nofollow" />

<noscript><meta http-equiv="refresh" content="1;url='<?php echo $url;?>’;"></noscript>

<script>

function link_jump()

{

//禁止其他网站使用我们的跳转页面

var MyHOST = new RegExp("<?php echo $_SERVER[‘HTTP_HOST’]; ?>");

if (!MyHOST.test(document.referrer)) {

location.href="http://" + MyHOST;

}

location.href="<?php echo $url;?>";

}

//延时1S跳转,可自行修改延时时间

setTimeout(link_jump, 1000);

//延时50S关闭跳转页面,用于文件下载后不会关闭跳转页的问题

setTimeout(function(){window.opener=null;window.close();}, 50000);

</script>

<title><?php echo $title;?></title>

<style type="text/css">

body{background:#555}.loading{-webkit-animation:fadein 2s;-moz-animation:fadein 2s;-o-animation:fadein 2s;animation:fadein 2s}@-moz-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-o-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}.spinner-wrapper{position:absolute;top:0;left:0;z-index:300;height:100%;min-width:100%;min-height:100%;background:rgba(255,255,255,0.93)}.spinner-text{position:absolute;top:45%;left:50%;margin-left:-100px;margin-top:2px;color:#000;letter-spacing:1px;font-size:20px;font-family:Arial}.spinner{position:absolute;top:45%;left:50%;display:block;margin-left:-160px;width:1px;height:1px;border:20px solidrgba(255,0,0,1);-webkit-border-radius:50px;-moz-border-radius:50px;border-radius:50px;border-left-color:transparent;border-right-color:transparent;-webkit-animation:spin 1.5s infinite;-moz-animation:spin 1.5s infinite;animation:spin 1.5s infinite}@-webkit-keyframes spin{0%,100%{-webkit-transform:rotate(0deg) scale(1)}50%{-webkit-transform:rotate(720deg) scale(0.6)}}@-moz-keyframes spin{0%,100%{-moz-transform:rotate(0deg) scale(1)}50%{-moz-transform:rotate(720deg) scale(0.6)}}@-o-keyframes spin{0%,100%{-o-transform:rotate(0deg) scale(1)}50%{-o-transform:rotate(720deg) scale(0.6)}}@keyframes spin{0%,100%{transform:rotate(0deg) scale(1)}50%{transform:rotate(720deg) scale(0.6)}}

</style>

</head>

<body>

<div class="loading">

<div class="spinner-wrapper">

<span class="spinner-text">页面加载中,请稍候…</span>

<span class="spinner"></span>

</div>

</div>

</body>

</html>

将以上代码保存为go.php上传到网站根目录,然后外链采用 “go.php?url=外链地址” 的形式即可。

JS版本

这算是这次的彩蛋吧!偶然的灵感,让我想到了其实可以用 js+html 纯静态来搞定这个跳转功能。测了又测,终于新鲜出炉!和PHP基本一致的功能,可以放心使用!

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<meta name="robots" content="noindex, nofollow" />

<script>

//base64加密解密函数

var base64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var base64DecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);function base64encode(str){var out,i,len;varc1,c2,c3;len=str.length;i=0;out="";while(i<len){c1=str.charCodeAt(i++)&255;if(i==len){out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt((c1&3)<<4);out+="==";break}c2=str.charCodeAt(i++);if(i==len){out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt(((c1&3)<<4)|((c2&240)>>4));out+=base64EncodeChars.charAt((c2&15)<<2);out+="=";break}c3=str.charCodeAt(i++);out+=base64EncodeChars.charAt(c1>>2);out+=base64EncodeChars.charAt(((c1&3)<<4)|((c2&240)>>4));out+=base64EncodeChars.charAt(((c2&15)<<2)|((c3&192)>>6));out+=base64EncodeChars.charAt(c3&63)}returnout}function base64decode(str){var c1,c2,c3,c4;var i,len,out;len=str.length;i=0;out="";while(i<len){do{c1=base64DecodeChars[str.charCodeAt(i++)&255]}while(i<len&&c1==-1);if(c1==-1){break}do{c2=base64DecodeChars[str.charCodeAt(i++)&255]}while(i<len&&c2==-1);if(c2==-1){break}out+=String.fromCharCode((c1<<2)|((c2&48)>>4));do{c3=str.charCodeAt(i++)&255;if(c3==61){return out}c3=base64DecodeChars[c3]}while(i<len&&c3==-1);if(c3==-1){break}out+=String.fromCharCode(((c2&15)<<4)|((c3&60)>>2));do{c4=str.charCodeAt(i++)&255;if(c4==61){returnout}c4=base64DecodeChars[c4]}while(i<len&&c4==-1);if(c4==-1){break}out+=String.fromCharCode(((c3&3)<<6)|c4)}return out}function utf16to8(str){var out,i,len,c;out="";len=str.length;for(i=0;i<len;i++){c=str.charCodeAt(i);if((c>=1)&&(c<=127)){out+=str.charAt(i)}else{if(c>2047){out+=String.fromCharCode(224|((c>>12)&15));out+=String.fromCharCode(128|((c>>6)&63));out+=String.fromCharCode(128|((c>>0)&63))}else{out+=String.fromCharCode(192|((c>>6)&31));out+=String.fromCharCode(128|((c>>0)&63))}}}return out}function utf8to16(str){var out,i,len,c;varchar2,char3;out="";len=str.length;i=0;while(i<len){c=str.charCodeAt(i++);switch(c>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out+=str.charAt(i-1);break;case 12:case 13:char2=str.charCodeAt(i++);out+=String.fromCharCode(((c&31)<<6)|(char2&63));break;case 14:char2=str.charCodeAt(i++);char3=str.charCodeAt(i++);out+=String.fromCharCode(((c&15)<<12)|((char2&63)<<6)|((char3&63)<<0));break}}return out}function doit(){var f=document.f;f.output.value=base64encode(utf16to8(f.source.value));f.decode.value=utf8to16(base64decode(f.output.value))};

//获取请求参数,支持伪静态

function GetQueryString(name)

{

var reg = new RegExp("(^|&)"+ name +"=(.*)$");

var r = window.location.search.substr(1).match(reg);

if(r!=null) {

return unescape(r[2]);

} else {

return window.location.pathname.replace(‘/go/’,”); //注意代码中的/goto/和跳转地址/goto/保持一致,请记得自行修改!

}

}

var jump_url = GetQueryString("url");

//若传入的是base加密数据,则进行解密处理

if( jump_url == base64encode(base64decode(jump_url))) {

jump_url = base64decode(jump_url);

}

//url简单正则

var UrlReg = "^((http|https|thunder|qqdl|ed2k|Flashget|qbrowser|ftp|rtsp|mms)://)";

//自定义一些跳转字符串,请根据实际需求自行发挥

if(jump_url=="zhangge") {

var jump_url="//zhangge.net/";

}

if(jump_url=="baidu") {

var jump_url="https://www.baidu.com/";

}

//网址校验

if(jump_url == null || jump_url.toString().length<1 || !jump_url.match(UrlReg)) {

document.title = ‘参数错误,正在返回首页…’;

jump_url = location.origin;

}

//延时执行跳转

setTimeout(

function link_jump()

{

//非本站域名不允许使用此跳转页面,请自行修改zhangge.net为自己的域名

var MyHOST = new RegExp("zhangge.net");

if (!MyHOST.test(document.referrer)) {

location.href = "http://" + MyHOST;

return;

}

location.href = jump_url;

}, 1000);

setTimeout(function(){window.opener=null;window.close();}, 50000);

</script>

<title>页面加载中,请稍候…</title>

<style type="text/css">

body{background:#555}.loading{-webkit-animation:fadein 2s;-moz-animation:fadein 2s;-o-animation:fadein 2s;animation:fadein 2s}@-moz-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-o-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}.spinner-wrapper{position:absolute;top:0;left:0;z-index:300;height:100%;min-width:100%;min-height:100%;background:rgba(255,255,255,0.93)}.spinner-text{position:absolute;top:45%;left:50%;margin-left:-100px;margin-top:2px;color:#000;letter-spacing:1px;font-size:20px;font-family:Arial}.spinner{position:absolute;top:45%;left:50%;display:block;margin-left:-160px;width:1px;height:1px;border:20px solid rgba(255,0,0,1);-webkit-border-radius:50px;-moz-border-radius:50px;border-radius:50px;border-left-color:transparent;border-right-color:transparent;-webkit-animation:spin 1.5s infinite;-moz-animation:spin 1.5s infinite;animation:spin 1.5s infinite}@-webkit-keyframes spin{0%,100%{-webkit-transform:rotate(0deg) scale(1)}50%{-webkit-transform:rotate(720deg) scale(0.6)}}@-moz-keyframes spin{0%,100%{-moz-transform:rotate(0deg) scale(1)}50%{-moz-transform:rotate(720deg) scale(0.6)}}@-o-keyframes spin{0%,100%{-o-transform:rotate(0deg) scale(1)}50%{-o-transform:rotate(720deg) scale(0.6)}}@keyframes spin{0%,100%{transform:rotate(0deg) scale(1)}50%{transform:rotate(720deg) scale(0.6)}}

</style>

</head>

<body>

<div class="loading">

<div class="spinner-wrapper">

<span class="spinner-text">页面加载中,请稍候…</span>

<span class="spinner"></span>

</div>

</div>

</body>

</html>

选择JS 版本将以上代码保存为 go.html 上传到网站根目录即可。

Ps:2个版本的功能是一致的,优缺点区别:PHP版本是动态的,会略微产生服务器的性能负载,而JS版本则需要浏览器支持JS才可以功能。不过目前来看,绝大部分浏览器都是支持的!

②、Nginx伪静态

之前的代码用的都是 “go.php?url=外链地址” 的形式,经常也看到有个别网站对外链跳转做了伪静态,也就是 “/go/外链” 这种形式。

这次,也试了下,感觉还不错,所以就整了下。只要在Nginx中加入如下规则即可:

I、PHP版本

# 外链跳转伪静态 php版本

rewrite ^/go/(.*)$ /go.php?url=$1 last; #注意go.php的实际路径,默认为网站根目录

II、JS 版本

# 外链跳转伪静态 js 版本

rewrite ^/go/(.*)$ /go.html?url=$1 last; #注意go.html 的实际路径,默认为网站根目录

实际上,将php版本保存为 index.php 或 将JS版本保存为 index.html,然后在网站根目录新建一个go文件夹,把 index.php 或 index.html 上传到go文件夹中,那么Nginx就可以使用一条通用规则了:

rewrite ^/go/([^\?]+)$ /go/?url=$1 last;

说白了,因为 index.php 或 index.html 是WEB读取的默认文件,其中 index.html 一般优先级比 index.php更高一些,所以只需要重写到go目录即可,至于你选择js版本还是php版本就看你index放的是php还是html了。

此段文字看不懂的话,请忽略之。

Ps:上述代码如果不知道放到哪,可以直接放在 location / { 的前面即可。加入伪静态规则,并且重启Nginx之后,我们就可以通过 "/go/外链加密串" 的方式进行跳转了。不过亲测发现无法使用 /go/http://zhangge.net/xxx 这样直接丢http地址的方式进行跳转,因为http://会读取为 http:/,少了一个斜杠,这个之前博客文章其实有提到过,这里就不深究了。

③、Apache伪静态

还是有不少网站用的是Apache服务器,所以还是补充一下Aapace伪静态规则:

RewriteRule ^go/(.*)$ /go.html?url=$1 [L]

将上述规则代码添加到 .htaccess 文件的第一行即可。

④、WordPress替换

做好了跳转页面,我们就需要将之前应用的相关函数都修改一下。其实就是将代码中的

/go/?url=外链

改成

/go/base64加密串

的模式,下面贴一下具体代码,请自行参考修改。

Ps:由于需要兼容之前的 /go/?url= 的形式,所以现在用的是/goto/伪静态形式,无此需求的网站可忽略之。

A. 文章外链替换

//文章外链跳转伪静态版

add_filter(‘the_content’,’link_jump’,999);

function link_jump($content){

preg_match_all(‘/<a(.*?)href="(.*?)"(.*?)>/’,$content,$matches);

if($matches){

foreach($matches[2] as $val){

if(strpos($val,’://’)!==false && strpos($val,home_url())===false && !preg_match(‘/\.(jpg|jepg|png|ico|bmp|gif|tiff)/i’,$val) && !preg_match(‘/(ed2k|thunder|Flashget|flashget|qqdl):\/\//i’,$val)){

$content=str_replace("href=\"$val\"", "href=\"".home_url()."/go/".base64_encode($val)."\" rel=\"nofollow\"",$content);

}

}

}

return $content;

}

B. 评论外链跳转

//评论者链接重定向

function commentauthor($comment_ID = 0) {

$url = get_comment_author_url( $comment_ID );

$author = get_comment_author( $comment_ID );

if ( empty( $url ) || ‘http://’ == $url ) {

echo $author;

} else {

if (!preg_match(home_url(),$url)) {

echo "<a href=’".home_url()."/go/".base64_encode($url)."’ rel=’nofollow’ target=’_blank’ class=’url’>$author</a>";

} else {

echo "<a href=’$url’ target=’_blank’ class=’url’>$author</a>";

}

}

}

C.  下载外链跳转

// 下载外链跳转

function links_nofollow($url) {

if(strpos($url,’://’)!==false && strpos($url,’zhangge.net’)===false && !preg_match(‘/(ed2k|thunder|Flashget|flashget|qqdl):\/\//i’,$url)) {

$url = str_replace($url, home_url()."/go/".base64_encode($url),$url);

}

return $url;

}

用过之前外链跳转的网站,应该都有上述ABC代码,只要参考上述代码,修改一下替换后的链接形式即可。部署后,刷新前台文章或评论,就能看到效果了。

资料来源:https://zhangge.net/5086.html