2010年11月13日星期六

Centos5下安装PPTPD(含一键包)

1.删除之前已安装的相关软件:

1
2
3
  yum remove -y pptpd ppp
rm -rf /etc/pptpd.conf
rm -rf /etc/ppp

删除iptables规则:

1
  iptables --flush POSTROUTING --table nat

2.下载相关软件:

3.安装相关软件

1
2
3
4
5
6
  yum -y install make libpcap iptables gcc-c++ logrotate tar vim-minimal cpio perl pam tcp_wrappers
rpm -ivh dkms-2.0.17.5-1.noarch.rpm
rpm -ivh kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
rpm -qa kernel_ppp_mppe
rpm -Uvh ppp-2.4.4-9.0.rhel5.i386.rpm
rpm -ivh pptpd-1.3.4-1.rhel5.1.i386.rpm

4.相关配置:
a.ppp配置:

1
  mknod /dev/ppp c 108 0

设置vps启动时加载此项,编辑/etc/rc.local,加入:

1
  mknod /dev/ppp c 108 0

修改配置文件/etc/ppp/options.pptpd,加入:

1
2
  ms-dns 8.8.8.8
ms-dns 8.8.4.4

b.配置文件/etc/sysctl.conf,修改

1
  net.ipv4.ip_forward = 0

为:

1
  net.ipv4.ip_forward = 1

然后执行:

1
  /sbin/sysctl -p

c.配置文件/etc/pptpd.conf,加入:

1
2
  localip 192.168.9.1
remoteip 192.168.9.11-30

d.修改配置文件/etc/ppp/chap-secrets,加入:

1
2
3
  # Secrets for authentication using CHAP
# client server secret IP addresses
myusername pptpd mypassword *

PS:myusername为vpn用户名,mypassword为密码
5.启动iptables.加入规则,启动pptpd

1
2
3
4
5
6
7
8
  iptables -t nat -A POSTROUTING -s 192.168.9.0/255.255.255.0 -j SNAT --to-source `ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk 'NR==1 { print $1}'`
service iptables save
 
chkconfig iptables on
chkconfig pptpd on
 
service iptables start
service pptpd start

安装一键包地址:pptpd.sh

Linux常用命令

目录操作:
rm -rf mydir /*删除mydir目录*/
cd mydir /*进入mydir目录*/
cd � /*回上一级目录*/
cd .. /*回父目录,中间有空格*/
cd ~ /*回根目录*/
mv tools tool /*把tools目录改名为tool */
ln -s tool bac /*给tool目录创建名为bac的符号链接,最熟悉的应该就是FTP中www链接到public_html目录了*/
cp -a tool /home/vpser/www /*把tool目录下所有文件复制到www目录下 */

文件操作:
rm go.tar /* 删除go.tar文件 */
find mt.cgi /* 查找文件名为mt.cgi的文件 */
df �h /* 查看磁盘剩余空间,好像没这个必要,除非你太那个了 */

解压缩:
tar xvf wordpress.tar /* 解压tar格式的文件 */
tar -tvf myfile.tar /* 查看tar文件中包含的文件 */
tar cf toole.tar tool /* 把tool目录打包为toole.tar文件 */
tar cfz vpser.tar.gz tool /* 把tool目录打包且压缩为vpser.tar.gz文件,因为.tar文件几乎是没有压缩过的,MT的.tar.gz文件解压成.tar文件后差不多是 10MB */
tar jcvf /var/bak/www.tar.bz2 /var/www/ /*创建.tar.bz2文件,压缩率高*/
tar xjf www.tar.bz2 /*解压tar.bz2格式*/
gzip -d ge.tar.gz /* 解压.tar.gz文件为.tar文件 */
unzip phpbb.zip /* 解压zip文件,windows下要压缩出一个.tar.gz格式的文件还是有点麻烦的 */
下载:
wget http://www.vpsyou.com/lnmp/lnmp.zip / *下载远程服务器上的文件到自己的服务器,连上传都省了,服务器不是100M就是1000M的带宽,下载一个2-3兆的MT还不是几十秒的事 */
wget -c http://www.vpsyou.com/lnmp/lnmp.zip /* 继续下载上次未下载完的文件 */

进程管理:
ps -aux /*ps 进程状态查询命令*/

  ps命令输出字段的含义:

[*]USER,进程所有者的用户名。
[*]PID,进程号,可以唯一标识该进程。
[*]%CPU,进程自最近一次刷新以来所占用的CPU时间和总时间的百分比。
[*]%MEM,进程使用内存的百分比。
[*]VSZ,进程使用的虚拟内存大小,以K为单位。
[*]RSS,进程占用的物理内存的总数量,以K为单位。
[*]TTY,进程相关的终端名。
[*]STAT,进程状态,用(R�运行或准备运行;S�睡眠状态;I�空闲;Z�冻结;D�不间断睡眠;W-进程没有驻留页;T停止或跟踪。)这些字母 来表示。
[*]START,进程开始运行时间。
[*]TIME,进程使用的总CPU时间。
[*]COMMAND,被执行的命令行。
  ps -aux | grep nginx /*在所有进程中,查找nginx的进程*/

  kill 1234 /*1234为进程ID,即ps -aux 中的PID*/

  killall nginx /*killall 通过程序的名字,直接杀死所有进程,nginx为进程名*/

Vim操作:

移动类的:

h/j/k/l: 左/下/上/右 移一格
w : 向后词移动 (前面加数字移动多少个词)
b : 向前词移动 (前面加数字移动多少个词)
e : 向后移到词末
ge : 向前移到词末
$ : 行末
0 : 行首
tx : 向右查找本行的x并移到那儿(大写时向左)
33G : 移到文件的第33行
gg : 文件首行
G : 文件尾行
33% : 文件的33%处
H/M/L : 屏幕的首/中/尾行
zt/zz/zb : 当前行移到屏幕的首/中/底部
跳转:

" : 回到跳转来的地方
CTRL-O : 跳到一个 "较老" 的地方
CTRL-I : 则跳到一个 "较新" 的地方
查找:

/ : 向下查找(后加关键字)
? : 向上查找(后加关键字)
n : 下一条符合的记录

编辑:

i : 转换到插入模式
x : 删除当前字符
. : 重复最后一次的修改操作(同PS里ctrl+f执行滤镜)
u : 撤销操作
CTRL-R : 重做
p : 将删除的字符插入到当前位置(put)
退出保存:

:q : 退出
:q! : 不保存退出
ZZ : 保存后退出
:e! : 放弃修改重新编辑

linux开通SSH代理上网专用账号

首先创建一个sh文件。
以创建/bin/ssh.sh 文件内容如下:

#!/bin/sh
echo ""
echo " ********************************************************************"
echo " * welcome to http://cuxian.info- SSH , press a key to exit. *"
echo " ********************************************************************"
echo ""
read x
exit

保存为:

/bin/ssh.sh
chmod 755 /bin/ssh.sh #加权限
useradd ssh账号 -g nobody -s /bin/ssh.sh #加用户
passwd ssh账号 #给他个密码。

centOS 5.4 vsftpd安装配置

1. 查看有没有安装vsftpd:
rpm -qa | grep vsftpd
2.yum安装vsftpd:
yum install vsftpd
touch /var/log/vsftpd.log # 创建vsftp的日志文件

3.rpm 安装vsftpd:
    可以从下面两个地方获得最新的vsftpd的RPM包https://www.redhat.com/或 者http://www.rpmfind.net/
安装命令:
rpm -Uvh vsftpd-1.1.3-8.i386.rpm
4.设置每次开机时自动运行及手工启动它:
chkconfig vsftpd on
service vsftpd start
netstat -tl 可以查看ftp端口是否在侦听了!
5.配置文件
/etc/vsftpd/ftpusers 和 /etc/vsftpd/user_list,#不能登陆FTP的用户;
/etc/vsftpd/vsftpd.conf
#anonymous_enable=YES
anonymous_enable=NO     #设定不允许匿名用户访问
chroot_local_user=YES      #把系统内所有的FTP用户都限制在家目录中 xferlog_file=/var/log/vsftpd.log 设定vsftpd的服务日志保存路径。注意,该文件默认不存在。必须要手动touch出来
ascii_upload_enable=YES
ascii_download_enable=YES 设定支持ASCII模式的上传和下载功能。
pam_service_name=vsftpd   PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证
以下这些是关于Vsftpd虚拟用户支持的重要配置项目。默认vsftpd.conf中不包含这些设定项目,需要自己手动添加配置。
guest_enable=YES   设定启用虚拟用户功能。
guest_username=ftp   指定虚拟用户的宿主用户。-CentOS中已经有内置的ftp用户了
user_config_dir=/etc/vsftpd/vuser_conf 设定虚拟用户个人vsftp的配置文件存放路径。存放虚拟用户个性的配置文件(配置文件名=虚拟用户名)
6.设定个FTP目录
修改 /var/www 目录属性:
$ chmod -R 777 /var/www 递归地给此目录下所有文件和子目录的读、写、执行权限
$ chgrp -R ftp   /var/www 递归地把此目录及该目录下所有文件和子目录的组属性设置成ftp组
7.增加FTP用户
adduser -d /var/www -g ftp -s /sbin/nologin 用户名 #增加用户,组是FTP,目录是/var/www
passwd 用户名 #设定密码
Changing password for user beinan.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
8.重启FTP
service vsftpd restart
9.如果ftp服务器连接失败,错误提示:
500 OOPS: cannot change directory:/home/*******
500 OOPS: child died
当你看到以上提示时,试着在输入以下命令解决
setsebool -P ftpd_disable_trans 1
service vsftpd restart
第一行中的-P参数是为了以后不需要每次开机都输入这个命令
10.用户管理
userdel 选项 用户名   #删除用户
常用的选项是-r,它的作用是把用户的主目录一起删除。
passwd 选项 用户名 #修改口令
passwd -l 用户名 锁定口令,即禁用账号。
passwd -u 用户名 口令解锁。
passwd -d 用户名 使账号无口令。
passwd -f 用户名 强迫用户下次登录时修改口令。
如果默认用户名,则修改当前用户的口令。
如果是超级用户,可以用下列形式指定任何用户的口令:
passwd 用户名
passwd -d 用户名 此命令将用户的口令删除,这样用户下一次登录时,系统就不再询问口令
11.是否想修改21端口呢?
先修改防火墙,增加其FTP端口,下面使用921
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 921 -j ACCEPT
/etc/init.d/iptables restart   #重启防火墙
/etc/vsftpd/vsftpd.conf 里增加加   listen_port=921
/etc/rc.d/init.d/vsftpd restart    #重启vsftpd
netstat -an |grep 921             #查看端口是否正常启动:

12. 有时客户端反应很慢,可以使用被动模式

添加以下内容
use_localtime=YES
listen_port=25682
pasv_enable=YES
pasv_min_port=25683
pasv_max_port=25686

如果开启了防 火墙,需要放行端口25682:25686
客户端使用25682进行连接

2010年11月11日星期四

取消WordPress2.71的自动保存和日志修订版本

WordPress的日志修订版本确实很烦,修改一次占一个post_id,现在这篇文章的id是1536了,而上一篇文章才1493,id整整相 差了43.......原因就是WordPress版本控制功能太强了...
取消WordPress2.71的自动保存和日志修订版本

而用Windows Live Writer离线发布,发布之后不再修改,ID就会连续...

而,我比较喜欢上网站后台发布...  :-)

为了WordPress的ID不太离谱...我取消了WordPress的自动保存和日志修订版本功能...

方法如下:

用DreamWeaver(千万别用Windows的记事本...)打开/wp-includes/default-filters.php这个文 件,第189行的

add_action( 'pre_post_update', 'wp_save_post_revision' );

修改为:

//add_action( 'pre_post_update', 'wp_save_post_revision' );

打开/wp-admin/includes/post.php这个文件,第1043行的

return _wp_put_post_revision( $_POST, true );

修改为:

//return _wp_put_post_revision( $_POST, true );
return edit_post();



http://deloz.net/1000000313.html

2010年11月5日星期五

Micolog博客主题终极优化篇

之前google app的一些动作让我们有些失望,他们将CPU的使用率和每日的输出流量都减少了,CPU的影响倒不是很大,因为博客使用了缓存,其中每日输出流量从2G 改为1G最使人恼火。当然对大多数博客已经够用了,但我们还要未雨绸缪,做些优化来减少或平摊一下流量。

使用绝对路径,路径中注意大 小写(使用python的缘故)。目的是减少重复加载文件。减少宽带输出量,并且也对网站有加速的作用。调用js文件较多的网站尤为重 要。

1.将站内所有的图片都用绝对路径,包括css中的。

在style.css 中的所有相对路径替换成绝对路径 如

#container #wrapper {
    width: 900px;
    float: left;
    overflow: hidden;
    background: #d6ded4 url(http://hou-kai.appspot.com/themes/Devart/images/sidebar-bg.gif) repeat-y top right;
}

2.改javascript函数为文件调用形式。并用绝对路径。

其中公用的部分建议用官方提供的链 接,比如jquey库。这样做的好处是大多数网站都在使用这样通用库,如果访问到您的博客就不用重新加载了。如

<script type="text/javascript" language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

把其他的改为绝对路径调用,如

QQ表情的js
<script type="text/javascript" src="http://hou-kai.appspot.com/themes/Devart/smile.js">

其他的同样,如果js中有中文字符,需将js文件以utf-8格式保存。比如下面commnent.js是 利用ajexa提交评论,但函数内有中文提示。还有taotao.js也是utf-8格式。

<script src="http://hou-kai.appspot.com/themes/Devart/cookie.js" type="text/javascript"></script> 
<SCRIPT src="http://hou-kai.appspot.com/themes/Devart/commenttips.js" type="text/javascript"></SCRIPT>
<SCRIPT src="http://hou-kai.appspot.com/themes/Devart/comment.js" type="text/javascript"></SCRIPT>
<script type="text/javascript">var taotao_qq=63956135; var taotao_num=5;var taotao_type=0;</script><script type="text/javascript" charset="utf-8" src="http://hou-kai.appspot.com/themes/Devart/taotao.js"></script>

经过这步,我明显感觉用ajexa提交留言的速度快了。还可以对js进行合并,并用YUI Compressor 工具对 JavaScript 和 CSS 代码进行压缩(非必要)。

3.绝对路径中用 yourID.appspot.com二级域名。

为什么上面我用http://hou- kai.appspot.com/,而不用http://www.houkai.com/呢,因为我们绑定的域名只是google在ghs服务器上做了一 个反向代理,最终还是调用前者的内容,这也是为什么*.appspot.com支持https,而绑定的域名不支持,是因为反向代理没有提供这样的功能。

前面写过一篇博文,来 悼念阵亡的ip,现在用来绑定域名的ip已经是聊聊无几,我一直在想ip用完了怎么办,难道我们的博客就关门大吉,或者导出数据转移到 Wordpress。现在Micolog程序还有缺陷,如果转移到Wordpress感觉数据也会有所丢失。而且,我还是比较喜欢python的。有没有 其他办法呢。

请大家先看看 http://w92.houkai.com。这是我用国内ip做了一个反向代理,很简单,就是用w92.houkai.com来代理hou- kai.appspot.com。这台机子的ip是个公网ip,我在该机子用phpnow搭建了个php环境,本来想用来做个掘客,但一直太懒闲置着。如 果我在Micolog后台设置域名为w92.houkai.com,是不是和google提供的ghs效果一样。

上面用appspot.com的绝对路径的目的就是要绕过反向代理直接调用,这样就可以减少对反向代理的压力。毕竟用的ghs都放在国外的某个 主机,appspot的速度还是很快的(我猜想它有流量均衡机制)!

4.分摊流量。

因 为google app 对每个项目都有流量和cpu方面的限制,但每个用户可以最多申请10个项目。所以我们可以用两个或者三个项目来分散流量,你可以观察,凡是大型网站一般主 题发面的图片都会存放在另一个二级域名下。这样可以减少对主站的压力。

那么如果分摊流量呢。一般用Micolog的博主也都在用大菠萝 相册来做图床。您可以将主题包放在大菠萝程序内。修改一下app.yaml来缩短路径(非必要),把Micolog主题中的hou- kai.appspot.com换成大菠萝相册的二级域名路径。

还有一种最最简单的方法,就是再开一个项目,比如我再新建一个 houkaiblog.appspot.com,把Micolog程序中的hou-kai.appspot.com主题中绝对路径全部替换成 houkaiblog.appspot.com。将同一程序分别上传到两个项目传就ok了!这样www.houkai.com 主题中css、js、图片等文件调用的就是houkaiblog.appspot.com的流量,其他调用的是自己hou-kai.appspot的流 量。

使用绝对路径要注意的地方:在本地测试的时候,如果修改那个css或js的调用文件 一定要在html文件中将该文件的路径改成相对路径才能看到效果,上传前在改回绝对路径!虽然麻烦,但修改调用文件几率还是很小的!

2010年11月1日星期一

5个免费 ico图标资源网

1.http://www.iconlet.com/

2.http://www.veryicon.com/

3.http://www.iconseeker.com/

4.http://icons-search.com/

5.http://www.iconfinder.com/

WordPress 主题模板制作及修改教程

每一套 WP 主题都由结构层、表现层和数据层构成,可以说是典型的、符合 Web 体系标准的“三层结构”。WP主题的这种模式块化的特点决定了其设计其实是非常简单,但又极其灵活的。可以说,学会了制作 WP 主题,就相当于基本理解了 Web开发的客户端模型,对进一步学习掌握 Web 技术具有重要意义。这也正是 WP 的魅力所在!
在一套 WP 主题中,最基本的两个文件是 index.php 和style.css。其中,前者定义结构和内容,后者定义样式。所谓结构,就是由指由 XHTML 标签构成的网页基本架构。在 WP主题中,结构层主要使用的是添加了适当的 id 或(和)class 属性的 div 和 ul元素,以便更好地通过表现层来控制页面的布局和外观。所谓表现层,其实就是网页的布局和样式--也就是外观。表现层由CSS(级联样式表)规则定义构 成。而数据层,顾名思义,也就是网站中实际显示的内容,是通过调用 WP内置的函数(有时需要传递适当的参数)从数据库中取得的。

说明:为简明起见,本教程不涉及如何定义样式表(CSS)文件的内容。

事实上,当我们打开某个主题的文件夹时,看到的并不止这两个文件,而是更多。但一般来说,在一个完整的 WP 主题文件夹中都应该包含下列文件(也称为模板文件):

页面 模板文件 用途
首页 index.php 显示网站首页
单页 single.php 显示博文的页面(相当于细节页)
静态页 page.php 显示静态页的页面(包含各级静态页面)
分类页 category.php 显示分类页的页面(相当于栏目页)
存档页 archive.php 显示存档页的页面(相当于按时间归类的栏目页)
搜索页 search.php 显示搜索结果的页面
评论页 comments.php 显示评论的页面
弹出式评论页 comments-popup.php 显示弹出式评论的页面
404错误页 404.php 显示 404 错误信息的页面
级联样式表 style.css 控制页面布局外观

除此之外,一套主题模板中还可以包含 author.php、home.php、date.php、searchform.php 以及 functions.php 等页面(其中部分页面稍后介绍)。
虽然上面列出了与 WP 内置功能对应的 9 个 php 文件,但制作一套主题远没有想像得那么复杂。因为事实上,你只需要制作一个 index.php 文件,就可以派生出另外 8 个文件来!
从 WP 应用主题的机制来说,这 9 个模板文件是存在优先级差别的,也可以认为是重要性不同。它们的优先级顺序是:
index.php -> single.php -> page.php -> archive.php -> search.php -> 404.php。
这样,当不存在后边的页面时,WP 会自动调用前面的页面,直至调用 index.php。比如,当程序调用页面页 page.php 时,如果page.php 模板文件不存在,那么程序会尝试调用前面的文件--single.php。而如果 single.php也不存在,那么就会调用最终的 index.php 来显示页面页。可见 index.php属于“垫底儿”的缺省页面,它的重要性是最高的。但当存在具体页面时,还是要优先使用具体的页面,可见具体的页面优先级最高。
在明确了 index.php 是一套 WP 主题的核心之后,我们就可以将制作 WP 主题的过程简单地分成两步,即--定义主模板文件 index.php 和派生其他模板文件。
定义主模板文件 index.php从页面布局的角度上,有必要将主模板文件 index.php 拆分成 header.php、sidebar.php 和footer.php 三个子页面。WP 专门为在 index.php 中包含这三个子页面提供了对应的get_header()、get_sidebar() 和 get_footer() 函数。
下面,就来详细介绍一下制作 index.php 页面的过程:
首先,在 myThemes 文件夹中建立一个文本文件并将其重命名为 index.php,然后再建立一个 style.css 文件(内容暂时留空)。
然后,用你喜欢的文本编辑器打开 index.php 并输入下列代码(最好复制,因为这一部分不重要):
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=”http://www.w3.org/1999/xhtml“>
<head profile=”http://gmpg.org/xfn/11“>
<meta http-equiv=”Content-Type” content=”<?php bloginfo(’html_type’); ?>;
charset=<?php bloginfo(’charset’); ?>” />
<title><?php bloginfo(’name’); ?> <?php if ( is_single() ) { ?> » Blog Archive <?php } ?>
<?php wp_title(); ?></title>
<meta name=”generator” content=” <?php bloginfo(’version’); ?>” />
<!– leave this for stats –>
<link rel=”stylesheet” href=”<?php bloginfo(’stylesheet_url’); ?>”
type=”text/css” media=”all” />
<link rel=”stylesheet” href=”<?php bloginfo(’stylesheet_directory’); ?>
/print.css” type=”text/css” media=”print” />
<link rel=”alternate” type=”application/rss+xml” title=”<?php bloginfo(’name’); ?>
RSS Feed” href=”<?php bloginfo(’rss2_url’); ?>”/>
<link rel=”pingback” href=”<?php bloginfo(’pingback_url’); ?>” />
<?php wp_head(); ?>
</head>
<body>
</body>
</html>
显然,这是一些构成网页文件的 HTML 代码,当然其中包含 PHP 代码。如前所述,HTML 代码定义结构,而 PHP 代码用于生成内容。
在 WP 后台的“主题”模块中,选择 myTheme 主题。然后,在浏览器中观察你的 WP 外观。此时,应该显示页面一片空白。但通过“查看源文件”,你会发现 index.php 中的 PHP 代码已经生成了一些头部内容。
接着,我们开始动手定义 index.php 中 body 部分的结构和内容。
(一)构建 header在 body 元素内,新建如下结构化标记元素,注意各元素都带有不同的 id 属性:
<div id=”page”>
<div id=”header”></div>
<div id=”content”></div>
<div id=”sidebar”></div>
<div id=”footer”></div>
</div>
然后,在该 <div id=”header”></div> 元素的两个标签之间输入下列代码:
<h1><a href=”<?php bloginfo(’url’); ?>”title=”<?php bloginfo(’name’); ?>”><?php bloginfo(’name’);?></a></h1>
<p><?php bloginfo(’description’); ?></p>
这里用到了 WP 内置的 bloginfo 函数来生成内容,其中:

bloginfo(’url’)返回网站主页链接;
bloginfo(’name’)返回网站标题;
bloginfo(’description’)返回网站描述。
保存 index.php 文件,然后在浏览器中按 F5 刷新一下页面,看能看到什么?再通过“查看源文件”,核对一下由 WP 的 bloginfo() 函数生成的相关信息。
(二)构建 content在 <div id=”content”></div> 中,我们要通过循环显示博文,包括每个博文的标题、作者、发表日期以及其他相关信息。并且,可以分页显示博文(取决于 WP 后台的设置)。
首先,在 <div id=”content”> 与 </div> 之间输入下列代码:
<?php while (have_posts()) : the_post(); ?> <div class=”post” id=”post-<?php the_ID() ?>”>
<!– 博文标题及链接 –>
<h2><a href=”<?php the_permalink() ?>” rel=”bookmark” title=”<?php the_title(); ?>”>
<?php the_title(); ?></a></h2>
<!– 发表日期 –>
<div class=”post-date”>
<span class=”post-month”><?php the_time(’M’) ?></span>
<span class=”post-day”><?php the_time(’d’) ?></span>
</div>
<!– 作者 –>
<span class=”post-author”><?php _e(’Author’); ?>:<?php the_author(’, ‘) ?></span>
<!– 类别 –>
<span class=”post-cat”><?php _e(’Categories’); ?>:<?php the_category(’, ‘) ?></span>
<!– 注释 –>
<span class=”post-comments”>
<?php comments_popup_link(’No Comments »’, ‘1 Comment »’, ‘% Comments »’); ?></span>
<!– 内容 –>
<div class=”entry”>
<?php the_content(’更多内容 »’); ?>
</div>
<!– 其他元(Meta)数据 –>
<div class=”post-meta”>
<?php edit_post_link(’编辑’,’ | ‘,”); ?>
</div> </div>
<?php endwhile; ?><div class=”navigation”>
<span class=”previous-entries”><?php next_posts_link(’前一篇’)?></span> <span class=”next-entries”><?phpprevious_posts_link(’后一篇’) ?></span>
</div>
<?php else : ?>
<div class=”post”>
<h2><?php _e(’Not Found’); ?></h2>
</div><?php endif; ?>
看似复杂,其实不然。首先:
<?php if (have_posts()) : ?>
<?php else : ?>
<?php endif; ?>
这三行,在 WP 中表示 if 控制结果。注意,if 语句通过测试 have_posts() 函数来测试是否存在博文。而
<?php while (have_posts()) : the_post(); ?>
<?php endwhile; ?>
这两行,是 WP 中的 while 循环。其中,while 语句通过测试 have_posts() 决定是否调用 the_post()函数。如果测试 have_posts() 返回 true,则调用 the_post() 函数,初始化与博文相关的内置变量。
在 while 循环内部,首先要注意通过 div、h2、span 这三个元素定义的嵌套语义结构,以及相应元素的 class 和 id属性(其中只为 class 为 post 的 div 元素定义了一个 id 属性--post-<?php the_ID()?>)。这是将来使用 CSS 控制外观的关键所在。在这个 div 元素中,为显示博文的相关信息,分别调用了以下 WP 函数:

the_ID():返回博文 ID;
the_permalink():返回博文固定链接 URL;
the_title():返回博文标题;
the_time(’M’):返回发表日期中的月份;
the_time(’d’):返回发表日期中的天;
the_author():返回博文作者;
the_category():返回博文的类别;
the_content():返回博文的内容,其中的参数表示用于“更多内容”的链接文本;
以上函数都是以 the_ 开头的,加上后面的函数名不仅颇有自解释的味道,而且令人联想到 this 关键字。此外
_e() 函数是一个包装函数,这个函数主要用于语言的转换,如果调用该函数并传递标准的 WP 术语,如:Author 或 Categories,则返回你相应语言包中的译文,在中文包中分别是“作者”和“类别”。当然,不用也可。但会失去一些适应性。
还有,omments_popup_link() 和 edit_post_link() 两个函数,分别显示注释和编辑链接,这里不多说了。
另外,在 <?php endwhile; ?> 后面显示了分页导航链接,调用的函数分别是:next_posts_link() 和previous_posts_link()。此时,如果你的博文总数小于 WP 后台设置的最多显示数目,比如:你在后台设置最多显示 5篇,而你有 10 篇博文,就会分页显示;否则,如果你的博文少于或等于 5 篇则看不到分页导航链接。
最后,不要丢下 <?php else : ?> 语句后面的内容:
<div class=”post”>
<h2><?php _e(’Not Found’); ?></h2>
</div>
显然,这是一个错误提示信息。
(三)构建 sidebarsidebar 的内容当然要在 <div id=”sidebar”></div> 元素中构建了。sidebar,中文叫侧边栏,其中可以包含很多内容。比如:分类、页面、链接、日历等等导航及相关信息。
在 WP 中,sidebar 中的内容都以无序(ul)或有序(ol)列表的形式输出。因此,需要在 <div id=”sidebar”></div> 中输入以下标记:
<ul>
<?php if ( !function_exists(’dynamic_sidebar’) || !dynamic_sidebar() ) : ?>
<li id=”search”>
<?php include(TEMPLATEPATH .’/searchform.php’); ?>
</li> <li id=”calendar”>
<h2><?php _e(’Calendar’); ?></h2>
<?php get_calendar(); ?>
</li> <?php wp_list_pages(’title_li=<h2>页面</h2>’); ?> <li class=”catnav”>
<h2><?php _e(’Categories’); ?></h2>
<ul>
<?php wp_list_cats(’sort_column=name&optioncount=1&hierarchical=0′); ?>
</ul>
</li>
<li class=”archivesnav”>
<h2><?php _e(’Archives’); ?></h2>
<ul>
<?php wp_get_archives(’type=monthly’); ?>
</ul>
</li>
<li class=”blogrollnav”>
<h2><?php _e(’Links’); ?></h2>
<ul>
<?php get_links(’-1′, ‘<li>’, ‘</li>’, ‘<br />’, FALSE, ‘id’, FALSE, FALSE, -1, FALSE); ?>
</ul>
</li>
<li class=”meta”>
<h2><?php _e(’Meta’); ?></h2>
<ul><?php wp_register(); ?><li><?php wp_loginout(); ?></li>
<?php wp_meta(); ?></ul>
</li>
<?php endif ?>
</ul> 以上代码从第三行开始,分别通过包含 searchform.php 显示搜索表单;

调用 get_calendar() 函数显示日历;
调用 wp_list_pages() 函数显示页面导航;
调用 wp_list_cats() 函数显示分类导航;
调用 wp_get_archives() 函数显示存档导航;
调用 get_links() 函数显示链接导航。
在构建侧边栏时,要为生成搜索框新建一个 searchform.php 文件,其内容如下:
<form method=”get” id=”searchform” action=”<?php bloginfo(’home’); ?>/”>
<div>
<input type=”text” value=”<?php echo wp_specialchars($s, 1); ?>” name=”s” id=”s” size=”15″ /><br />
<input type=”submit” id=”searchsubmit” value=”Search” />
</div>
</form>
将其保存在 myTheme 文件夹中,通过 include 语句包含进来就可以了。注意,常量 TEMPLATEPATH 中保存的是模板路径。
最后,说明一下以上代码第二行和倒数第二行。显然这是一个 if 语句块。那这个 if 语句块包含 sidebar是何用意呢?这是部件化侧边栏的需要,就是让 sidebar 适合 Widget 插件(WP 2.0 后内置了Widget,所以不用再安装了)。如果要使用 Widget 插件,必须对 sidebar 进行部件化。这样,在 WP 后台通过 Widget插件你就可以使用拖动来方便地定义侧边栏的组件了。部件化侧边栏,除了在 ul 元素内侧放入这个 if 语句之外,还必须在 myTheme文件夹中建立一个文件 functions.php,其内容如下:
<?php
if ( function_exists(’register_sidebar’) )
register_sidebar(array(
‘before_widget’ => ‘<li id=”%1$s” class=”widget %2$s”>’,
‘after_widget’ => ‘</li>’,
‘before_title’ => ‘<h2 class=”sidebartitle”>’,
‘after_title’ => ‘</h2>’,
));
?>
(四)构建 footerfooter 中一般都一些版权信息和不太重要的链接。所以可以在 <div id=”footer”></div> 元素中简单地放入下列代码:
<p>Copyright © 2007 <?php bloginfo(’name’); ?></p>
至此,核心 index.php 文件就算是大功告成了!
接下来,是拆分 index.php 和基于 index.php 派生子模板文件。
在 myTheme 文件夹中新建 header.php、sidebar.php 和 footer.php 三个文件。把index.php 中的 <div id=”header”></div>、<divid=”sidebar”></div> 和 <div id=”footer”></div>三个结构化元素及其内容分别转移(剪切)到这三个新文件中。然后,在 <div id=”header”></div>原来的位置处输入代码:
<?php get_header();?>
在 <div id=”sidebar”></div> 原来的位置处输入代码:
<?php get_sidebar();?>
在 <div id=”footer”></div> 原来的位置处输入代码:
<?php get_footer();?>
前面说过,这三个 get 函数是 WP 专门为包含结构化的文件定义的。现在你的 index.php 文件应该如下所示:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=”http://www.w3.org/1999/xhtml“><head profile=”http://gmpg.org/xfn/11“>
<meta http-equiv=”Content-Type” content=”<?phpbloginfo(’html_type’); ?>; charset=<?php bloginfo(’charset’);?>” /><title><?php bloginfo(’name’); ?> <?php if (is_single() ) { ?> » Blog Archive <?php } ?> <?phpwp_title(); ?></title><meta name=”generator”content=” <?php bloginfo(’version’); ?>” /> <!–leave this for stats –><link rel=”stylesheet” href=”<?phpbloginfo(’stylesheet_url’); ?>” type=”text/css” media=”all” />
<link rel=”stylesheet” href=”<?php bloginfo(’stylesheet_directory’); ?>/print.css” type=”text/css” media=”print” />
<link rel=”alternate” type=”application/rss+xml” title=”<?phpbloginfo(’name’); ?> RSS Feed” href=”<?php bloginfo(’rss2_url’);?>” />
<link rel=”pingback” href=”<?php bloginfo(’pingback_url’); ?>” /><?php wp_head(); ?>
</head>
<body>
<div id=”page”><?php get_header(); ?> <!– content –>
<div id=”content”>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?> <div class=”post” id=”post-<?php the_ID() ?>”>
<!– 博文标题及链接 –>
<h2><a href=”<?php the_permalink() ?>” rel=”bookmark” title=”<?php the_title(); ?>”>
<?php the_title(); ?></a></h2>
<!– 发表日期 –>
<div class=”post-date”>
<span class=”post-month”><?php the_time(’M’) ?></span>
<span class=”post-day”><?php the_time(’d’) ?></span>
</div>
<!– 作者 –>
<span class=”post-author”><?php _e(’Author’); ?>:<?php the_author(’, ‘) ?></span>
<!– 类别 –>
<span class=”post-cat”><?php _e(’Categories’); ?>:<?php the_category(’, ‘) ?></span>
<!– 注释 –>
<span class=”post-comments”>
<?php comments_popup_link(’No Comments »’, ‘1 Comment »’, ‘% Comments »’); ?></span>
<!– 内容 –>
<div class=”entry”>
<?php the_content(’更多内容 »’); ?>
</div>
<!– 其他元(Meta)数据 –>
<div class=”post-meta”>
<?php edit_post_link(’编辑’,’ | ‘,”); ?>
</div> </div>
<?php endwhile; ?> <div class=”navigation”>
<span class=”previous-entries”><?php next_posts_link(’前一篇’)?></span> <span class=”next-entries”><?phpprevious_posts_link(’后一篇’) ?></span>
</div>
<?php else : ?>
<div class=”post”>
<h2><?php _e(’Not Found’); ?></h2>
</div><?php endif; ?>
</div><!– end content –><?php get_sidebar(); ?> <?php get_footer(); ?></div>
</body>
</html>
然后,是派生子模板文件。把这个“模块化”的 index.php 文件另存为single.php、page.php、archive.php、 search.php 和 category.php。当然,都保存在myTheme 文件夹中。这样,WP 在显示页面时就会调用相应的页面文件了。比如,显示博文详细内容时,会调用single.php;而显示页面内容时,则调用 page.php。

玩转wordpress之常用模板函数识记

不一定大家都要会做woredpress模板,起码咱们可以对所有的模板进行大大小小的修改吧,呵呵……要想大幅修改模板呢,则起码你要学会

1.html(最基本的,大家都应该会吧)
2.div+CSS布局(这个不难)
3.php(咱略知一二吧)

对这三方面有了深入的了解,你就可以大幅修改或者自己写模板了吧!不过对于像咱们这样的一般人,也可以不用太深入、太专业,如果太专业我们就靠这吃 饭了啊,这些只做咱们的业余娱乐吧,哈哈。(当然有兴趣想深入也可以喽 :-P )
对于一个刚拿过来的模板大家肯定要对其做一些个性的修改吧。当然免不了要用到其中的调用函数啦。平时我是现用现查。今天搜集了一下。集中放到这里吧。以后 也可以随用随拿啦^^ :lol:

基 本模板文件
一套完整的模板应至少具有如下文件:

style.css : CSS(样式表)文件
index.php : 主页模板
archive.php : Archive/Category模板
404.php : Not Found 错误页模板
comments.php : 留言/回复模板
footer.php : Footer模板
header.php : Header模板
sidebar.php : 侧栏模板
page.php : 内容页(Page)模板
single.php : 内容页(Post)模板
searchform.php : 搜索表单模板
search.php : 搜索结果模板
当然,具体到特定的某款模板,可能不止这些文件,但一般而言,这些文件是每套模板所必备的。

基本条件判断Tag
is_home() : 是否为主页
is_single() : 是否为内容页(Post)
is_page() : 是否为内容页(Page)
is_category() : 是否为Category/Archive页
is_tag() : 是否为Tag存档页
is_date() : 是否为指定日期存档页
is_year() : 是否为指定年份存档页
is_month() : 是否为指定月份存档页
is_day() : 是否为指定日存档页
is_time() : 是否为指定时间存档页
is_archive() : 是否为存档页
is_search() : 是否为搜索结果页
is_404() : 是否为 "HTTP 404: Not Found" 错误页
is_paged() : 主页/Category/Archive页是否以多页显示
Header部分常用到的PHP函数
<?php bloginfo('name'); ?> : 博客名称(Title)
<?php bloginfo('stylesheet_url'); ?> : CSS文件路径
<?php bloginfo('pingback_url'); ?> : PingBack Url
<?php bloginfo('template_url'); ?> : 模板文件路径
<?php bloginfo('version'); ?> : 版本
<?php bloginfo('atom_url'); ?> : Atom Url
<?php bloginfo('rss2_url'); ?> : RSS 2.o Url
<?php bloginfo('url'); ?> : 博客 Url
<?php bloginfo('html_type'); ?> : 博客网页Html类型
<?php bloginfo('charset'); ?> : 博客网页编码
<?php bloginfo('description'); ?> : 博客描述
<?php wp_title(); ?> : 特定内容页(Post/Page)的标题
模板常用的PHP函数及命令
<?php get_header(); ?> : 调用Header模板
<?php get_sidebar(); ?> : 调用Sidebar模板
<?php get_footer(); ?> : 调用Footer模板
<?php the_content(); ?> : 显示内容(Post/Page)
<?php if(have_posts()) : ?> : 检查是否存在Post/Page
<?php while(have_posts()) : the_post(); ?> : 如果存在Post/Page则予以显示
<?php endwhile; ?> : While 结束
<?php endif; ?> : If 结束
<?php the_time('字符串') ?> : 显示时间,时间格式由"字符串"参数决定,具体参考PHP手册
<?php comments_popup_link(); ?> : 正文中的留言链接。如果使用 comments_popup_script() ,则留言会在新窗口中打开,反之,则在当前窗口打开
<?php the_title(); ?> : 内容页(Post/Page)标题
<?php the_permalink() ?> : 内容页(Post/Page) Url
<?php the_category(', ') ?> : 特定内容页(Post/Page)所属Category
<?php the_author(); ?> : 作者
<?php the_ID(); ?> : 特定内容页(Post/Page) ID
<?php edit_post_link(); ?> : 如果用户已登录并具有权限,显示编辑链接
<?php get_links_list(); ?> : 显示Blogroll中的链接
<?php comments_template(); ?> : 调用留言/回复模板
<?php wp_list_pages(); ?> : 显示Page列表
<?php wp_list_categories(); ?> : 显示Categories列表
<?php next_post_link(' %link '); ?> : 下一篇文章链接
<?php previous_post_link('%link'); ?> : 上一篇文章链接
<?php get_calendar(); ?> : 日历
<?php wp_get_archives() ?> : 显示内容存档
<?php posts_nav_link(); ?> : 导航,显示上一篇/下一篇文章链接
<?php include(TEMPLATEPATH . '/文件名'); ?> : 嵌入其他文件,可为定制的模板或其他类型文件
与模板相关的其他函数
<?php _e('Message'); ?> : 输出相应信息
<?php wp_register(); ?> : 显示注册链接
<?php wp_loginout(); ?> : 显示登录/注销链接
<!�next page�> : 将当前内容分页
<!�more�> : 将当前内容截断,以不在主页/目录页显示全部内容
<?php timer_stop(1); ?> : 网页加载时间(秒)
<?php echo get_num_queries(); ?> : 网页加载查询量