如何控制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内置文章缩略图功能(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目录调用最新文章和摘要

<?php
require_once('blog/wp-config.php');
function get_recent_posts($no_posts = 6, $before = '+ ', $after = '<br>', $show_pass_post = false, $skip_posts = 0) {
  global $wpdb, $tableposts;
  $request = "SELECT ID, post_title, post_date, post_content FROM $tableposts WHERE post_status = 'publish' ";
  if(!$show_pass_post) {
    $request .= "AND post_password ='' ";
  }
  $request .= "ORDER BY post_date DESC LIMIT $skip_posts, $no_posts";
  $posts = $wpdb->get_results($request);
  $output = '';
  foreach ($posts as $post) {
    $post_title = stripslashes($post->post_title);
    // $post_date = mysql2date('j.m.Y', $post->post_date);
    $permalink = get_permalink($post->ID);
    $post_content = stripslashes($post->post_content);
    $output .= $before . '<a href="' . $permalink . '" rel="bookmark" title="Permanent Link: ' . $post_title . '">' . $post_title . '</a>'. $after;
    $output .= $before . $post_content .$after;
  }
  echo $output;
}

function mul_excerpt ($excerpt) {
  $myexcerpt = substr($excerpt,0,255);
  return utf8_trim($myexcerpt) . '... ';
}
get_recent_posts();
?>

WordPress文章复制自动加版权信息

编辑themes下的模板文件single.php,在适当的位置加入以下代码即可

<script type="text/javascript">
document.body.oncopy=function(){
  event.returnValue=false;
  var t=document.selection.createRange().text;
  var s="本文来源于<?php bloginfo('name'); ?> <?php echo get_settings('home'); ?> , 原文地址: <?php the_permalink() ?> ";
  clipboardData.setData('Text','\r\n'+t+'\r\n'+s+'\r\n');
}
</script>

WordPress如何获取文章内容的第一段

如果文章没有填摘要,使用文章的第一段作为摘要是不错的选择,那么如何获取文章内容的第一段呢?可以使用下面的函数

function get_first_p($post){
  //如果是使用 Windows Live Writer 这些工具写日志,可能使用<p>和</p>进行分段
  if(preg_match('/<p>(.*)<\/p>/iU',trim(strip_tags($post->post_content,"<p>")),$matches)){
    return $matches[1];
  } else {
    //如果直接在 WordPress 写日志,使用换行符(\n)来分段
    $post_content = explode("\n",trim(strip_tags($post->post_content)));
    return $post_content ['0'];
  }
}

WordPress文章/页面添加分页的方法页面添加分页的方法

当WP文章很长的时候,需要添加分页来将文章切分为多页,那么可以使用标签:

<!–nextpage–>

在WP编辑器的HTML模式下,在需要分页的内容后面输该分页标签即可完成分页,该标签当然也可重复使用。

如果在文章中添加了分页标签,查看该文章时,却没有显示分页导航的效果。这时就需要在模板的相关文件添加一个内置函数来得到分页导航。

在主题的index.和single.php(如果有的话)等文件中,找到类似下面的代码:

<?php the_content(__('(more...)'));?>

在这行代码下面添加

<?php wp_link_pages(); ?>

保存后,重新刷新添加了分页的文章,你就可以看到分页的效果了。

WordPress相关文章代码版

<h3>Related Posts</h3>
<ul>
<?php
$post_num = 5;
$exclude_id = $post->ID;
$posttags = get_the_tags(); $i = 0;
if ( $posttags ) {
	$tags = ''; foreach ( $posttags as $tag ) $tags .= $tag->term_id . ',';
	$args = array(
		'post_status' => 'publish',
		'tag__in' => explode(',', $tags),
		'post__not_in' => explode(',', $exclude_id),
		'caller_get_posts' => 1,
		'orderby' => 'comment_date',
		'posts_per_page' => $post_num
	);
	query_posts($args);
	while( have_posts() ) { the_post(); ?>
		<li><a rel="bookmark" href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
	<?php
		$exclude_id .= ',' . $post->ID; $i ++;
	} wp_reset_query();
}
if ( $i < $post_num ) {
	$cats = ''; foreach ( get_the_category() as $cat ) $cats .= $cat->cat_ID . ',';
	$args = array(
		'category__in' => explode(',', $cats),
		'post__not_in' => explode(',', $exclude_id),
		'caller_get_posts' => 1,
		'orderby' => 'comment_date',
		'posts_per_page' => $post_num - $i
	);
	query_posts($args);
	while( have_posts() ) { the_post(); ?>
		<li><a rel="bookmark" href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
	<?php $i++;
	} wp_reset_query();
}
if ( $i  == 0 )  echo '<li>没有相关文章!</li>';
?>
</ul>

WordPress实现随机一篇文章

其实这效果实现非常简单,只要一个简单的自定义页面即可,你只需要创建一个php模板文件,命名为random.php。

代码如下:

<?php
/*
Template Name: random
*/
?>

<?php $rand_post=get_posts('numberposts=1&orderby=rand'); foreach($rand_post as $post) : ?>
<script>location="<?php the_permalink(); ?>";</script>
<?php endforeach; ?>

然后“添加新页面”时选择该random模板即可。

WordPress设置文章只允许特定用户阅读

某个分类/标签的文章只允许登陆用户阅读

if( in_category( array( 'music', 'news' ) ) ) {
    if(is_user_logged_in())
        the_content(;
    else
        echo '请登陆后阅读本文!';
} else {
    the_content();
}

这样分类别名或名称为 music 和 post 的分类下的文章内容就只对登陆用户开放了,游客将会看到提示“请登陆后阅读本文!”,如果你想再添加一个分类images,可以将 array( ‘music’, ‘post’ ) 改成 array( ‘music’, ‘post’, ‘images’ ),更多依次类推;如果只限定一个分类music可以写成 in_category( ‘music’ ) 。如果是限定含有某些标签的文章只对登陆用户开放,可以将以上代码第一行改成:

if( has_tag( array( 'music', 'news' ) ) ) {

music和news为标签的名称或别名,多个标签的写法跟分类相同!

某个分类/标签的文章只允许特定角色的注册用户阅读

WordPress站点的注册用户还可以分三六九等,包括订阅者、投稿者、管理员等等,对于已经登陆的注册用户,同样可以根据用户的角色来决定是否有权阅读文章,在第一部分内容的基础上再加个限制条件就可以了,将第一部分代码的第 2 行改成:

 global $current_user;
 get_currentuserinfo();
 if(is_user_logged_in() && $current_user->user_level > 3)

这样等级小于 3 的注册用户将无权阅读分类music和news下的文章,文章标签的限定类似,详见第一部分的说明。WordPress注册用户的等级参见以下说明:

0 级对应 订阅者

1 级对应 投稿者

2 – 4 级对应 作者

5 – 7 级对应 编辑

8 – 10 级对应 管理员

回复或登录可见

如果你想隐藏文章的部分内容(如猜谜游戏的谜底),让读者登录后才可查看隐藏的内容,可以使用这款插件:Login to view all

如果你是想让读者回复后才可以阅读隐藏的内容,可以用这款插件:Easy2hide

外部调用WordPress最新文章方法

外部调用WP的文章一般有两种情况,一是在同一个站点,二是不同站点

同一个站点

同一个站点的话,假设WP安装在blog目录,在主页调用博客的文章,也是最多的情况

<?php
define('WP_USE_THEMES', false);
require 'blog/wp-blog-header.php'; //修改博客的路径
query_posts('showposts=20'); //显示文章条数
?>
<?php while (have_posts()): the_post();?>
    <li><a href="<?php the_permalink();?>" target="_blank"><?php echo mb_strimwidth(strip_tags(apply_filters('the_title', $post->post_title)), 0, 50, " "); ?></a></li>
<?php endwhile;?>

不在一个站点

一种方法是使用同一站点的方法,在博客根目录中新建blog_call.php文件,内容同上面给出的代码,然后在需要调用的站点使用file_get_contents读取

<?php
$str = file_get_contents("http://www.xxx.com/blog_call.php");
echo $str[0];
?>

另一种方法是读取博客RSS的方式,下面这段PHP读取RSS的代码在网上流传已久,但是很多朋友不知道,其实它是可以用在WP外部调用上的

<?php
// RSS源地址列表数组
$rssfeed = array(
    "http://rss.sina.com.cn/news/allnews/sports.xml", 
    "http://ent.163.com/special/00031K7Q/rss_toutiao.xml"
);

header('Content-Type:text/html;charset= UTF-8'); // 设置编码为UTF-8
for ($i = 0; $i < sizeof($rssfeed); $i++) {
    // 分解开始
    $buff    = "";
    $rss_str = "";
    $fp = fopen($rssfeed[$i], "r") or die("can not open $rssfeed"); // 打开rss地址,并读取,读取失败则中止
    while (!feof($fp)) {
        $buff .= fgets($fp, 4096);
    }
    fclose($fp); // 关闭文件打开
    $parser = xml_parser_create(); // 建立一个 XML 解析器
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); // xml_parser_set_option -- 为指定 XML 解析进行选项设置    
    xml_parse_into_struct($parser, $buff, $values, $idx); // xml_parse_into_struct -- 将 XML 数据解析到数组$values中
    xml_parser_free($parser); // xml_parser_free -- 释放指定的 XML 解析器
    foreach ($values as $val) {
        $tag = $val["tag"];
        $type  = $val["type"];
        $value = $val["value"];
        $tag = strtolower($tag); //标签统一转为小写
        if ($tag == "item" && $type == "open") {
            $is_item = 1;
        } else if ($tag == "item" && $type == "close") {
            //构造输出字符串
            $rss_str .= "<a href='" . $link . "' target=_blank>" . $title . "</a><br />";
            $is_item = 0;
        }
        //仅读取item标签中的内容
        if ($is_item == 1) {
            if ($tag == "title") {$title = $value;}
            if ($tag == "link") {$link = $value;}
        }
    }
    echo $rss_str . "<br />"; //输出结果
}?>

同域名下不同Wordpress间文章调用

<?php
$loca = "/blog"; // 这里定义你的WP目录
require_once dirname(__FILE__) . $loca . '/wp-load.php'; // 注意这里是wp目录下的wp-load.php
wp(); // 这样wp的加载就完成了,我们不需要加载模板。
?>
<?php
query_posts('showposts=10'); //就是这里加了一句query_posts,这样也可以实现调用条数的指定。
while (have_posts()): the_post();?>
    <div class="excerpt"><?php the_excerpt();?></div>
<?php endwhile;?>

<!--导航开始-->
<p align="center">
<?php
global $paged, $wp_query;
if ($paged > 1) {
    echo '<a href=' . str_replace($loca, '', get_previous_posts_page_link()) . '>&laquo; Previous Entry</a> ';
}
if ($paged < $wp_query->max_num_pages) {
    echo ' <a href=' . str_replace($loca, '', get_next_posts_page_link()) . '>Next Entry &raquo;</a>';
}?>
</p>
<!--导航结束-->


PS:这个方法只能用在同一个站点下.如果是不同域名,也就是跨站的情况下,是不能使用这个方法的.

如果跨站的话还是只能使用javascript方式调用。JS调用可以采用Feed to JS来实现。