首页 » SEO网站优化 » wordpress实现随机文章调用代码

wordpress实现随机文章调用代码

 

参考资料cnzhx.net/blog/wordpress-random-posts/

原文就是上面的链接,这里他的第三个方法我无法改数量。最后只能用了第一种方法,如果以后研究透了会在这篇文章里加上我的方法的。下面是转载的文章:
随机向访客展示网站中的一些文章不失为增加访客粘性的一个好方法。最近查了些资料,总结了三种向 WordPress 网站添加随机文章的方法,三种方法各有优点。目前水景一页采用的是第三种方法。
为什么要向访客展示随机文章呢?我一直的想法是将比较有特色的文章列表展示出来,可是现在文章比较多了,维护起来比较麻烦,经常是很久都懒得更新列表。相关文章对于希望了解某一特定问题的访客比较有吸引力,随机文章则可以用另一种方式吸引一些注意力,特别是对于那些目的性不强的访客。当然,最好的推荐文章的方式应该是整个热门文章列表。可是热门文章列表比较麻烦,之前弄了一段时间,后来放弃了。

原理:

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

$args = array( 'numberposts' => 5, 'orderby' => 'rand', 'post_status' => 'publish' );
$rand_posts = get_posts( $args );

这样就能得到随机排序(第 2 个参数)的已发布(第 3 个参数)文章中的 5 篇(第 1 个参数)。需要特别注意的是,如果没有第 3 个参数,它可能会将草稿之类的文章也显示出来。

方法一:

最直接的用法就是修改主题模板,在需要的位置放入下面的代码。

<ul>
<?php
$args = array( 'numberposts' => 5, 'orderby' => 'rand', 'post_status' => 'publish' );
$rand_posts = get_posts( $args );
foreach( $rand_posts as $post ) : ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>

这样就能以列表的形式展示 5 篇带链接的随机文章。
优点:直接,可定制性强(可随意修改展示位置),消耗资源少
缺点:每次升级或更换主题都需要重新修改模板(使用子主题的话可能不需要每次升级都修改)

方法二:

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:
免费;
可定制显示文章数目。
优点:方便、快捷
缺点:稍微增加了服务器负担;定制化性能取决于选用的插件

方法三:

修改functions.php
注意:只适用于 PHP 5.2+
我的需求就是在 WordPress 后台中的“小工具”里增加一个“随机文章”的可用小工具,让我可以将其添加到边栏中作为微件显示出来。
现在我的 WordPress 中插件已经很多了,不希望增加太多的插件造成更多负担,所以就在主题的 functions.php 文件中增加了一个函数类来完成这个任务。
将下面的代码直接,或定制化修改后放入主题的 functions.php 文件中即可。如果当前使用的主题没有 functions.php 文件,可以在该主题的目录下自己创建一个,不过一定要注意在文档的开头输入<?php ,结尾输入?>

/**
* Random_Posts widget class
*
* Author: haoxian_zeng <https://cnzhx.net/>
* Date: 2013.05.14, cnzhx2011 1.0
*/
//--------------- * 注册该微件
class WP_Widget_myRandom_Posts extends WP_Widget {


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

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

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

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

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

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

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

// 输出到页面
echo $output;
}

function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['title'] = strip_tags($new_instance['title']);
$instance['number'] = absint( $new_instance['number'] );

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

return $instance;
}

//
// 在 WP 后台的 widget 内部显示两个参数, 1. 标题;2. 显示文章数目
//
function form( $instance ) {
$title = isset($instance['title']) ? esc_attr($instance['title']) : '';
$number = isset($instance['number']) ? absint($instance['number']) : 5;
?>
<p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
<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>

<p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Number of posts to show:'); ?></label>
<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>
<?php
}
}

// register WP_Widget_myRandom_Posts widget
add_action( 'widgets_init', create_function( '', 'return register_widget("WP_Widget_myRandom_Posts");' ) );

2016年12月15日更新,好吧。我无语了,上面那个还不如我这个博客自带的模板随机文章好用。。。下面贴我这个模板自带的随机文章代码

//添加随机文章小工具
class RandomPostWidget extends WP_Widget
{
function RandomPostWidget()
{
parent::WP_Widget('bd_random_post_widget', 'HMJ-Blog 随机文章', array('description' => '随机文章小工具') );
}

function widget($args, $instance)
{
extract( $args );

$title = apply_filters('widget_title',empty($instance['title']) ? '随机文章' :
$instance['title'], $instance, $this->id_base);
if ( empty( $instance['number'] ) || ! $number = absint( $instance['number'] ) )
{
$number = 5;
}
$r = new WP_Query(array('posts_per_page' => $number, 'no_found_rows' => true,
'post_status' => 'publish', 'ignore_sticky_posts' => true, 'orderby' =>'rand'));
if ($r->have_posts())
{
echo "\n";
echo $before_widget;
if ( $title ) echo $before_title . $title . $after_title;
?>
<ul class="line">
<?php while ($r->have_posts()) : $r->the_post(); ?>
<li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?></a></li>
<?php endwhile; ?>
</ul><?php
echo $after_widget;
wp_reset_postdata();
}
}

function update($new_instance, $old_instance)
{
$instance = $old_instance;
$instance['title'] = strip_tags($new_instance['title']);
$instance['number'] = (int) $new_instance['number'];
return $instance;
}

function form($instance)
{
$title = isset($instance['title']) ? esc_attr($instance['title']) : '';
$number = isset($instance['number']) ? absint($instance['number']) : 5;?>
<p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('标题:'); ?></label>
<input id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" /></p>

<p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('显示文章数:'); ?></label>
<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>
<?php
}

}
add_action('widgets_init', create_function('', 'return register_widget("RandomPostWidget");'));

 

原文链接:wordpress实现随机文章调用代码,转载请注明来源!

2