wordpress 给 WordPress 博客添加随机文章的3个方法

[复制链接]
建站高手 发表于 2016-10-29 20:55:38 [wordpress] 显示全部楼层 |阅读模式 上一主题 下一主题

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
随机向访客展示网站中的一些文章不失为增加访客粘性的一个好方法。最近查了些资料,总结了三种向 WordPress 网站添加随机文章的方法,三种方法各有优点。为什么要向访客展示随机文章呢?我一直的想法是将比较有特色的文章列表展示出来,可是现在文章比较多了,维护起来比较麻烦,经常是很久都懒得更新列表。相关文章对于希望了解某一特定问题的访客比较有吸引力,随机文章则可以用另一种方式吸引一些注意力,特别是对于那些目的性不强的访客。当然,最好的推荐文章的方式应该是整个热门文章列表。可是热门文章列表比较麻烦,之前弄了一段时间,后来放弃了。

嗯,废话就不多说了,下面是总结的三种方法。

WordPress 的文章查询函数 get_posts() 有个参数 orderby 指明了获取文章时的排序方式。通常我们是按照文章发布日期排序,比如 WordPress 站点首页、分类页和标签页中的文章列表。orderby 还可以是 rand,它使用 MySQL 的 RAND() 函数来确定排序参数,也就是随机排序。

使用方法如下:
  1. $args = array( 'numberposts' => 5, 'orderby' => 'rand', 'post_status' => 'publish' );
  2. $rand_posts = get_posts( $args );
复制代码

这样就能得到随机排序(第 2 个参数)的已发布(第 3 个参数)文章中的 5 篇(第 1 个参数)。

需要特别注意的是,如果没有第 3 个参数,它可能会将草稿之类的文章也显示出来。

1. 向主题模板中添加
最直接的用法就是修改主题模板,在需要的位置放入下面的代码。
  1. <ul>
  2. <?php
  3. $args = array( 'numberposts' => 5, 'orderby' => 'rand', 'post_status' => 'publish' );
  4. $rand_posts = get_posts( $args );
  5. foreach( $rand_posts as $post ) : ?>
  6.         <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
  7. <?php endforeach; ?>
  8. </ul>
复制代码

这样就能以列表的形式展示 5 篇带链接的随机文章。

优点:直接,可定制性强(可随意修改展示位置),消耗资源少

缺点:每次升级或更换主题都需要重新修改模板(使用子主题的话可能不需要每次升级都修改)

2. 使用插件
WordPress 插件目录中的随机文章插件还不少。这里列举几个目前比较活跃和有特色的。

AJAX Random Posts
免费;
使用 AJAX 技术在页面加载后获取随机文章,兼容 WordPress 缓存插件如 WP Super Cahe,可以在启用静态缓存的情况下保证各个页面的随机文章仍然是随机并随每次访问而变;
高度可定制,包括文章数目、HTML 格式、标签(如文章链接、标题、分类、日期等)。
Advanced Random Posts Widget:
免费;
高度可定制,包括显示缩略图(可自定义尺寸,但是没有深度加工因而可能比较丑陋)、摘要(可定制长度)、选择分类、日期等,可支持 get_the_image 函数和多个挂件。
Random Post for Widget:
免费,简洁;
可定制显示文章数目,可排除制定 ID 的文章。
WPSIREN Random Post by Click:
免费;
特色是显示一个打开一篇随机文章的按钮,并可对按钮样式进行深度定制。
Random Post:
基本功能免费;
提供四种展示效果;
可定制显示文章数目、自动更新以及自动更新时间;
如果需要选择文章分类则需要购买高级版。
Random Posts Widget Configurable:
免费;
可定制显示文章数目。
优点:方便、快捷

缺点:稍微增加了服务器负担;定制化性能取决于选用的插件

3. 修改主题 functions.php 文件
注意:只适用于 PHP 5.2+

我的需求就是在 WordPress 后台中的“小工具”里增加一个“随机文章”的可用小工具,让我可以将其添加到边栏中作为微件显示出来。

现在我的 WordPress 中插件已经很多了,不希望增加太多的插件造成更多负担,所以就在主题的 functions.php 文件中增加了一个函数类来完成这个任务。

将下面的代码直接,或定制化修改后放入主题的 functions.php 文件中即可。如果当前使用的主题没有 functions.php 文件,可以在该主题的目录下自己创建一个,不过一定要注意在文档的开头输入 <?php,结尾输入 ?>。

随机文章小工具在 WordPress 后台的位置和效果
随机文章小工具在 WordPress 后台的位置和效果

成功后在 WordPress 后台的“小工具”页面可以找到对应的可用小工具(左图),添加到边栏后可设置微件标题和显示文章数目(右图)。页面显示效果如本页右上。
代码( // 后为注释):
  1. //--------------- * 注册该微件
  2. class WP_Widget_myRandom_Posts extends WP_Widget {

  3.     function __construct() {
  4.         $widget_ops = array('classname' => 'widget_my_random_posts', 'description' => __( '水景一页定制的随机文章微件。The cnzhx customized random posts widget.' ) );
  5.         parent::__construct('random-posts', __('随机文章 Random Posts'), $widget_ops);
  6.         $this->alt_option_name = 'widget_my_random_posts';
  7.     }

  8.     function widget( $args, $instance ) {
  9.         global $randomposts, $post;

  10.         extract($args, EXTR_SKIP);
  11.         $output = '';
  12.         // 设置 widget 标题
  13.         $title = apply_filters('widget_title', empty($instance['title']) ? __('随机文章 Random Posts') : $instance['title']);

  14.         // 设置要获取的文章数目
  15.         if ( ! $number = absint( $instance['number'] ) )
  16.             $number = 5;

  17.         // WP 数据库查询,使用 rand 参数来获取随机的排序,并取用前面的 $number 个文章
  18.         $randomposts = get_posts( array( 'number' => $number, 'orderby' => 'rand', 'post_status' => 'publish' ) );

  19.         // 下面开始准备输出数据
  20.         // 先输出一般的 widget 前缀
  21.         $output .= $before_widget;
  22.         // 输出标题
  23.         if ( $title )
  24.         $output .= $before_title . $title . $after_title;

  25.         // random posts 列表开始
  26.         $output .= '<ul id="randomposts">';
  27.         if ( $randomposts ) {
  28.             foreach ( (array) $randomposts as $post) {
  29.                 $output .= '<li><a href="' . get_permalink() . '">' . $post->post_title . '</a></li>';
  30.             }
  31.         }
  32.         $output .= '</ul>';
  33.         // 输出一般的 widget 后缀
  34.         $output .= $after_widget;

  35.         // 输出到页面
  36.         echo $output;
  37.     }

  38.     function update( $new_instance, $old_instance ) {
  39.         $instance = $old_instance;
  40.         $instance['title'] = strip_tags($new_instance['title']);
  41.         $instance['number'] = absint( $new_instance['number'] );

  42.         $alloptions = wp_cache_get( 'alloptions', 'options' );
  43.         if ( isset($alloptions['widget_my_random_posts']) )
  44.             delete_option('widget_my_random_posts');

  45.         return $instance;
  46.     }

  47.     //
  48.     // 在 WP 后台的 widget 内部显示两个参数, 1. 标题;2. 显示文章数目
  49.     //
  50.     function form( $instance ) {
  51.         $title = isset($instance['title']) ? esc_attr($instance['title']) : '';
  52.         $number = isset($instance['number']) ? absint($instance['number']) : 5;
  53.         ?>
  54.         <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
  55.         <input class="cnzhx" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" /></p>

  56.         <p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Number of posts to show:'); ?></label>
  57.         <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p>
  58.         <?php
  59.     }
  60. }

  61. // register WP_Widget_myRandom_Posts widget
  62. add_action( 'widgets_init', create_function( '', 'return register_widget("WP_Widget_myRandom_Posts");' ) );
复制代码


优点:比方法 1 费资源、比方法 2 省资源,可定制化程度极高

缺点:麻烦

以上内容没多少技术含量,仅仅综合利用了网上的资源。请在回帖中留下您的观点。




上一篇:SEO优化:思维和细节是网站排名的关键
下一篇:站长工具-如何收集图片段子

大神点评2

159357a 发表于 2016-11-9 23:56:43 [wordpress] 显示全部楼层
很不错  支持下
zb7ang 发表于 2019-6-11 11:17:49 [wordpress] 显示全部楼层
顶起来,大家顶起来!
大家足球 -> www.dajiazuqiu.com
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表