标签 WordPress 下的文章


开发

zh-cn:插件 API « WordPress Codex
zh-cn:主题开发 « WordPress Codex
zh-cn:子主题 « WordPress Codex
Template Hierarchy | Theme Developer Handbook | WordPress Developer Resources
Theme Check — WordPress Plugins
Options Framework — WordPress Plugins
zh-cn:开发一个插件 « WordPress Codex
zh-cn:函数参考 « WordPress Codex
主题猫-WordPress中文主题站-wordpress主题下载-wordpress主题-wordpress模板-wordpress企业主题
21 Best WordPress Starter Themes for Developers in 2016
HTML5 Blank WordPress boilerplate theme - build themes faster with HTML5 Blank
WordPress Themes & Website Templates from ThemeForest
WordPress中文文档:WordPress主题开发 | WordPress大学
有哪些wordpress企业网站主题推荐? - 知乎
大牛们是如何开发 WordPress 主题的? - 知乎
使用模版搭建的wordpress网站速度很慢,怎么办? - 知乎
WordPress Themes – Theme Hybrid
Web Design Software | WordPress Theme Generator- TemplateToaster
GenerateWP - User friendly tools for WordPress developers
The ThemeShaper WordPress Theme Tutorial: 2nd Edition – ThemeShaper
wordpress函数代码

插件

WordPress插件大全
WORDPRESS文章目录插件:CONTENT INDEX FOR WORDPRESS
WordPress文章目录插件
wordpress插件
挨踢牛 - 专注分享wordpress建站资源的个人博客

直接编辑wp-config.php,插入如下内容开启PHP的错误显示:

error_reporting(E_ALL); ini_set('display_errors', '1');

若测试博客的时候发现,网站打开总是空白。
打开wordpress的DEBUG功能查看问题,
这个功能在wp-config这个文件里打开,找到define('WP_DEBUG', false);这一行将false改为true即可

主题框架

https://codex.wordpress.org/Theme_Frameworks
阿树工作室的Ashuwp Framework
wordpress主题后台设置框架Options Framework使用教程

优化

让 WordPress 飞起来的几个 function

教程

阿树工作室
一学就会的 WordPress 实战课
https://www.wpdaxue.com/
http://blog.wpjam.com/tag/wordpres-tutorials/
Vue & REST API打造WordPress主题选项页
https://code.tutsplus.com/categories/wordpress
利用WordPress REST API 开发微信小程序从入门到放弃 && 作者博客

with vue

https://deliciousbrains.com/creating-a-wordpress-theme-using-the-rest-api-and-vue-js/
https://github.com/bstavroulakis/vue-wordpress-pwa
https://www.npmjs.com/package/vue-wordpress
https://segmentfault.com/a/1190000008715104

下载

http://www.weidea.net
https://www.downloadfreethemes.download/

主题

爱主题
wpcom
主题公园
WP酷
爱找主题
http://www.tvdrupal.com/wordpress_document.html
https://yigujin.cn/
http://zing.xintheme.cn/
http://panda.panda-studio.cn/

企业主题

UAZOH7
DChaser



来自 http://www.zzhck.com/491.html

效果如下:
1
实现这个功能需要修改主题的footer.php和css文件

在footer.php中,你想让出现的位置(左侧,中间,右侧)添加如下代码

<!--站点统计开始-->
<span class="btn-primary web-sta"><i class="icon-map-marker icon-white icon12"></i> 站内统计</span>      
<div class="statistics">
<h3>站内统计</h3>
<ul>
<li>建站日期:2014-07-31</li>
<li>运行天数:<?php echo floor((time()-strtotime("2014-07-31"))/86400); ?> 天</li>
<li>分类总数:<?php echo $count_categories = wp_count_terms('category'); ?> 个</li>
<li>日志总数:<?php $count_posts = wp_count_posts(); echo $published_posts = $count_posts->publish;?> 篇</li>
<li>标签数量:<?php echo $count_tags = wp_count_terms('post_tag'); ?> 个</li>
<li>评论总数:<?php echo $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->comments");?> 条</li>
<li>链接数量:<?php $link = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->links WHERE link_visible = 'Y'"); echo $link; ?> 个</li>
<li>最后更新:<?php $last = $wpdb->get_results("SELECT MAX(post_modified) AS MAX_m FROM $wpdb->posts WHERE (post_type = 'post' OR post_type = 'page') AND (post_status = 'publish' OR post_status = 'private')");$last = date('Y-n-j', strtotime($last[0]->MAX_m));echo $last; ?></li>
</ul>
</div>
<script type="text/javascript">
$(".footer-inner span.web-sta").hover(function(){
    $(".footer-inner .statistics").slideDown("slow");
},function(){
    $(".footer-inner .statistics").slideUp("slow");
});
</script>
<!--站点统计结束-->

然后修改主题的css文件,增加如下代码

/* 底部站点统计 */
span.web-sta{display:inline-block;height:22px;line-height:22px;padding:0 5px;margin:auto 0px auto 5px;cursor:pointer}
.footer .statistics{max-width:360px;border:1px solid #ddd;border-left:0;position:absolute;top:-156px;right:-1px;font-size:12px;background-color:#444;cursor:pointer;display:none}
.footer .statistics h3{border:0;border-bottom:1px dashed #ff8540;font-size:16px;height:25px;line-height:25px;padding:0px 20px 8px;text-align:left}
.footer .statistics ul{padding:5px 8px;position:relative}
.footer .statistics ul li{min-width:150px;display:inline-block;margin-left:10px;margin-bottom:5px}
.footer .statistics ul li:hover{background-color:#eee}

最后再次感谢王海达老师,他教会了我很多,自己动手,用心学习,前端代码没有秘密可言


来自 http://www.zzhck.com/617.html
相信很多人用了wordpress后都会选择去掉链接中的category,以前比较完美的方法是使用WP No Category Base之类的插件,使用插件有个好处就是301重定向,本站也正在使用Remove Category URL插件!但是插件多了,确实会影响一部分运行速度,比较占用内存和CPU!最近在各种折腾,能用代码的,尽量不用插件!感谢前辈们的分享精神,找到一种效果和WP No Category Base插件一样的代码,再次做个记录,也分享给大家!

将以下代码加在主题目录的functions.php(记住半角和?>前面
add_action('load-themes.php', 'no_category_base_refresh_rules');
// WordPress免插件去除链接categroy
register_activation_hook(__FILE__, 'no_category_base_refresh_rules');
add_action('created_category', 'no_category_base_refresh_rules');
add_action('edited_category', 'no_category_base_refresh_rules');
add_action('delete_category', 'no_category_base_refresh_rules');
function no_category_base_refresh_rules() {
 global $wp_rewrite;
 $wp_rewrite -> flush_rules();
}
register_deactivation_hook(__FILE__, 'no_category_base_deactivate');
function no_category_base_deactivate() {
 remove_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
 // We don't want to insert our custom rules again
 no_category_base_refresh_rules();
}
// Remove category base
add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
 global $wp_rewrite, $wp_version;
 if (version_compare($wp_version, '3.4', '<')) {
 // For pre-3.4 support
 $wp_rewrite -> extra_permastructs['category'][0] = '%category%';
 } else {
 $wp_rewrite -> extra_permastructs['category']['struct'] = '%category%';
 }
}
// Add our custom category rewrite rules
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
function no_category_base_rewrite_rules($category_rewrite) {
 //var_dump($category_rewrite); // For Debugging
 $category_rewrite = array();
 $categories = get_categories(array('hide_empty' => false));
 foreach ($categories as $category) {
 $category_nicename = $category -> slug;
 if ($category -> parent == $category -> cat_ID)// recursive recursion
 $category -> parent = 0;
 elseif ($category -> parent != 0)
 $category_nicename = get_category_parents($category -> parent, false, '/', true) . $category_nicename;
 $category_rewrite['(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
 $category_rewrite['(' . $category_nicename . ')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
 $category_rewrite['(' . $category_nicename . ')/?$'] = 'index.php?category_name=$matches[1]';
 }
 // Redirect support from Old Category Base
 global $wp_rewrite;
 $old_category_base = get_option('category_base') ? get_option('category_base') : 'category';
 $old_category_base = trim($old_category_base, '/');
 $category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';
 
 //var_dump($category_rewrite); // For Debugging
 return $category_rewrite;
}
// Add 'category_redirect' query variable
add_filter('query_vars', 'no_category_base_query_vars');
function no_category_base_query_vars($public_query_vars) {
 $public_query_vars[] = 'category_redirect';
 return $public_query_vars;
}
// Redirect if 'category_redirect' is set
add_filter('request', 'no_category_base_request');
function no_category_base_request($query_vars) {
 //print_r($query_vars); // For Debugging
 if (isset($query_vars['category_redirect'])) {
 $catlink = trailingslashit(get_option('home')) . user_trailingslashit($query_vars['category_redirect'], 'category');
 status_header(301);
 header("Location: $catlink");
 exit();
 }
 return $query_vars;
}
注意事项

如果你已经在用WP No Category Base之类插件的话就别用以上方法了,那个插件用了一次的话就必须得一直用下去;
不然文章页会无法访问,当然你也可以想办法把这个插件彻底卸载了,再用上面的方法!
还有就是把WP No Category Base之类的插件关闭自然也是没用的….切记!!!

关闭No Category之类的插件更换代码的方法:

1.把【固定连接】改为【默认】状态,然后,关闭【WP NO category base】插件
2.再改回之前的URL形式就可以了。
3.最后你就可卸载掉该插件了。


流动公告主要用到的是marquee元素实现的,详细的介绍大家自己百度
下面分享一下我现在用的流动公告代码,效果顶部自己预览

<marquee width="1000px" height="16px" direction="left" scrollamount="3" scrolldelay="5" onmouseover="this.stop()" onmouseout="this.start()">
<span style="color: #0000ff;">贰月叁拾</span>——<span style="color: #ff0000;">欢迎您的到来,期待您能够有所收获!有问题请<a title="留言板" href="http://www.zzhck.com/liuyan">点击这里</a>,给我留言吧!</span></marquee>

复制修改后,直接粘贴到d8主题设置的最新消息里,保存!好了,一切搞定,同样这串代码也可以用在其他地方了,希望大家活学活用!
来自 http://www.zzhck.com/338.html


来自 http://www.zzhck.com/796.html

代码是年前林子分享给我的,非常感谢他!
然后我...

新版轮播代码特点:

1.支持自适应大小
2.可以鼠标选择想看那一张
3.当然你也可以加上超级链接
4.更加简洁易用

详细代码如下,大家可以添加到d8主题设置的导航下方广告位

<style type="text/css">
body{min-width:320px;background-color:#f6f7f7;}
a,img{border:0;}
.index_banner{position:relative;height: auto}
.index_banner ul{overflow:hidden;}
.index_banner li{position:absolute;top:0;left:0;overflow:hidden;width:100%;height:350px;}
.index_banner li a{display:block;margin:0 auto;}
.index_banner cite{position:absolute;bottom:10px;left:50%;z-index:999;display:block;margin-left:-144px;width:288px;height:15px;_display:none;}
.index_banner cite span{float:left;display:block;margin:0 4px;width:40px;height:8px;background-color:#e5e5e5;text-indent:-999em;opacity:.8;cursor:pointer;}
.index_banner cite span:hover{background-color:#f5f5f5;}
.index_banner cite span.cur{background-color:#1d8bd8;cursor:default;}
.clear{clear:both;}
</style>
 
<!-- div -->
<div class="index_banner" id="banner_tabs">
    <ul>
        <li><img src="http://www.zzhck.com/static/img/1.jpg" alt="贰月叁拾" width="100%"></li>
        <li><img src="http://www.zzhck.com/static/img/2.jpg" alt="贰月叁拾" width="100%"></li>      
        <li><img src="http://www.zzhck.com/static/img/3.jpg" alt="贰月叁拾" width="100%"></li>    
        <li><img src="http://www.zzhck.com/static/img/4.jpg" alt="贰月叁拾" width="100%"></li>
        <li><img src="http://www.zzhck.com/static/img/5.jpg" alt="贰月叁拾" width="100%"></li>        
    </ul>
    <!--此处的img是用来占位的,在实际使用中,可以另外制作一张全空的图片-->
    <img style="visibility:hidden;" src="http://www.zzhck.com/static/img/0.png" alt="贰月叁拾" width="100%">
    <cite>
        <span class="cur">1</span>
        <span>2</span>
        <span>3</span>
        <span>4</span>
        <span>5</span>        
    </cite>
    <div class="clear"></div>
</div>
<!-- 下JS -->
<script type="text/javascript">
(function(){
    if(!Function.prototype.bind){
        Function.prototype.bind = function(obj){
            var owner = this,args = Array.prototype.slice.call(arguments),callobj = Array.prototype.shift.call(args);
            return function(e){e=e||top.window.event||window.event;owner.apply(callobj,args.concat([e]));};
        };
    }
})();
var banner_tabs = function(id){
    this.ctn = document.getElementById(id);
    this.adLis = null;
    this.btns = null;
    this.animStep = 0.2;//动画速度0.1~0.9
    this.switchSpeed = 3;//自动播放间隔(s)
    this.defOpacity = 1;
    this.tmpOpacity = 1;
    this.crtIndex = 0;
    this.crtLi = null;
    this.adLength = 0;
    this.timerAnim = null;
    this.timerSwitch = null;
    this.init();
};
banner_tabs.prototype = {
    fnAnim:function(toIndex){
        if(this.timerAnim){window.clearTimeout(this.timerAnim);}
        if(this.tmpOpacity <= 0){
            this.crtLi.style.opacity = this.tmpOpacity = this.defOpacity;
            this.crtLi.style.filter = 'Alpha(Opacity=' + this.defOpacity*100 + ')';
            this.crtLi.style.zIndex = 0;
            this.crtIndex = toIndex;
            return;
        }
        this.crtLi.style.opacity = this.tmpOpacity = this.tmpOpacity - this.animStep;
        this.crtLi.style.filter = 'Alpha(Opacity=' + this.tmpOpacity*100 + ')';
        this.timerAnim = window.setTimeout(this.fnAnim.bind(this,toIndex),50);
    },
    fnNextIndex:function(){
        return (this.crtIndex >= this.adLength-1)?0:this.crtIndex+1;
    },
    fnSwitch:function(toIndex){
        if(this.crtIndex==toIndex){return;}
        this.crtLi = this.adLis[this.crtIndex];
        for(var i=0;i<this.adLength;i++){
            this.adLis[i].style.zIndex = 0;
        }
        this.crtLi.style.zIndex = 2;
        this.adLis[toIndex].style.zIndex = 1;
        for(var i=0;i<this.adLength;i++){
            this.btns[i].className = '';
        }
        this.btns[toIndex].className = 'cur'
        this.fnAnim(toIndex);
    },
    fnAutoPlay:function(){
        this.fnSwitch(this.fnNextIndex());
    },
    fnPlay:function(){
        this.timerSwitch = window.setInterval(this.fnAutoPlay.bind(this),this.switchSpeed*1000);
    },
    fnStopPlay:function(){
        window.clearTimeout(this.timerSwitch);
    },
    init:function(){
        this.adLis = this.ctn.getElementsByTagName('li');
        this.btns = this.ctn.getElementsByTagName('cite')[0].getElementsByTagName('span');
        this.adLength = this.adLis.length;
        for(var i=0,l=this.btns.length;i<l;i++){
            with({i:i}){
                this.btns[i].index = i;
                this.btns[i].onclick = this.fnSwitch.bind(this,i);
                this.btns[i].onclick = this.fnSwitch.bind(this,i);
            }
        }
        this.adLis[this.crtIndex].style.zIndex = 2;
        this.fnPlay();
        this.ctn.onmouseover = this.fnStopPlay.bind(this);
        this.ctn.onmouseout = this.fnPlay.bind(this);
    }
};
var player1 = new banner_tabs('banner_tabs');
</script>

来自 http://www.zzhck.com/815.html
可最近发表长文章,才发现到d8主题默认分页按钮无效,感觉很是纠结
今天忙完工作,参看了网络上各位前辈的代码,在本地做了各种尝试,发现了昂然前辈的一篇文章,可以完美解决wp主题不带有分页功能的问题
代码来源于:http://www.gaoxing.me/nextpage/
大家追求简洁效果的可以直接去看一下这篇文章,我这里只分享一下美化的代码
1.寻找主题目录中的single.php文件,搜索以下代码:

<?php the_content(); ?>

2.找到后在此行代码之下添加如下代码:

<?php wp_link_pages(array('before' => '<div class="fenye">分页阅读:', 'after' => '',
 'next_or_number' => 'next', 'previouspagelink' => '上一页', 'nextpagelink' => "")); ?>  
 <?php wp_link_pages(array('before' => '', 'after' => '', 'next_or_number' => 'number',
 'link_before' =>'<span>', 'link_after'=>'</span>')); ?>  
 <?php wp_link_pages(array('before' => '', 'after' => '</div>',
 'next_or_number' => 'next', 'previouspagelink' => '', 'nextpagelink' => "下一页")); ?>

3.保存single.php文件,为了让大家看一下分页效果,第四部操作请看下页!
4.打开主题的css文件,一般是style.css文件,在文件的末尾添加如下代码:

.fenye {text-align:center;margin:0px auto 10px;}  
.fenye span {background-color:#C73503;color:#fff;font-weight: bold;
margin:0px 1px;padding:3px 6px;text-decoration:none;border:1px solid #D2D2D2;}  
.fenye a {text-decoration:none;}  
.fenye a span {background-color:#F6F6E8;font-weight: normal;
color: #000;text-decoration: none;}  
.fenye a:hover span {background-color:#c73503;color: #fff;}

好了,一切大功告成,发表新文章时,可以直接用可视化编辑器中的分页按钮或者在文本编辑器中插入:

<!--nextpage-->

来实现分页功能,大家可以扩展一下,自己也在文本编辑器上也添加一个按钮!


来自 http://www.zzhck.com/870.html
1
2
代码来自于:开溜网 http://www.kailiuwang.net/wordpress-download-style-share.html
1.css样式代码:

div#download          
{         
    background: url(images/download.png) no-repeat;          
    height:79px;         
    margin:25px 5px 15px 25px;         
    border:solid 1px white;         
    list-style-type:none;         
    width:700px;         
}         
div#download ul          
{         
    list-style: none outside none;         
    margin: 0;         
    padding: 0;         
    width: 10000px;         
    list-style-type:none;         
}         
div#downloadline         
{         
    overflow: hidden;         
    border-left: 1px solid #CDCDCD;         
    width:500px;         
    height:75px;         
    margin-top:2px;         
    margin-left:120px;         
}         
div#download li{margin:0;padding:0;float: left;margin-right:-27px;margin-right:0 \9;}         
div#download li a          
{         
    border-right: 1px solid #CDCDCD;         
    color: #0093DC;         
    text-decoration: none;         
    display: block;         
    float: left;         
    font-size: 16px;         
    font-weight: 700;         
    height: 80px;         
    line-height: 80px;         
    padding-right:10px;         
    font-family: "Microsoft Yahei",微软雅黑,"Segoe UI",Calibri,"Myriad Pro",Myriad,"Trebuchet MS",Helvetica,Arial,sans-serif;         
    overflow:hidden;         
    text-indent:40px;         
}              
div#download li a:hover          
{         
    color: red;         
}             
div#download li a.down         
{         
    background: url(images/custom/download_for_windows_h.gif) no-repeat 5px 22px;            
}              
div#download li a.down:hover         
{         
    background: url(images/custom/download_for_windows.gif) no-repeat 5px 22px;          
}            
div#download li a.down_mac         
{         
    background: url(images/custom/download_for_mac_h.gif) no-repeat 5px 22px;         
}             
div#download li a.down_mac:hover         
{         
    background: url(images/custom/download_for_mac.gif) no-repeat 5px 22px;          
}           
div#download li a.down_linux         
{         
    background: url(images/custom/download_for_linux_h.gif) no-repeat 5px 22px;          
}              
div#download li a.down_linux:hover         
{         
    background: url(images/custom/download_for_linux.gif) no-repeat 5px 22px;          
}              
div#download li a.demo         
{         
    background: url(images/custom/google_custom_search_h.gif) no-repeat 5px 22px;            
}            
div#download li a.demo:hover         
{         
    background: url(images/custom/google_custom_search.gif) no-repeat 5px 22px;          
}

2.使用方法

在发表日志时,选择文本编辑器调用,当然你也可以进一步改成短代码,代码中的下载地址至少保留一个

<div id="download">   
<div id="downloadline">   
<ul>   
     <li><a class="demo" href="http://kailiuwang.net" target="_blank">在线下载</a></li>   
     <li><a class="down_mac" href="http://kailiuwang.net" target="_blank">115网盘</a></li>   
     <li><a class="down_linux" href="http://kailiuwang.net" target="_blank">百度网盘</a></li>   
     <li><a class="down" href="http://kailiuwang.net" target="_blank">千易网盘</a></li>   
</ul>   
</div>   
</div>

3.下载样式所用到的图片

下载下方的压缩包文件,将压缩包中的背景图片download.PNG放入主题的images文件夹中,然后将压缩包中的 custom文件夹 放入images文件夹中。喜欢折腾的朋友可以把css中的图片的路径根据自己的实际需求进行更改!
下载地址:

这个用typecho







转载:WordPress前端未审核留言提醒
这个实用的小功能找了很久,终于在[这里]2找到了答案。

他把提醒放到了标题里滚动显示了,我改成直接像多说一样显示,PHP代码如下:

// 返回网站中未审核留言数
function get_not_audit_comments(){
    if(is_home() && current_user_can('level_10')){    //只有在首页,并且管理员登录是才执行
        $awaiting_mod = wp_count_comments();
        $awaiting_mod = $awaiting_mod->moderated;
        if($awaiting_mod){
            //当存在未审核留言
            echo "<div id=\"awaiting_comments\"><a href=".admin_url( 'edit-comments.php' ).'><i class=\'fa fa-comments\'></i>你有'.$awaiting_mod.'条新回复</a></div>';
         }
    }
}
add_filter('wp_footer','get_not_audit_comments');

CSS代码如下:

#awaiting_comments{
    position:fixed;
    top: 65px;
    right: 24px;
    z-index:9999;
    max-width: 180px;
    _width:130px;
    display:block;
    float:none;
    padding: 5px 12px;
    background-color:#fff;
    -webkit-border-radius:5px;
    border-radius:5px;
    box-shadow:0 1px 1px rgba(0,0,0,0.25);
    border:1px solid #aaa;
}
 
#awaiting_comments i{
    margin-right: 7px;
}
 
#awaiting_comments a{
    line-height: 1;
    color:#d32;
    text-decoration:none;
}

在网站标题中加入未审核留言提醒

前两天看了一套wordpress主题,感觉其中的一个很小的功能很不错(你可以查看本文网页标题)。当网站有新的留言,管理员登录之后,在网站首页的标题上就可以看到消息提醒,很是方便。看了主题源码,没有找到相应的代码。之后通过查找网站后台的模板,才知道可以通过wp_count_comments()来得到相关的信息。 其它的,咱也不多说了,直接来说怎么做吧!把以下的代码复制到主题的functions.php文件中。

// 返回网站中未审核留言数
function get_not_audit_comments(){
    if(is_home() && current_user_can('level_10')){    //只有在首页,并且管理员登录是才执行
        $awaiting_mod = wp_count_comments();
        $awaiting_mod = $awaiting_mod->moderated;
        if($awaiting_mod){
            //当存在未审核留言
            echo "<div style=\"display:none;\" id=\"awaiting_mod\">【有".$awaiting_mod.'条未审核留言】-</div>';
            echo '<script type=\'text/javascript\' src=\'';
            bloginfo('stylesheet_directory');
            echo '/js/titlemove.js\'></script>';
         }
    }
}
add_filter('wp_footer','get_not_audit_comments');

接着,把下面的代码另存为titlemove.js,并放到当前主题的js文件夹中(如果不存在的话,你可以直接创建)。

function titlemove(){
    var msg =document.getElementById('awaiting_mod').textContent + window.document.title;
    setInterval(function(){
        msg = msg.substring(1,msg.length) + msg.substring(0,1);
        window.document.title = msg;
    },500);
}
jQuery(function(){
    titlemove();
});

由于以上代码,部分是依赖于jQuery库,所以请确保你已经加载了jQuery库。 完成以上操作,登录后返回到网站的首页,如果存在未审核留言的话,你应该就会看到类似本文标题连环滚动的样子了。


来自老赵茶馆:WordPress 登录保护加强版
事关自从添加了登录失败的邮件通知后,一直有人反馈说有机器人暴力破解,而收到一大堆邮件。不过实际上只要你的用户们和密码足够复杂,机器人没几万年也破解不了。

请看下面所谓的修改后台登录地址的保护方法:

//保护后台登录
add_action('login_enqueue_scripts','login_protection');  
function login_protection(){  
    if($_GET['admin'] != 'true')header('Location: http://lazyhood.com/');  
}

这种方法只等挡住人为的破解,机器人压根不会访问Wordpress后台的登录地址,而是通过以post方式提交的登录请求的。

所以只能想办法了,一就是安装一些登录保护插件例如lockdown,一就是添加保护代码到functions.php,我选择后者。谷歌后得到的答案是这样子的,提供了三重登录保护。

首先是阻止与HTTP 1.0的任何登录POST请求,因为常见的机器人都是使用HTTP1.0,这应该有效地阻止他们登录:

//过滤HTTP 1.0的登录POST请求
function wlp_filter_http() {
  if(preg_match('/1.0/',$_SERVER['SERVER_PROTOCOL'])) { wlp_forbidden(); }
}
add_action('login_init','wlp_filter_http');

然后是通过设置一个cookie的初始值,如果cookie不存在POST请求,登录会被阻止:

// POST Cookie 保护
function wlp_set_login_protection_cookie() {
  if( strtoupper($_SERVER['REQUEST_METHOD'])=='GET' and
      !isset($_COOKIE['wlp_post_protection']) ) {
    setcookie('wlp_post_protection','1',time()+60*60*24);
    $_COOKIE['wlp_post_protection'] = '1';
  }
}
 
function wlp_post_protection() {
  if( strtoupper($_SERVER['REQUEST_METHOD'])=='POST' and
      !isset($_COOKIE['wlp_post_protection']) ) {
    wlp_forbidden();
  }
}
add_action('init','wlp_set_login_protection_cookie');
add_action('login_init','wlp_post_protection');

最后是增加额外登录验证,这将增加一层额外的WordPress的登录页面,这是一个更积极的做法,而应完全防止任何从机器人甚至试图WordPress的登录,不同于修改你的网络服务器配置,以增加基本身份验证,这种方法不会破坏AJAX行为的功能。

// 增加额外登录验证
function wlp_basic_auth() {
  if( !isset($_SERVER['PHP_AUTH_USER']) or !isset($_SERVER['PHP_AUTH_PW']) )
    wlp_unauthorized(__('No credentials have been provided.', 'memberpress'));
  else {
    $user = wp_authenticate($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
 
    if(is_wp_error($user))
      wlp_unauthorized( $user->get_error_message() );
  }
}
function wlp_unauthorized($message) {
  header('WWW-Authenticate: Basic realm="' . get_option('blogname') . '"');
  header('HTTP/1.0 401 Unauthorized');
  die(sprintf(__('UNAUTHORIZED: %s', 'memberpress'),$message));
}
add_action('login_init','wlp_basic_auth');

最最后的一步是当登录失败时,让服务器返回403状态:

// 登录错误,返回403状态
function wlp_forbidden() {
  header("HTTP/1.0 403 Forbidden");
  exit;
}


来自老赵茶馆的使用jQuery.qrcode为WordPress文章动态生成二维码

jQuery.qrcode地址:link
在线生成器:link

网上流传的方法是采用外网的API方式生成,好处是简单粗暴,缺点是自定义不够;我主题使用的是jQuery.qrcode,好处是自定义功能丰富,缺点是要加载额外js。
首先是载入jQuery,载入jQuery.qrcode,然后在single.php里加入以下代码:

<script>
jQuery(window).load(function() {
    jQuery("#qrcode").qrcode({
        text: "<?php the_permalink(); ?>"
    });
});
</script>

当然,这是最简单的配置,再加些css美化下就OK了,下面说说所有配置的,可按需添加。

{
    // 渲染方式默认有html5的画布canvas,还有image、div
    render: 'canvas',
 
    // 版本version范围为1到40,就是格子的密度
    minVersion: 1,
    maxVersion: 40,
 
    // 容错率从低到高四种模式: 'L', 'M', 'Q' or 'H'
    ecLevel: 'L',
 
    // 如果画布渲染时的上像素偏移
    left: 0,
    top: 0,
 
    // 像素大小
    size: 200,
 
    // 填充颜色
    fill: '#000',
 
    // 背景颜色
    background: null,
 
    // 内容,可以使文本或者网址
    text: 'no text',
 
    // 圆角: 0.0 到 0.5
    radius: 0,
 
    // 空白的边界
    quiet: 0,
 
    //模式
    // 0: normal,正常模式即最简洁模式
    // 1: label strip,可插入标签条
    // 2: label box,可插入标签盒子
    // 3: image strip,可插入图像条
    // 4: image box,可插入图像盒子
    mode: 0,
 
    // 分别是标签或图像的缩放,x偏移,y偏移
    mSize: 0.1,
    mPosX: 0.5,
    mPosY: 0.5,
 
    // 标签文字、字体、颜色
    label: 'no label',
    fontname: 'sans',
    fontcolor: '#000',
 
    // 图像的地址
    image: null
}

就这么简单,就是有一个难点,就是模式3和模式4的插入图像问题,你不能直接在image选项后面直接填入图像地址,那样会报错。作者解释说道,在运行生成二维码之前,图像必须先载入,然后通过选择器填入image选项。
就是说,图像必须在二维码之前载入,那就简单,我把图像载入但是通过css把它隐藏掉

<div id="qrcode">
     <img id="qrcode_img" style="display:none" src="/images/qr-img.png">
</div>
 
 
...
 
<script>
jQuery(window).load(function() {
    jQuery("#qrcode").qrcode({
        mode: 4,
    image: jQuery('#qrcode_img')[0],
        text: "<?php the_permalink(); ?>"
    });
});
</script>
 
...





















转自:WordPress技巧:蜘蛛爬行分析页面的实现
自从博客上方导航条加了一个蜘蛛爬行页面以来,断断续续有人问如何实现,也分别断断续续地回答过,可能回答得也不完整,所以这次索性开帖写一下完整的实现过程。另外,tiandi想说的是,这个功能只是一个“看”,并没有SEO的优化效果。好了,让我们言归正传,开始一步一步实现。

第一步,生成网站访问日志,我们需要通过日志来获取蜘蛛爬行的记录,如何生成网站访问日志,请看《WordPress技巧:生成网站访问日志

第二步,有了日志,我们就得分析日志,从而得出哪些访问记录是属于用户正常访问的,哪些是属于蜘蛛爬行的。在主题的function里插入以下代码,目的是创建短代码spiderlogs,该段代码可用参数text,默认为yes,生成文本描述+圆饼图,如只需要显示圆饼图,则设置text为no即可。代码比较长,感兴趣的可以自己编辑蜘蛛的特征。

function get_spider_log($atts) {
    extract(shortcode_atts(array(
    'text' => 'yes'),$atts));
    $fh = fopen(site_url() ."/mylogs.txt", "r");
    $contents = "";
        while(!feof($fh)){
        $contents .= fread($fh, 8080);
    }
    fclose($fh);
    $str = "";
    $showtime=date("md");
    if($text == "yes") {
        $str.= "当天蜘蛛爬行记录:";    
        $str.= "<div style='background-color:#33A1C9;color:white;text-align:center;'>以下为国内常用蜘蛛。</div>";
    }
    $mytmp = array();
    //google
    $google = 0;
    if($text == "yes")
        $str.= "<a href=http://www.google.com/bot.html target=_blank>Google Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Googlebot\/",$text);
    $google += $mytmp[0];
    $str.= $mytmp[1];
    $mytmp = show_spider_result($showtime,$contents,"Googlebot-Image\/",$text);
    $google += $mytmp[0];
    $str.= $mytmp[1];
    $mytmp = show_spider_result($showtime,$contents,"Googlebot-Mobile\/",$text);
    $google += $mytmp[0];
    $str.= $mytmp[1];
    $mytmp = show_spider_result($showtime,$contents,"Feedfetcher-Google",$text);
    $google += $mytmp[0];
    $str.= $mytmp[1];

    // baidu
    $baidu = 0;
    if($text == "yes")
        $str.= "<br><a href=http://www.baidu.com/search/spider.html target=_blank>Baidu Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Baiduspider\/",$text);
    $baidu += $mytmp[0];
    $str.= $mytmp[1];
    $mytmp = show_spider_result($showtime,$contents,"Baiduspider-image",$text);
    $baidu += $mytmp[0];
    $str.= $mytmp[1];

    //bing
    $bing = 0;
    if($text == "yes")
        $str.= "<br><a href=http://www.bing.com/bingbot.htm target=_blank>bingbot Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"bingbot\/",$text);
    $bing += $mytmp[0];
    $str.= $mytmp[1];
    $mytmp = show_spider_result($showtime,$contents,"msnbot-media\/",$text);
    $bing += $mytmp[0];
    $str.= $mytmp[1];

    //sogou
    $sogou = 0;
    if($text == "yes")
        $str.= "<br><a href=http://www.sogou.com/docs/help/webmasters.htm#07 target=_blank>Sogou Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Sogou web spider\/",$text);
    $sogou += $mytmp[0];
    $str.= $mytmp[1];

    //soso
    $soso = 0;
    if($text == "yes")
        $str.= "<br><a href=http://help.soso.com/webspider.htm target=_blank>Soso Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Sosospider\/",$text);
    $soso += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<div style='background-color:#FA8072;color:white;text-align:center;'>以下为垃圾蜘蛛,可屏蔽抓取。</div>";
    //jike
    $else = 0;
    if($text == "yes")
        $str.= "<a href=http://shoulu.jike.com/spider.html target=_blank>Jike Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"JikeSpider",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    //easou
    if($text == "yes")
        $str.= "<br><a href=http://www.easou.com/search/spider.html target=_blank>Easou Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"EasouSpider",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    //yisou
    if($text == "yes")
        $str.= "<br>YisouSpider:";
    $mytmp = show_spider_result($showtime,$contents,"YisouSpider",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<br><a href=http://yandex.com/bots target=_blank>YandexBot Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"YandexBot\/",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<br><a href=http://go.mail.ru/help/robots target=_blank>Mail.RU Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Mail.RU_Bot\/",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<br><a href=http://www.acoon.de/robot.asp target=_blank>AcoonBot Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"AcoonBot\/",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<br><a href=http://www.exabot.com/go/robot target=_blank>Exabot Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Exabot\/",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<br><a href=http://www.seoprofiler.com/bot target=_blank>spbot Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"spbot\/",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];
    
    $str.= draw_canvas($google,$baidu,$bing,$sogou,$soso,$else);
    return $str;
}
function show_spider_result($time,$contents,$str,$text){
    $count = array();
    $count[0] = preg_match_all("/".$time."\d*\s\/\S*\s.*".$str."/",$contents,$mymatches);
    if($text == "yes") {
        $str = preg_replace("{\\\/}","",$str);
        $count[1].= "<br> 蜘蛛类型=>".$str.": 爬行次数=".$count[0];
        if($count[0] >0) {
            $tmp = substr($mymatches[0][$count[0]-1],4,6);
            $tmp = substr($tmp,0,2) .":" . substr($tmp,2,2) .":" .substr($tmp,4,2) ;
            $count[1].= " 最后爬行时间:". $tmp;
        }
    }
    return $count;
}
function draw_canvas($google,$baidu,$bing,$sogou,$soso,$else){
    $tmp = $google + $baidu + $bing + $sogou + $soso + $else;
    if($tmp == 0) {
        return "<br><br>数据不足,无法生成分析图。<br><br>";
    }
    $google2 = $google*100/$tmp;
    $baidu2 = $baidu*100/$tmp;
    $bing2 = $bing*100/$tmp;
    $sogou2 = $sogou*100/$tmp;
    $soso2 = $soso*100/$tmp;
    $else2 = $else*100/$tmp;
    $str.= "<br><div style='border-top: 1px solid #e6e6e6;'><br>
    <div style='float:left;width:150px;border-width:1px;border-style:groove;padding:15px;'><b>蜘蛛爬行分析图:</b><br>";
    $str.= "日期:" . date("Y-m-d");
    $str.= "<br>蜘蛛一共爬行". $tmp . "次:<br>";
    $str.= "<li><span style='color:#33A1C9;'>google:". $google ."次(". intval($google2) ."%)</span></li>";
    $str.= "<li><span style='color:#0033ff;'>baidu:". $baidu ."次(". intval($baidu2) ."%)</span></li>";
    $str.= "<li><span style='color:#872657;'>bing:". $bing ."次(". intval($bing2) ."%)</span></li>";
    $str.= "<li><span style='color:#FF9912;'>sogou:". $sogou ."次(". intval($sogou2) ."%)</span></li>";
    $str.= "<li><span style='color:#FF6347;'>soso:". $soso ."次(". intval($soso2) ."%)</span></li>";
    $str.= "<li><span style='color:#55aa00;'>else:". $else ."次(". (100 - intval($google2) - intval($baidu2) - intval($bing2) - intval($sogou2) - intval($soso2)) ."%)</span></li></div>";
    $str.=    "<img src = 'http://chart.apis.google.com/chart?cht=p3&chco=33A1C9,0033ff,872657,FF9912,FF6347,55aa00&chd=t:".$google2 .",".$baidu2.",".$bing2.",".$sogou2.",".$soso2.",".$else2."&chs=400x200&chl=google|baidu|bing|sogou|soso|else' /></div><br>";
    return $str;
}
add_shortcode('spiderlogs','get_spider_log');

第三步,也是最后一步,在任意页面,调用短代码[ spiderlogs ]即可,(实际使用中,请去除括号内的空格)。还有不明白的可以留言。


转载:WordPress技巧:只保留当天的网络日志
之前有一篇文章《WordPress技巧:生成网站日志》,不少读者看了后反映该日志每天都会追加生成,文件会越来越大,而tiandi自己的网站日志则是只保留一天,第二天会自动覆盖前一天的日志文件,那么如何只生成当天的日志文件呢?其实很简单,只要在原先代码的基础上加一个时间判定变OK了。

这里,我只列出上文中有关的function,原先的代码如下:

function make_log_file(){
        //log文件名
    $filename = 'mylogs.txt'; 
        //去除rc-ajax评论以及cron机制访问记录
    if(strstr($_SERVER["REQUEST_URI"],"rc-ajax")== false 
        && strstr($_SERVER["REQUEST_URI"],"wp-cron.php")== false ) {
        $word .= date('mdHis',$_SERVER['REQUEST_TIME'] + 3600*8) . " ";
                //访问页面
        $word .= $_SERVER["REQUEST_URI"] ." ";
                //协议
        $word .= $_SERVER['SERVER_PROTOCOL'] ." ";
                //方法,POST OR GET
        $word .= $_SERVER['REQUEST_METHOD'] . " ";
        //$word .= $_SERVER['HTTP_ACCEPT'] . " ";
                //获得浏览器信息
        $word .= getbrowser(). " ";
                //传递参数
        $word .= "[". $_SERVER['QUERY_STRING'] . "] ";
                //跳转地址
        $word .= $_SERVER['HTTP_REFERER'] . " ";
                //获取IP
        $word .= getIP() . " ";
        $word .= "\n";
        $fh = fopen($filename, "a");
        fwrite($fh, $word);    
        fclose($fh);
    }
}

将末尾部分的

$word .= getIP() . " ";
$word .= "\n";
$fh = fopen($filename, "a");
fwrite($fh, $word);    
fclose($fh);

替换为以下即可:

$word .= getIP() . " ";
$word .= "\n";
$day = date('md',$_SERVER['REQUEST_TIME'] + 3600*8);    
if (file_exists($filename)) {
$fh = fopen($filename, "r");
$data = fread($fh, 10);
if(substr($data,0,4) == $day) 
    $fh = fopen($filename, "a");
else 
    $fh = fopen($filename, "w");
fwrite($fh, $word);    
fclose($fh);

这样程序检测到当前日期和当前日志里的日期不一致时,就会自动覆盖日志,从而达到只保留当天日志的需求。至于如何保留指定天数的日志么,也很简单,这里tiandi只说下实现的方法,把上面的$day获得的时间和日志里的比大小,大于指定天数覆盖写入,否则追加写入。