2010年9月3日星期五

WordPress调用函数大全

转载请注明:源自攀索之路里的WordPress调用函数大全
本文地址:http://www.pansuo.com/2010/08/wordpress-func/
订阅本站:攀索之路

WordPress模板基本文件
index.php ——主页文件
style.css ——-样式表文件
header.php——网页头部文件
footer.php—— 网页底部文件
single.php—— 日志单页文件
page.php——–页面文件
archvie.php—–分类和日期存档页文件
searchform.php–搜索表单文件
search.php——搜索页面文件
comments.php—-留言区域文件(包括留言列表和留言框)
404.php———404错误页面
sidebar.php—–网页侧边栏文件
WordPress Header头部 PHP代码

注: 也就是位于<head>和</head>之间的PHP代码
<?php bloginfo(’name’); ?> 网站标题
<?php wp_title(); ?> 日志或页面标题
<?php bloginfo(’url’); ?> WordPress博客的绝对地址
<?php bloginfo(’name’); ?> WordPress博客的名称
<?php bloginfo(’html_type’); ?> 网站的HTML版本
<?php bloginfo(’charset’); ?> 网站的字符编码格式
<?php bloginfo(’stylesheet_url’); ?> WordPress主题样式表文件style.css的相对地址
<?php bloginfo(’pingback_url’); ?> WordPress博客的Pingback地址
<?php bloginfo(’template_url’); ?> WordPress主题文件的相对地址
<?php bloginfo(’version’); ?> 博客的WordPress版本
<?php bloginfo(’atom_url’); ?> WordPress博客的Atom地址
<?php bloginfo(’rss2_url’); ?> WordPress博客的RSS2地址
WordPress 主体模板 PHP代码
<?php the_content(); ?> 日志内容
<?php if(have_posts()) : ?> 确认是否有日志
<?php while(have_posts()) : the_post(); ?> 如果有,则显示全部日志
<?php endwhile; ?> 结束PHP函数”while”
<?php endif; ?> 结束PHP函数”if”
<?php get_header(); ?> header.php文件的内容
<?php get_sidebar(); ?> sidebar.php文件的内容
<?php get_footer(); ?> footer.php文件的内容
<?php the_time(’m-d-y’) ?> 显示格式为”02-19-08″的日期
<?php the_ID(); ?> 显示一篇日志或页面的ID
<?php edit_post_link(); ?> 显示一篇日志或页面的编辑链接
<?php get_links_list(); ?> 显示Blogroll中的链接
<?php comments_template(); ?> comments.php文件的内容
<?php wp_list_pages(); ?> 显示一份博客的页面列表
<?php wp_list_cats(); ?> 显示一份博客的分类列表
<?php comments_popup_link(); ?> 显示一篇日志的留言链接
<?php the_title(); ?> 显示一篇日志或页面的标题
<?php the_permalink() ?> 显示一篇日志或页面的永久链接/URL地址
<?php the_category(’, ‘) ?> 显示一篇日志或页面的所属分类
<?php the_author(); ?> 显示一篇日志或页面的作者
<?php next_post_link(’ %link ‘) ?> 下一篇日志的URL地址
<?php previous_post_link(’%link’) ?> 上一篇日志的URL地址
<?php get_calendar(); ?> 调用日历
<?php wp_get_archives() ?> 显示一份博客的日期存档列表
<?php posts_nav_link(); ?> 显示较新日志链接(上一页)和较旧日志链接(下一页)
<?php bloginfo(’description’); ?> 显示博客的描述信息
其它的一些WordPress模板代码
/%postname%/ 显示博客的自定义永久链接
<?php the_search_query(); ?> 搜索表单的值
<?php _e(’Message’); ?> 打印输出信息
<?php wp_register(); ?> 显示注册链接
<?php wp_loginout(); ?> 显示登入/登出链接
<!–next page–> 在日志或页面中插入分页
<!–more–> 截断日志
<?php wp_meta(); ?> 显示管理员的相关控制信息
<?php timer_stop(1); ?> 显示载入页面的时间
<?php echo get_num_queries(); ?> 显示载入页面查询
1. wordpress调用最新文章
WordPress最新文章的调用可以使用一行很简单的模板标签wp_get_archvies来实现. 代码如下:
<?php get_archives(‘postbypost’, 10); ?> (显示10篇最新更新文章)
或者
<?php wp_get_archives(‘type=postbypost&limit=20&format=custom’); ?>
后面这个代码显示你博客中最新的20篇文章,其中format=custom这里主要用来自定义这份文章列表的显示样式。具体的参数和使用方法你可 以参考官方的使用说明- wp_get_archvies。(fromat=custom也可以不要,默认以UL列表显示文章标题。)
补充: 通过WP的query_posts()函数也能调用最新文章列表, 虽然代码会比较多一点,但可以更好的控制Loop的显示,比如你可以设置是否显示摘要。具体的使用方法也可以查看官方的说明。
2. wordpress调用随机文章
<?php $rand_posts = get_posts(‘numberposts=10&orderby=rand’); foreach( $rand_posts as $post ) : ?>
<!–下面是你想自定义的Loop–>
<li><a href=”<?php the_permalink(); ?>”>
<?php the_title(); ?></a>
</li>
<?php endforeach; ?>
3. wordpress调用最新留言
下面是我之前在一个WordPress主题中代到的最新留言代码,具体也记不得是哪个主题了。该代码直接调用数据库显示一份最新留言。其中 LIMIT 10限制留言显示数量。绿色部份则是每条留言的输出样式。
<?php  global $wpdb;  $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID,  comment_post_ID, comment_author, comment_date_gmt, comment_approved,  comment_type,comment_author_url,  SUBSTRING(comment_content,1,30) 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_password = ''  ORDER BY comment_date_gmt DESC  LIMIT 10";  $comments = $wpdb->get_results($sql);  $output = $pre_HTML;   foreach ($comments as $comment) {  $output .= "n<li>".strip_tags($comment->comment_author)  .":" . " <a href="" . get_permalink($comment->ID) .  "#comment-" . $comment->comment_ID . "" title="on " .  $comment->post_title . "">" . strip_tags($comment->com_excerpt)  ."</a></li>";  }   $output .= $post_HTML;  echo $output;?>
4.wordpress调用相关文章
在文章页显示相关文章
<?php    $tags = wp_get_post_tags($post->ID);    if ($tags) {    $first_tag = $tags[0]->term_id;    $args=array(    'tag__in' => array($first_tag),    'post__not_in' => array($post->ID),    'showposts'=>10,    'caller_get_posts'=>1    );    $my_query = new WP_Query($args);    if( $my_query->have_posts() ) {    while ($my_query->have_posts()) : $my_query->the_post(); ?>    <li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title();?> <?php comments_number(' ','(1)','(%)'); ?></a></li>    <?php    endwhile;    }    }    wp_reset_query();    ?>
5.wordpress调用指定分类的文章
<?php $posts = get_posts( "category=4&numberposts=10" ); ?>  <?php if( $posts ) : ?>  <ul><?php foreach( $posts as $post ) : setup_postdata( $post ); ?>  <li>  <a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a>  </li>  <?php endforeach; ?>  </ul>  <?php endif; ?>
6.wordpress去评论者链接的评论输出
<?php    global $wpdb;    $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID,    comment_post_ID, comment_author, comment_date_gmt, comment_approved,    comment_type,comment_author_url,    SUBSTRING(comment_content,1,14) 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_password = ''    ORDER BY comment_date_gmt DESC    LIMIT 10";    $comments = $wpdb->get_results($sql);    $output = $pre_HTML;    foreach ($comments as $comment) {    $output .= "\n<li>".strip_tags($comment->comment_author)    .":" . " <a href=\"" . get_permalink($comment->ID) .    "#comment-" . $comment->comment_ID . "\" title=\"on " .    $comment->post_title . "\">" . strip_tags($comment->com_excerpt)    ."</a></li>";    }    $output .= $post_HTML;    echo $output;?>
7.wordpress调用含gravatar头像的评论输出
<?php    global $wpdb;    $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved,comment_author_email, comment_type,comment_author_url, SUBSTRING(comment_content,1,10) 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_author != '郑 永' AND post_password = '' ORDER BY comment_date_gmt DESC LIMIT 10";    $comments = $wpdb->get_results($sql);    $output = $pre_HTML;    foreach ($comments as $comment) {    $output .= "\n<li>".get_avatar(get_comment_author_email('comment_author_email'), 18). " <a href=\"" . get_permalink($comment->ID) . "#comment-" . $comment->comment_ID . "\" title=\"" . $comment->post_title . " 上的评论\">". strip_tags($comment->comment_author) .": ". strip_tags($comment->com_excerpt) ."</a></li>";    }    $output .= $post_HTML;    $output = convert_smilies($output);    echo $output;    ?>
上面代码把comment_author的值改成你的ID,18是头像大小,10是评论数量。
8.wordpress调用网站统计大全
1、日志总数: <?php $count_posts = wp_count_posts(); echo $published_posts = $count_posts->publish;?>
2、草稿数目: <?php $count_posts = wp_count_posts(); echo $draft_posts = $count_posts->draft; ?>
3、评论总数: <?php echo $wpdb->get_var(“SELECT COUNT(*) FROM $wpdb->comments”);?>
4、成立时间: <?php echo floor((time()-strtotime(“2008-8-18″))/86400); ?>
5、标签总数: <?php echo $count_tags = wp_count_terms(‘post_tag’); ?>
6、页面总数: <?php $count_pages = wp_count_posts(‘page’); echo $page_posts = $count_pages->publish; ?>
7、分类总数: <?php echo $count_categories = wp_count_terms(‘category’); ?>
8、链接总数: <?php $link = $wpdb->get_var(“SELECT COUNT(*) FROM $wpdb->links WHERE link_visible = ‘Y’”); echo $link; ?>
9、用户总数: <?php $users = $wpdb->get_var(“SELECT COUNT(ID) FROM $wpdb->users”); echo $users; ?>
10、最后更新: <?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; ?>
9.wordpress判断语句
is_single()
判断是否是具体文章的页面
is_single(’2′)
判断是否是具体文章(id=2)的页面
is_single(’Beef Stew’)
判断是否是具体文章(标题判断)的页面
is_single(’beef-stew’)
判断是否是具体文章(slug判断)的页面
comments_open()
是否留言开启
pings_open()
是否开启ping
is_page()
是否是页面
is_page(’42′)
id判断,即是否是id为42的页面
is_page(’About Me’)
判断标题
is_page(’about-me’)
slug判断
is_category()
是否是分类
is_category(’6′)
id判断,即是否是id为6的分类
is_category(’Cheeses’)
分类title判断
is_category(’cheeses’)
分类 slug判断
in_category(’5′)
判断当前的文章是否属于分类5
is_author()
将所有的作者的页面显示出来
is_author(’1337′)
显示author number为1337的页面
is_author(’Elite Hacker’)
通过昵称来显示当前作者的页面
is_author(’elite-hacker’)
下面是通过不同的判断实现以年、月、日、时间等方式来显示归档
is_date()
is_year()
is_month()
is_day()
is_time()
判断当前是否是归档页面
is_archive()
判断是否是搜索
is_search()
判断页面是否404
is_404()
判断是否翻页,比如你当前的blog是http://www.pansuo.com 显示http://www.pansuo.com?paged=2的时候,这个判断将返 回真,通过这个函数可以配合is_home来控制某些只能在首页显示的界面,
例如:
<?php if(is_single()):?>    //这里写你想显示的内容,包括函数    <?php endif;?>
或者:
<?php if(is_home() && !is_paged() ):?>    //这里写你想显示的内容,包括函数    <?php endif;?>
10.wordpress 非插件调用评论表情
<!--smilies-->         <?php    function wp_smilies() {    global $wpsmiliestrans;    if ( !get_option('use_smilies') or (empty($wpsmiliestrans))) return;    $smilies = array_unique($wpsmiliestrans);    $link='';    foreach ($smilies as $key => $smile) {    $file = get_bloginfo('wpurl').'/wp-includes/images/smilies/'.$smile;    $value = " ".$key." ";    $img = "<img src=\"{$file}\" alt=\"{$smile}\" />";    $imglink = htmlspecialchars($img);    $link .= "<a href=\"#commentform\" title=\"{$smile}\" onclick=\"document.getElementById('comment').value += '{$value}'\">{$img}</a>&nbsp;";    }    echo '<div>'.$link.'</div>';    }    ?>    <?php wp_smilies();?>    <!--smilies—>
将以上代码复制到 comments.php 中合适的位置.
转载请注明:源自攀索之路里的SIP协议应答码及常见错误码解释
本文地址:http://www.pansuo.com/2010/08/sip-response-code/
订阅本站:攀索之路

在使用X-Lite、eyeBeam等软电话登陆SIP账户时,经常会出现一些错误码,比如404 Not Found,408 Request Timeout等,
这些错误码到底是什么意思呢?下面搜集了SIP协议中定义的已知应答码及常见错误码解释
1xx = 通知性应答
  • 100 正在尝试
  • 180 正在拨打
  • 181 正被转接
  • 182 正在排队
  • 183 通话进展
2xx = 成功应答
  • 200 OK
  • 202 被接受:用于转介
3xx = 转接应答
  • 300 多项选择
  • 301 被永久迁移
  • 302 被暂时迁移
  • 305 使用代理服务器
  • 380 替代服务
4xx = 呼叫失败
  • 400 呼叫不当
  • 401 未经授权:只供注册机构使用,代理服务器应使用代理服务器授权407
  • 402 要求付费(预订为将来使用)
  • 403 被禁止的
  • 404 未发现:未发现用户
  • 405 不允许的方法
  • 406 不可接受
  • 407 需要代理服务器授权
  • 408 呼叫超时:在预定时间内无法找到用户
  • 410 已消失:用户曾经存在,但已从此处消失
  • 413 呼叫实体过大
  • 414 呼叫URI过长
  • 415 不支持的媒体类型
  • 416 不支持的URI方案
  • 420 不当扩展:使用了不当SIP协议扩展,服务器无法理解该扩展
  • 421 需要扩展
  • 423 时间间隔过短
  • 480 暂时不可使用
  • 481 通话/事务不存在
  • 482 检测到循环
  • 483 跳数过多
  • 484 地址不全
  • 485 模糊不清
  • 486 此处太忙
  • 487 呼叫被终止
  • 488 此处不可接受
  • 491 呼叫待批
  • 493 无法解读:无法解读 S/MIME文体部分
5xx = 服务器失败
  • 500 服务器内部错误
  • 501 无法实施:SIP呼叫方法在此处无法实施
  • 502 不当网关
  • 503 服务不可使用
  • 504 服务器超时
  • 505 不支持该版本:服务器不支持SIP协议的这个版本
  • 513 消息过长
6xx = 全局失败
  • 600 各处均忙
  • 603 拒绝
  • 604 无处存在
  • 606 不可使用
SIP协议应答码
应答代码
应答码是包含了,并且扩展了HTTP/1.1应答码。并不是所有的HTTP/1.1应答码都适当应用,只有在折里指出的是适当的。其他HTTP/1.1应答码不应当使用。并且,SIP也定义了新的应答码系列,6xx。
1 临时应答1xx
临时应答,也就是消息性质的应答,标志了对方服务器正在处理请求,并且还没有决定最后的应答。如果服务器处理请求需要花200ms以上才能产生终结应答的时候,它应当发送一个1xx应答。
注意1xx应答并不是可靠传输的。他们不会导致客户端传送一个ACK应答。临时性质的(1xx)应答可以包含消息体,包含会话描述。
1.1 100 Trying
这个应答表示下一个节点的服务器已经接收到了这个请求并且还没有执行这个请求的特定动作(比如,正在打开数据库的时候)。这个应答,就像其他临时应答一 样,种植了UAC重新传送INVITE请求。100(Trying)应答和其他临时应答不同的是,在这里,它永远不会被有状态proxy转发到上行流中。
1.2 180 Ringing
UA收到INVITE请求并且试图提示给用户。这个应答应当出世化一个本地回铃。
1.3 818 Call is Being Forwarded(呼叫被转发)
服务器可以用这个应答代码来表示呼叫正在转发到另一个目的地集合。
1.4 182 Queued
当呼叫的对方暂时不能接收呼叫的时候,并且服务器决定将呼叫排队等候,而不是拒绝呼叫的时候,那么就应当发出这个应答。当被叫方一旦恢复接收呼叫,他会返 回合适的终结应答。对于这个呼叫状态,可以有一个表示原因的短语,比如:”5 calls queued;expected waiting time is 15minutes”。服务器可以给出好几个182(Queued)应答告诉呼叫方排队的情况(比如排队靠前了等等)。
1.5 183 会话进度
183(Session Progress)应答用于提示建立对话的进度信息。Reason-Phrase(表达原因的句子)、头域或者消息体可以用于提示呼叫进度的更消息的信息。
2 成功信息2xx
这个应答表示请求是成功的。
2.1 200 OK
请求已经处理成功。这个信息取决于不同方法的请求的应答。
3 转发请求3XX
3xx系列的应答是用于提示用户的新位置信息的,或者为了满足呼叫而转发的额外服务地点。
3.1 300 Multiple Choices
请求的地址有多个选择,每个选择都有自己的地址,用户或者(UA)可以选择合适的通讯终端,并且转发这个请求到这个地址。
应答可以包含一个具有每一个地点的在Accept请求头域中允许的资源特性,这样用户或者UA可以选择一个最合适的地址来转发请求。没有未这个应答的消息体定义MIME类型。
这些地址选择也应当在Contact头域中列出(20.10节)。不同于HTTP,SIP应答可以包含多个Contact头域或者一个Contact头域 中具有一个地址列表。UA可以使用Contact头域来自动转发或者要求用户确认转发。不过,本规范没有定义自动转发的标准。
如果被叫方可以在多个地址被找到,并且服务器不能或者不愿意转发请求的时候,可以使用这个应答来给呼叫方。
3.2 301 Moved Permently
当不能在Request-URI指定的地址找到用户的时候,请求的客户端应当使用Contact头域(20.10)所指出的新的地址重新尝试。请求者应当用这个新的值来更新本地的目录,地址本,和用户地址cache,并且在后续请求中,发送到这个/这些列出的地址。
3.3 302 Moved Temporarily
请求方应当把请求重新发到这个Contact头域所指出的新地址(20.10)。新请求的Request-URI应当用这个应答的Contact头域所指出的值。
在应答中的Expires(20.19节)或者Contact头域的expires参数定义了这个Contact URI的生存周期。UA或者proxy在这个生存周期内cache这个URI。如果没有严格的有效时见,那么这个地址仅仅本次有效,并且不能在以后的事务 中保存。
如果cache的Contact头域的值失败了,那么被转发请求的Request-URI应当再次尝试一次。临时URI可以比超时时间更快的失效,并且可以有一个新的临时URI。
3.4 305 Use Proxy
请求的资源必须通过Contact头域中指出的proxy来访问。Contact头域指定了一个proxy的URI。接收到这个应答的对象应当通过这个proxy重新发送这个单个请求。305(UseProxy)必须是UAS产生的。
3.5 380 Alternative Service
呼叫不成工,但是可以尝试另外的服务。另外的服务在应答的消息体中定义。消息体的格式在这里没有定义,可能在以后的规范中定义。
4 请求失败4xx
4xx应答定义了特定服务器响应的请求失败的情况。客户端不应当在不更改请求的情况下重新尝试同一个请求。(例如,增加合适的认证信息)。不过,同一个请求交给不同服务器也许就会成功。
4.1 400 Bad Request
请求中的语法错误。Reason-Phrase应当标志这个详细的语法错误,比如”Missing Call-ID header field”。
4.2 401 Unauthorized
请求需要用户认证。这个应答是由UAS和注册服务器产生的,当407(Proxy Authentication Required)是proxy服务器产生的。
4.3 402 Payment Required
保留/以后使用
4.4 403 Forbidden
服务端支持这个请求,但是拒绝执行请求。增加验证信息是没有必要的,并且请求应当不被重试。
4.5 404 Not Found
服务器返回最终信息:用户在Request-URI指定的域上不存在。当Request-URI的domain和接收这个请求的domain不匹配的情况下, 也会产生这个应答。
4.6 405 Method Not Allowed
服务器支持Request-Line中的方法,但是对于这个Request-URI中的地址来说,是不允许应用这个方法的。
应答必须包括一个Allow头域,这个头域包含了指定地址允许的方法列表。
4.7 Not Acceptable
请求中的资源只会导致产生一个在请求中的Accept头域外的,内容无法接收的错误。
4.8 407 Proxy Authentication Required
这个返回码和401(Unauthorized)很类四,但是标志了客户端应当首先在proxy上通过认证。SIP对认证的访问请参见26节和22.3节。
这个返回码用于应用程序访问通讯网关(比如,电话网关),而很少用于被叫方要求认证。
4.9 408 Request Timeout
在一段时间内,服务器不能产生一个终结应答,例如,如果它无法及时决定用户的位置。客户端可以在稍后不更改请求的内容然后重新尝试请求。
4.10 410 Gone
请求的资源在本服务器上已经不存在了,并且不知道应当把请求转发到哪里。这个问题将会使永久性的。如果服务器不知道,或者不容易检测,这个资源消失是临时性质的还是永久性质的,那么应当返回一个404(Not Found)。
4.11 413请求实体过大。
服务器拒绝处理请求,因为这个请求的实体超过了服务器希望或者能够处理的大小。这个服务器应当关闭连接避免客户端重发这个请求。
如果这个情况是暂时的,那么服务端应当包含一个Retry-After头域来表明这是一个暂时的故障,并且客户端可以过一段时间再次尝试。
4.12 414 Request-URI Too Long
服务器拒绝这个请求,因为Request-URI超过了服务器能够处理的长度。
4.13 415 Unsupported Media Type
服务器由于请求的消息体的格式本服务器不支持,所以拒绝处理这个请求。这个服务器必须根据内容的故障类型,返回一个Accept,Accpet-Encoding,或者Accept-Language头域列表。UAC根据8.1.3.5节定义的方法处理这个应答。
4.14 416 Unsupported URI Scheme
服务器由于不支持Request-URI中的URI方案而终止处理这个请求。客户端处理这个应答参照8.1.3.5。
4.15 Bad Extension
服务器不知道在请求中的Proxy-Require(20.29)或者Require(20.32)头域所指出的协议扩展。服务器必须在Unsupported头域中列出不支持的扩展。UAC处理这个应答请参见8.1.3.5
4.16 421Extension Required
UAS需要特定的扩展来处理这个请求,但是这个扩展并没有在请求的Supported头域中列出。具有这个应答码的应答必须包含一个Require头域列出所需要的扩展。
UAS不应当使用这个应答除非它真的不能给客户端提供有效的服务。相反,如果在Support头域中没有列出需要的扩展,服务器应当根据基准的SIP兼容的方法和客户端支持的扩展来进行处理。
4.17 423 Interval Too Brief
服务器因为在请求中设置的资源刷新时间(或者有效时间)过短而拒绝请求。这个应答可以用于注册服务器来拒绝那些Contact头域有效期过短的注册请求。这个应答的用法和相关的Min-Expires头域在10.2.8,10.3,20.23节中介绍和说明。
4.18 480 Temporarily Unavailable
请求成功到达被叫方的终端系统,但是被叫方当前不可用(例如,没有登陆,或者登陆了但是状态是不能通讯,或者有”请勿打扰”的标记)。应答应当在 Retry-After中标志一个合适的重发时间。这个用户也有可能在其他地方是有效的(在本服务器中不知道)。Reason-Phrase(原因短句) 应当提示更详细的原因,为什么被叫方暂时不可用。这个值应当是可以被UA设置的。状态码486(Busy Here)可以用来更精确的表示本请求失败的特定原因。
这个状态码也可以是转发服务或者proxy服务器返回的,因为他们发现Request-URI指定的用户存在,但是没有一个给这个用户的合适的当前转发的地址。
4.19 481 Call/Transaction Does Not Exist
这个状态表示了UAS接收到请求,但是没有和现存的对话或者事务匹配。
4.20 482 Loop Detected
服务器检测到了一个循环(16.3/4)
4.21 483 Too Many Hops
服务器接收到了一个请求包含的Max-Forwards(20.22)头域是0
4.22 484 Address InComplete
服务器接收到了一个请求,它的Request-URI是不完整的。在原因短语中应当有附加的信息说明。这个状态码可以和拨号交叠。在和拨号交叠中,客户端 不知道拨号串的长度。它发送增加长度的字串,并且提示用户输入更多的字串,直到不在出现484(Address Incomplete)应答为止。
4.23 485 Ambiguous
Request-URI是不明确的。应答可以在Contact头域中包含一个可能的明确的地址列表。这个提示列表肯囊个在安全性和隐私性对用户或者组织造 成破坏。必须能够由配置决定是否以404(NotFound)代替这个应答,又或者禁止对不明确的地址使用可能的选择列表。
给带有Request-URI的请求的一个应答例子:
sip: lee@example.com:
SIP/2.0 485 Ambiguous
Contact: Carol Lee <sip:carol.lee@example.com>
Contact: Ping Lee <sip:p.lee@example.com>
Contact: Lee M.Foote <sips:lee.foote@example.com>
部分email和语音邮箱系统提供了这个功能。这个状态码和3xx状态码不同:对于300来说,它是假定同一个人或者服务有不同的地址选择。所以对3xx来说,自动选择系统或者连续查找就有效,但是对485(Ambiguous)应答来说,一定要用户的干预。
4.24 486 Busy Here
当成功联系到被叫方的终端系统,但是被叫方当前在这个终端系统上不能接听这个电话,那么应答应当回给呼叫方一个更合适的时间在Retry-After头域 重试。这个用户也许在其他地方有效,比如电话邮箱系统等等。如果我们知道没有其他终端系统能够接听这个呼叫,那么应当返回一个状态码600(Busy Everywhere)。
4.25 487 Request Terminated
请求被BYE或者CANCEL所终止。这个应答永远不会给CANCEL请求本身回复。
4.26 488 Not Acceptable Here
这个应答和606(Not Acceptable)有相同的含义,但是只是应用于Request-URI所指出的特定资源不能接受,在其他地方请求可能可以接受。
包含了媒体兼容性描述的消息体可以出现在应答中,并且根据INVITE请求中的Accept头域进行规格化(如果没有Accept头域,那么就是application/sdp)。这个应答就像给OPTIONS请求的200(OK)应答的消息体一样。
4.27 491 Request Pending
在同一个对话中,UAS接收到的请求有一个依赖的请求正在处理。14.2描述了这种情况应当怎样解决。
4.28 493 Undecipherable
UAS接收到了一个请求,包含了一个加密的MIME,并且不知道或者没有提供合适的解密密钥。这个应答可以包含单个包体,这个包体包含了合适的公钥,这个公钥用于给这个UAS通讯中加密包体使用的。细节描述在23.2节。
5 Server Failure 5xx
5xx应答是当服务器本身故障的时候给出的失败应答。
5.1 500 Server Internal Error
服务器遇到了未知的情况,并且不能继续处理请求。客户端可以显示特定的错误情况,并且可以在几秒种以后重新尝试这个请求。
如果这个情况是临时的,服务器应当在Retry-After头域标志客户端过多少秒钟之后重新尝试这个请求。
5.2 501 Not Implemented
服务器没有实现相关的请求功能。当UAS不认识请求的方法的时候,并且对每一个用户都无法支持这个方法的时候,应当返回这个应答。(proxy不考虑请求的方法而转发请求)。
注意405(Method Not Allowed)是因为服务器实现了这个请求方法,但是这个请求方法在特定请求中不被支持。
5.3 502 Bad Gateway
如果服务器,作为gateway或者proxy存在,从下行服务器上接收到了一个非法的应答(这个应答对应的请求是本服务器为了完成请求而转发给下行服务器的)。
5.4 503 Service Unavailable
由于临时的过载或者服务器管理导致的服务器暂时不可用。这个服务器可以在应答中增加一个Retry-After来让客户端重试这个请求。如果没有 Retry-After指出,客户端必须就像收到了一个500(Server Internal Error)应答一样处理。
客户端(proxy或者UAC)收到503(Service Unavailable)应当尝试转发这个请求到另外一个服务器处理。并且在Retry-After头域中指定的时间内,不应当转发其他请求到这个服务器。
作为503(Service Unavaliable)的替代,服务器可以拒绝连接或者把请求扔掉。
5.5 504 Server Time-out
服务器在一个外部服务器上没有收到一个及时的应答。这个外部服务器是本服务器用来访问处理这个请求所需要的。如果从上行服务器上收到的请求中的Expires头域超时,那么应当返回一个408(Request TimeOut)错误。
5.6 505 Version Not Supported
服务器不支持对应的SIP版本。服务器是无法处理具有客户端提供的相同主版本号的请求,就会导致这样的错误信息。
5.7 Message To Large
服务器无法处理请求,因为消息长度超过了处理的长度。
6 Global Failures 6xx
6xx应答意味这服务器给特定用户有一个最终的信息,并不只是在Request-URI的特定实例有最终信息。
6.1 600 Busy Everywhere
成功联系到被叫方的终端系统,但是被叫方处于忙的状态,并不打算接听电话。这个应答可以通过增加一个Retry-After头域更明确的告诉呼叫方多久以 后可以继续呼叫。如果被叫方不希望提示拒绝的原因,被叫方应当使用603(Decline)。只有当终端系统知道没有其他终端节点(比如语音邮箱系统)能 够访问到这个用户的时候才能使用这个应答。否则应当返回一个486(Busy Here)的应答。
6.2 603 Decline
当成功访问到被叫方的设备,但是用户明确的不想应答。这个应答可以通过增加一个Retry-After头域更明确的告诉呼叫方多久以后可以继续呼叫。只有当终端知道没有其他任何终端设备能够响应这个呼叫的势能才能给出这个应答。
6.3 604 Does Not Exists Anywhere
服务器验证了在请求中Request-URI的用户信息,哪里都不存在
6.4 606 Not Acceptable
当成功联系到一个UA,但是会话描述的一些部分比如请求的媒体,带宽,或者地址类型不被接收。
606(NotAcceptable)应答意味着用户希望通讯,但是不能充分支持会话描述。606(Not Acceptable)应答可以在Warning头域中包含一个原因列表,用于解释为何会话描述不能被支持。警告原因代码在20.43节中列出。
在应答中,可以出现一个包含媒体兼容性描述的消息体,这个消息体的格式根据INVITE请求中的Accept头域指出的格式进行规格化(如果没有 Accept头域,那么就是application/sdp),就像给OPTIONS亲求的200(OK)应答中的消息一样。
我们希望这些媒体协商不要经常需要,并且当一个新用户被邀请加入已经存在的会话的时候,这个媒体协商可能不需要。这取决于邀请的初始化者是否需要对606(Not Acceptable)进行处理。
这个应答只有当客户端知道没有其他终端能够处理这个请求的时候才能发出。

2010年9月2日星期四

自定义Wordpress的Description和Keywords以及Title

很多插件可以定义Wordpress页面的Description和Keywords以及Title,但我一直认为插件都比较消耗资源,不是万不得已,都会寻找手动方法来替代。Wordpress本身不会对这三个关键字添加内容,但有些朋友会说自己没有安装这类插件,而页面源代码中却已经填写了,这是因为有些WordPress主题已经帮你自动处理了。这里介绍的方法也是通过修改主题文件来达到自定义的目的。具体是修改WordPress主题中的header.php文件,也就是在原来的meta标签上面添加如下内容:

<?php
##定义一个函数.解决截取中文乱码的问题###
if (!function_exists('utf8Substr')) {
function utf8Substr($str, $from, $len)
{
return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
'$1',$str);
}
}
if ( is_home() ){
$description = "关注软件开发、网站建设、免费资源、网络电话、通讯技术";
$keywords = "源代码,网络电话,通讯技术,VOIP,eyebeam,nonoh,free,gmail,firefox,免费空间,免费域名,SIP,Gizmo5,pfingo,域名,外链,攀索,pansuo";
}
elseif ( is_single() ){
if ($post->post_excerpt) {
$description  = $post->post_excerpt;
} else {
if(preg_match('/<p>(.*)<\/p>/iU',trim(strip_tags($post->post_content,"<p>")),$result)){
$post_content = $result['1'];
} else {
$post_content_r = explode("\n",trim(strip_tags($post->post_content)));
$post_content = $post_content_r['0'];
}
$description = utf8Substr($post_content,0,220);
}

$keywords = "";
$tags = wp_get_post_tags($post->ID);
foreach ($tags as $tag ) {
$keywords = $keywords . $tag->name . ",";
}
}
###这里是分类页面。自行改变is_category的slug别名或者ID###
elseif ( is_category('free') ){
$description = "为大家介绍实用的免费主机,免费空间,免费网络硬盘,免费代理,免费电话,免费相册,免费域名,免费邮箱,免费流量统计资源";
$keywords = "免费,免费主机,免费空间,免费网盘,免费代理,免费电话,免费相册,免费域名,免费邮箱,免费流量统计,攀索,pansuo";
}
elseif ( is_category('develop') ){
$description = "关于源代码,编程语言,开发实例,学习教程";
$keywords = "C,C++,VC,源代码,编程,编码,程序,源程序";
}
elseif ( is_category('website') ){
$description = "域名注册、空间申请、网站程序、推广策划、SEO";
$keywords = "网站运营,建站经验,搜索优化,网站推广,网页设计";
}
elseif ( is_category('voip') ){
$description = "攀索之路,pansuo,网络电话,免费电话,免费打电话,免费发短信";
$keywords = "网络电话,免费电话,免费打电话,免费发短信,VOIP,SIP,nonoh,betamax,eyebeam,x-lite,pfingo,freecall,sms,callback";
}
elseif ( is_category('earn') ){
$description = "分享网络赚钱的方法,从零开始学起。";
$keywords = "网络赚钱方法,博客怎么赚钱,网络赚钱项目";
}
elseif ( is_category('software') ){
$description = "分享实用软件,软件使用方法";
$keywords = "网络软件,系统工具,聊天软件,图形图像,多媒体,FTP";
}
elseif ( is_category('telecom') ){
$description = "移动通信,GSM,WCDMA,LTE,2G,3G,网络优化,通信工程";
$keywords = "移动通信,通信工程师,通信人才,GSM,WCDMA,LTE,2G,3G,网络优化,通信工程";
}
###这里是Page页。同上。多个页面的话自行添加就是###
elseif ( is_page('about') ){
$description = "关于攀索之路博客的介绍,联系方式,以及网站历程。攀索之路(www.pansuo.com)";
$keywords = "通讯技术,网络电话,免费资源,网络赚钱,软件开发";
}

?>
<?php echo "\n"; ?>
<meta name="description" content="<?php echo trim($description); ?>" />
<meta name="keywords" content="<?php echo rtrim($keywords,','); ?>" />

将原来的Title标签内容改为如下代码:
<?php if ( is_home() ) { ?><title><?php bloginfo('name'); ?> | <?php bloginfo('description'); ?></title><?php } ?>
<?php if ( is_search() ) { ?><title>搜索结果 | <?php bloginfo('name'); ?></title><?php } ?>
<?php if ( is_single() ) { ?><title><?php echo trim(wp_title('',0)); ?> | <?php bloginfo('name'); ?></title><?php } ?>
<?php if ( is_page() ) { ?><title><?php echo trim(wp_title('',0)); ?> | <?php bloginfo('name'); ?></title><?php } ?>
<?php if ( is_category() ) { ?><title><?php single_cat_title(); ?> | <?php bloginfo('name'); ?></title><?php } ?>
<?php if ( is_month() ) { ?><title><?php the_time('F'); ?> | <?php bloginfo('name'); ?></title><?php } ?>
<?php if (function_exists('is_tag')) { if ( is_tag() ) { ?><title><?php  single_tag_title("", true); ?> | <?php bloginfo('name'); ?></title><?php } ?> <?php } ?>

FireFox火狐浏览器自定义地址栏搜索

转载请注明:源自攀索之路里的FireFox火狐浏览器自定义地址栏搜索
本文地址:http://www.pansuo.com/2010/09/firefox-search-def/
订阅本站:攀索之路

每次更新Firefox火狐浏览版本后,地址栏搜索都会还原为默认设置,如果下载是英文版的,默认是使用英文版Google搜索,
其实可以自定义这个地址栏搜索,经过验证,下面的4种设置都很凑效,我用的是第1种,朋友们不妨试试:
1.谷歌搜索(转至搜索页面)
http://www.google.com/search?source=ig&hl=en&rlz=1G1GGLQ_ZH-CNCN297&=&q=
2.谷歌手气不错(默认,直接转到目标站)
http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=
3.bing搜索(转至搜索页面)
http://cn.bing.com/search?go=&form=QBRE&filt=all&qs=n&sk=&sc=8-2&q=
4.百度(转至搜索页面)
http://www.baidu.com/s?ie=utf-8&wd=

2010年9月1日星期三

用电子邮件Gmail邮箱发表WordPress日志

向Wordpress发表博客文章,不再需要登录博客,只需要想设定的email发邮件,WordPress就会自动将邮件内容作为博客文章更新。

下面以常用的GMail为例,一步一步来实现这个功能:

1. 注册一个GMail账号,专门用来发表WordPress博客日志

2. 更改WordPress设置以便访问上述GMail账号

3. 对WordPress进行设置,使之能够通过GMail发表内容

通过GMail发表日志


第一步——新注册一个GMail账号


这个没什么好说的了,大家到www.gmail.com去申请新的Gmail账号就ok了,
强烈建议使用相对隐秘的电子邮件地址——也就是说,这个电子邮件地址需要是常人难以猜到、只有本人知道的地 址。任何投递到这个电子邮件地址的信件将会被发表在博客上,所以我们必须要保证这个地址绝对的私密。此外,有些电子邮件服务器不允许邮件账号完全由数字组 成或以数字开头。因此注册前请先了解虚拟服务器的相关规定。注册GMail时可以点那个检测用户名按钮,看是否可以用。

第二步——更改WordPress设置以访问上述Gmail账号


新邮件账号注册完毕后,返回WordPress后台的“撰写”选项,填写虚拟服主机商提供给用户的邮件服务器地址端口号。(如果不确定具体的邮件服务器地址和端口号,可以在虚拟主机商网站的FAQ版块或用户手册版块中查找。端口号通常为110。)

由于GMail启用了安全连接,所以我们在填写邮件服务器时要以 ssl:// 开头,具体设置如下:

邮件服务器地址:ssl://pop.gmail.com

端口号:995

用户名:*********@gmail.com

密码: *******

默认邮件分类:未分类

然后点击“保存更改”。

注意:如果在注册邮件账号前已经通过“管理界面>设置>撰写>通过电子邮件发表”设置了电子邮件地址,那么注册时的登录名和密码需要和之前的设置保持一致。因为Wordpress要使用这个账号登录GMail去取邮件内容。

第三步——发表邮件日志


现在我们已经注册了新的邮箱账号,也在后台进行了设置,让WordPress博客能够接收新邮箱账号中的邮件。但我们仍然需要再次设置WordPress,让它能够自动发表接收到的邮件。我们可以进行以下任一操作:

手动浏览器激活方式

将邮件发送到新邮箱账号后,立即访问http://example.com/installdir/wp-mail.php。(注意:每次发送日志邮件后都要访问该URL。如果你的博客安装在网站根目录,就把中间的/installdir删除。)

自动浏览器激活方式

如果不想手动激活浏览器,可以在博客页脚位置加上以下iframe代码,自动激活浏览器使之帮助发表日志:

<iframe src="http://yourblogdomain/installdir/wp-mail.php" name="mailiframe" width="0"

height="0" frameborder="0" scrolling="no" title=""></iframe>

编辑以上代码,使链接地址指向我们的wp-mail.php文件的位置。然后将代码添加到当前主题目录下的footer.php文件中(不要将代码包含在HTML段落中,如果你的博客安装在网站根目录,就把中间的/installdir删除。)。

可能还要刷新博客才能查看到新日志。对新用户来说,自动激活浏览器好处更多。

利用插件方式激活就不推荐了,那样占资源还影响浏览速度。

邮件格式


通过邮件发表日志时,WordPress会将邮件的主题行作为日志标题,邮件正文作为日志正文,并删除其中常用的HTML标签。WordPress将日志发表在我们之前选择的默认邮件发表分类下,并默认网站管理员作为该日志的作者。

并且邮件内容一定要使用“普通文本”形式。在Gmail中,“转换为普通文本形式”图标在文本格式工具栏的最右端。

通过邮件发表日志时,不支持附件的发表。所有通过邮件发表的附件都会以原始形式显示在日志正文中。

测试


要测试目前自己是否已经能通过邮箱发送WordPress日志,只需要发送一封邮件到“新账号@邮箱域名” (如果使用.qmail程序,则可以将邮件发送到“用户名@邮箱域名”)。之后进行以下操作:

  • 如果没有设置自动系统,在浏览器中访问http://example.com/installdir/wp-mail.php。如果脚本发现有新邮件,会通知我们并显示出邮件日志的详细情况。之后我们可以返回博客查看日志是否发表成功。

  • 如果页脚使用的是iframe代码,需要刷新浏览器以查看日志是否发表成功

  • 我们的邮件发表状态可能被会标识为“审核中”而不是“已发表”。如果日志状态是“审核中”,那么该日志可以出现在控制板中,但不会显示在博客上。 默认情况下,wp-mail.php会检查发送日志的邮件地址与博客用户设置的邮件地址是否一致。如果一致,日志状态显示为“已发表”,否则显示为“审核 中”。


通过Yahoo! 邮箱、Gmail和Hotmail发表日志


默认情况下大多数基于网络的邮箱客户端都以HTML形式发送邮件,而WordPress“通过邮箱发表日志”这一功能并不支持HTML发送。

因此用这种邮箱发表日志前,一定要使用“普通文本”形式。

在Yahoo!邮箱中,“转换为普通文本形式”图标在“订阅”字样的右边。而Gmail中,“转换为普通文本形式”图标在文本格式工具栏的最右端。Hotmail的“转换为普通文本形式”图标则在邮件操作栏(位于邮件正文上方)的拼写检查图标附近。

开始使用 Gmail

在手机上使用 Gmail