标签 WordPress 下的文章
为您的WordPress博客文章添加左右悬浮按钮
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 实战课
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/
企业主题
WordPress 技巧:上传图片自动重命名的几种办法
wordpress个性化站点统计
来自 http://www.zzhck.com/491.html
效果如下:
实现这个功能需要修改主题的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}
最后再次感谢王海达老师,他教会了我很多,自己动手,用心学习,前端代码没有秘密可言
WordPress去掉链接中的category
来自 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.最后你就可卸载掉该插件了。
d8主题流动公告代码分享
流动公告主要用到的是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
d8主题图片轮播效果二
来自 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>
wordpress文章分页及美化
来自 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-->
来实现分页功能,大家可以扩展一下,自己也在文本编辑器上也添加一个按钮!
分享一个wordpress下载样式
来自 http://www.zzhck.com/870.html
代码来自于:开溜网 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前端未审核留言提醒
转载: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 登录保护加强版
来自老赵茶馆: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为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技巧:蜘蛛爬行分析页面的实现
转自: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技巧:只保留当天的网络日志
之前有一篇文章《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获得的时间和日志里的比大小,大于指定天数覆盖写入,否则追加写入。