给WordPress Page添加摘要输入框

SEO 一个方面就是给页面添加 Meta Description,虽然添加 Description 不会更改页面的权重,但是在 Google 等现代搜索引擎的搜索结果页面会直接使用 Description 来作为搜索结果,这样显示得更加友好,用户也能一眼就知道博客文章或者页面主要内容是什么,使得用户更加容易点击你的页面,增加博客的流量。

我一般是使用 WordPress 的摘要直接作为 Meta Description 进行 SEO,但是默认情况下 WordPress Page 编辑页面没有摘要(Excerpt)输入框,所以对 WordPress 进行 SEO 的时候比较麻烦。

这个时候我们就可以通过以下代码给我 WordPress Page 添加摘要输入框:

add_action( 'admin_menu', 'pageDescription' );
function pageDescription() {
  add_meta_box( 'postexcerpt', __('Excerpt'), 'post_excerpt_meta_box', 'page', 'normal', 'core' );
}

只需将以上的代码添加到当前主题的 functions.php 文件即可。当然你也可以添加一个插件头,作为一个单独插件使用。这样在 WordPress 后台编辑 Page 的时候和编辑 Post 一样有摘要输入框了。

如何控制WordPress文章标题的长度

其实解决这个问题很简单,只需要一句话就行了。在 WordPress 里,我们使用

<?php the_title(); ?>

来输出文章标题,与其相关的还有一个函数:

<?php get_the_title(); ?>

简单的说说两者的关系,get_the_title() 返回值是一个字符串(文章标题),而 the_title() 就是该字符串通过 echo 输出后的值。

实际上就是 WordPress 自己在输出文章标题时进行了简化,直接用

<?php the_title(); ?>

代替了

<?php echo get_the_title(); ?>

除此之外这里还需要用到另外一个函数:mb_strimwidth(string str, int start, int width, [string trimmarker], [string encoding]);

mb_strimwidth() truncates string str to specified width. It returns truncated string.

If trimmarker is set, trimmarker is appended to return value.

start is start position offset. Number of characters from the beginning of string. (First character is 0)

trimmarker is string that is added to the end of string when string is truncated.

encoding is character encoding. If it is omitted, internal encoding is used.

现在大部分的 PHP 服务器都支持了 MB 库(mbstring 库 全称是 Multi-Byte String 即各种语言都有自己的编码,他们的字节数是不一样的,目前php内部的编码只支持ISO-8859-*, EUC-JP, UTF-8 其他的编码的语言是没办法在 php 程序上正确显示的。解决的方法就是通过 php 的 mbstring 函数库来解决),所以我们可以放心的使用这个用于控制字符串长度的函数:

<?php echo mb_strimwidth(get_the_title(), 0, 38, '...'); ?>

那么我们只需要用上面这个函数替换 WordPress 原有的

<?php the_title(); ?>

即可,这里我输出了字符串的第0位到第38位,根据主题的不同可以自行设置该数值,另外多余长度部分使用“…”代替。

控制 WordPress 文章标题长度

其实我在控制文章摘要的时候也是使用的这个函数

<?php echo mb_strimwidth(strip_tags(apply_filters('the_content', $post->post_content)), 0, 470,"......"); ?>

来输出470个字符长度的摘要,并过滤了 HTML 标记。

自定义WordPress后台用户联系方式

在 WordPress 后台,个人设置(Profile)中,除了可以设置电子邮件和 Website 之外,还可以设置自己的联系方式

只需要调用下 custom_contactmethods 这个 WordPress Filter 既可以实现在后台支持常用的 QQ, 微信等联系方式,代码如下,加在funcitons.php:

add_filter('user_contactmethods','customContact');
function customContact($user_contactmethods ){
  $user_contactmethods = array(
    'qq' => 'QQ',
    'wechat' => '微信'
  );
  return $user_contactmethods ;
}

WordPress内置文章缩略图功能(Post Thumbnail)

1. 激活文章缩略图功能

要激活该功能,打开你主题的functions.php文件,输入下面的代码:

add_theme_support( 'post-thumbnails' );

你也可以添加一个参数来指定在post还是page激活该功能:

add_theme_support( 'post-thumbnails', array( 'post', 'page' ) );

2.输出到主题

要在你的主题中显示出设置的图片,你需要在loop里面添加下面这个函数:

<?php the_post_thumbnail(); ?>

你可以给该函数传递一个参数值来调用图片的不同尺寸,

the_post_thumbnail(); // 默认显示缩略图
the_post_thumbnail('thumbnail'); // 显示缩略图
the_post_thumbnail('medium'); // 显示中等尺寸
the_post_thumbnail('large'); // 显示大尺寸
the_post_thumbnail( array(100,100) ); // 自定义尺寸图

3. 在loop外调用某篇文章的文章缩略

如果你想在loop以外调用某些文章的缩略图,另一个函数为你准备:

<?php echo get_the_post_thumbnail(); ?>

和the_post_thumbnail()相比,它需要再传入一个参数来指定文章的ID:

get_the_post_thumbnail($id);
get_the_post_thumbnail($id, 'thumbnail');
get_the_post_thumbnail($id, 'medium');
get_the_post_thumbnail($id, 'large');
get_the_post_thumbnail($id, array(100,100) );

WordPress前台添加登陆框wp_login_form函数

使用这个wp_login_form函数还需要先判断用户是否登录,如果已经登陆了,肯定就不显示这个登陆框了。这里需要配合wordpress判断用户是否登录函数来一起使用。

<?php if ( is_user_logged_in() ) { ... } ?>

具体使用代码如下:

<?php if ( is_user_logged_in() ) : ?>
  <li>welcome, registered user!</li>
  <li><a href="<?php echo home_url();?>/wp-admin">wp admin</a></li>
  <li><a href="<?php echo home_url();?>/wp-admin/post-new.php">post new</a></li>
  <li><a href="<?php echo home_url();?>/wp-login.php?action=logout">log out</a></li>
<?php else : ?>
  <li>welcome, visitor!</li>
  <li><?php wp_login_form('label_username=用户'); ?></li>
<?php endif ?>

启用WordPress 3.0的多站点支持功能

在 WordPress 3.0 开工的时候,就已经正式对外公布了本次更新最大的一个亮点,就是将 WordPress MU 与 WordPress 进行功能上的合并。这也就意味着,从 3.0 开始,WordPress 将真正意义上的支持多用户、多站点功能。

这几天,WordPress 3.0 的第一个 Beta 版本也对外发布了,虽然还处于紧张的开发调试阶段,但大家不妨先行进行一些测试。也好为以后的开发工作积累一些经验。

3.0 的多站点(Multisite)功能从最开始合并完毕后,直接可以在后台点击激活,到现在需要经过一些配置才可以使用,估计是考虑到某些用户可能会误点击而导致不必要的麻烦发生。

下面就介绍一下如何激活 WordPress 3.0 的多站点支持功能:

第一步,当然是下载最新版的 WordPress 程序,并进行安装。和以前的安装步骤并没有什么区别。

第二步,将以下代码加入到 wp-config.php 文件当中:

define ('WP_ALLOW_MULTISITE', true );

第三步,在 wp-content 目录中创建一个 blogs.dir 目录,用于存储子站点用户上传数据。

第四步,在后台的“Tools”(工具)菜单中会多出一个“Network”(网络)的项目。点击进入……

第五步,根据页面提示,对 wp-config.php 文件进行修改。(切记,修改前请备份。)

第六步,根据页面提示,覆盖 .htaccess 文件中的内容。(切记,修改前请备份。)

好了,通过以上六步的设置,现在刷新一下后台,也许会要求重新登陆。看一下原来左侧的导航栏上,是不是多出来一个“Super Admin”(超级管理)的栏目?点击里面各个功能项,如果您之前使用过 MU,您一定会觉得特别亲切。

在启用多站点功能之前,有几点需要大家注意:

第一,做好 wp-config.php 文件和 .htaccess 文件的备份。只要备份在手,恢复到单站点模式将易如反掌。

第二,在启用之前,请尽量将站点链接形式从默认形式改为其他形式。

第三,您的主机必须支持 Rewrite 功能。否则,您看到这里,属于浪费时间。

WordPress页面跳转到网址

最简单的方法就是在导航菜单里直接加入一个链接就行了。

下面给出的方法实现的功能是在页面的内容里输入一个网址,然后页面自动跳转到这个网址。

一、主题文件夹下新建一个page-redirect.php文件,文件内容如下

<?php
/*
Template Name:page redirect
*/
header('Location:'.$post->post_content);
?>

二、在后台控制面板新建一个页面,标题根据你的需要填写,比如“WordPress中文论坛”。内容输入需要跳转的网址,比如 http://www.wpcnz.com ,模板选择”page redirect”。然后发布即可。

巧用WordPress缩略图

WordPress 不仅是博客, 很多时候 WordPress 还被用作为 CMS (内容管理系统).博主们喜欢为每个文章加上统一大小的缩略图, 尤其是信息类平台. 其中比较常用的处理办法是用 custom field 向文章插入图片,通过上传大小一致的小图或者使用 phpThumb 等工具生成缩略图.

2.7 开始, WordPress 大幅提升多媒体功能, 越来越多人使用 WP 的内置图片仓库. 对这些用户来说,制作缩略图变得并不那么困难, 在上传图片的时候就会默认生成 150×150 规格的小图 (如果图片高度/宽度不足 150px,使用原高度/宽度). 那我们可以充分利用这个功能, 在文章列表上加上这个图片作为缩略图. 这样处理各有利弊, 好处是简单, 智能(不用每次输入缩略图), 坏处是消耗服务器流量.

Okay, 现在要做的就是提取上传生成的小图片, 并放置在文章的适当位置. 我创建了一个文件 thumb.php, 图片获取和调用一起处理, 文件内容如下.

<?php
$args = array(
  'post_parent' => $post->ID,
  'post_type' => 'attachment',
  'post_mime_type' => 'image'
);
  
$images = &get_children( 'post_type=attachment&post_mime_type=image&post_parent=' . $post->ID );
$imageUrl = '';
  
if ($images) {
  $image = array_pop($images);
  $imageSrc = wp_get_attachment_image_src($image->ID);
  $imageUrl = $imageSrc[0];
}else{
  $imageUrl = get_bloginfo('template_url') . '/img/default.gif';
}
?>
<a href="<?php the_permalink() ?>"><img class="left" src="<?php echo $imageUrl; ?>" alt="<?php the_title(); ?>" width="150" height="150" /></a>

这段代码会去找第一个上传的图片 的缩略图 (如果第一个图片被删除, 则找第二个的, 如此类推…),如果找不到任何上传图片则使用默认图片. 代码中用到 get_children 和 wp_get_attachment_image_src两个方法

然后在文章列表 index.php, 存档页面 archive.php 和搜索页面 search.php 中调用, 调用代码如下.

<?php include('thumb.php'); the_content('Read More...'); ?>

WordPress非插件版页面分页

使用WordPress的朋友都知道,它的分页采用的是“上一页、下一页”的方式,对于文章太多的朋友不是太方面,当然你可以使用一些翻页的插件来实现如 “pages:1 of 10 1 2 3 4 …”的效果,本人一直都不太喜欢使用插件,正好手头有个不错的方法来实现。

1. 打开你主题模板的functions.php,在里面添加以下代码:

<?php
function wp_pagenavi($before = '', $after = '', $prelabel = '', $nxtlabel = '', $pages_to_show = 5, $always_show = false){
    global $request, $posts_per_page, $wpdb, $paged;
    if (empty($prelabel)) {
        $prelabel = '<strong>上一页</strong>';
    }
    if (empty($nxtlabel)) {
        $nxtlabel = '<strong>下一页</strong>';
    }
    $half_pages_to_show = round($pages_to_show / 2);
    if (!is_single()) {
        if (!is_category()) {
            preg_match('#FROM\\s(.*)\\sORDER BY#siU', $request, $matches);
        } else {
            preg_match('#FROM\\s(.*)\\sGROUP BY#siU', $request, $matches);
        }
        $fromwhere = $matches[1];
        $numposts = $wpdb->get_var("SELECT COUNT(DISTINCT ID) FROM {$fromwhere}");
        $max_page = ceil($numposts / $posts_per_page);
        if (empty($paged)) {
            $paged = 1;
        }
        if ($max_page > 1 || $always_show) {
            echo "{$before} <div class='pagers'><span>当前第 {$paged} / {$max_page} 页 : </span>";
            if ($paged >= $pages_to_show - 1) {
                echo '<a href="' . get_pagenum_link() . '">&laquo; 首页</a>';
            }
            previous_posts_link($prelabel);
            for ($i = $paged - $half_pages_to_show; $i <= $paged + $half_pages_to_show; $i++) {
                if ($i >= 1 && $i <= $max_page) {
                    if ($i == $paged) {
                        echo "<strong>{$i}</strong>";
                    } else {
                        echo '<a href="' . get_pagenum_link($i) . '">' . $i . '</a>';
                    }
                }
            }
            next_posts_link($nxtlabel, $max_page);
            if ($paged + $half_pages_to_show < $max_page) {
                echo '<a href="' . get_pagenum_link($max_page) . '">最后 &raquo;</a>';
            }
            echo "</div> {$after}";
        }
    }
}?>

2. 在index.php archive.php等需要分页的地方使用

<?php wp_pagenavi(); ?>

替换掉

<?php previous_post_link('上一篇: %link'); ?>
<?php next_post_link('%link :下一篇'); ?>

CSS样式

.pagers{height:25px;color:#111;padding:2px 0;margin:0;text-align:center;}
.pagers a,.pagers strong{margin:0 2px;padding:2px 5px;}
.pagers a{border:1px solid #6c8c37}
.pagers strong{border:1px solid #111}

WordPress显示同个父页面的其他子页面的链接

假设以下情况,有一个父页面,然后它有一些子页面。当你打开父页面的时候,你想在 sidebar 显示它的子页面的链接。当你打开子页面链接的时候,你还是想要显示同样一组链接。但问题是,你现在想显示的是相同父页面的其他子页面。你不能通过一个简单函数就能解决这个问题。下面是详细解决方法:

<?php
if($post->post_parent)
  $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0");
else
  $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0");
if ($children) {
  echo '<ul>';
  echo $children;
  echo '</ul>';
} ?>