为 WordPress 添加“热门文章”小工具

hot-post-widget

WordPress 提供了很多内置的小工具(widget)以方便对网站进行功能定制,比如搜索、日历、标签云、近期文章、分类目录等等,这些小工具可以满足大部分网站对管理、检索文章的需求。目前的 wordpress 没有提供一些比较通用的功能,比如本篇文章要介绍的 “热门文章” 功能,这个功能的实现方法有多种,本文将基于 wordpress 的小工具(widget)来实现,这样可以在一个页面的不同区块进行复用。

WordPress 小工具(widget)有一套内置的实现规则,所有对现有小工具进行功能扩展都需要遵循这些规则,这些规则主要就是从对小工具基础类 WP_Widget 进行扩展来体现的。这个类主要有四个方法可以根据小工具的功能需求做重载(修改),它们分别是:

  • public function __construct() {} //构造函数,widget 实例初始化
  • public function widget( $args, $instance ) {} //小工具内容的显示输出
  • public function update( $new_instance, $old_instance ) {} //widget实例参数修改
  • public function form( $instance ) {} //后台管理小工具参数的维护界面

“热门文章” 小工具就是通过对这四个函数做重载来实现的,下面逐一说明并给出具体的实现方法

1、 __construct() 函数,小工具实例参数初始化,比如类名、描述等,代码如下:

public function __construct() {
  $widget_ops = array(
	'classname' => 'widget_hot_entries',
	'description' => __( 'Your site’s most hot Posts.' ),
	'customize_selective_refresh' => true,
	);
  parent::__construct( 'hot-posts', __( 'Hot Posts' ), $widget_ops );
  $this->alt_option_name = 'widget_hot_entries';
}

2、 widge()函数,显示热门文章的标题链接,代码如下:

public function widget( $args, $instance ) {
	if ( ! isset( $args['widget_id'] ) ) {
		$args['widget_id'] = $this->id;
	}

	$title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Hot Posts' );
	$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
	$number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;
	if ( ! $number ) {
		$number = 5;
	}
	$show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false;

	$r = new WP_Query( apply_filters( 'widget_posts_args', array(
		'posts_per_page'      => $number,
		'no_found_rows'       => true,
		'post_status'         => 'publish',
		'ignore_sticky_posts' => true,
		'meta_key' => 'wpb_post_views_count',//文章点击数key
		'orderby' => 'meta_value_num',//按文章点击数排序
		'order' => 'DESC',
	), $instance ) );

	if ( ! $r->have_posts() ) {
		return;
	}
	?>
	<?php echo $args['before_widget']; ?>
	<?php
	if ( $title ) {
		echo $args['before_title'] . $title . $args['after_title'];
	}
	?>
	<ul>
		<?php foreach ( $r->posts as $hot_post ) : ?>
			<?php
			$post_title = get_the_title( $hot_post->ID );
			$title      = ( ! empty( $post_title ) ) ? $post_title : __( '(no title)' );
			?>
			<li>
				<a href="<?php the_permalink( $hot_post->ID ); ?>"><?php echo $title ; ?></a>
				<?php if ( $show_date ) : ?>
					<span class="post-date"><?php echo get_the_date( '', $hot_post->ID ); ?></span>
				<?php endif; ?>
			</li>
		<?php endforeach; ?>
	</ul>
	<?php
	echo $args['after_widget'];
}

3、update()函数,对当前的 widget 实例参数做修改,在小工具管理界面中修改参数,比如热门文章的显示条数,代码如下:

public function update( $new_instance, $old_instance ) {
	$instance = $old_instance;
	$instance['title'] = sanitize_text_field( $new_instance['title'] );
	$instance['number'] = (int) $new_instance['number'];
	$instance['show_date'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : false;
	return $instance;
}

4、form()函数,对小工具的相关参数进行修改的用户界面,代码如下:

public function form( $instance ) {
	$title     = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
	$number    = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
	$show_date = isset( $instance['show_date'] ) ? (bool) $instance['show_date'] : false;
?>
	<p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
	<input class="widefat" 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 class="tiny-text" id="<?php echo $this->get_field_id( 'number' ); ?>" name="<?php echo $this->get_field_name( 'number' ); ?>" type="number" step="1" min="1" value="<?php echo $number; ?>" size="3" /></p>

	<p><input class="checkbox" type="checkbox"<?php checked( $show_date ); ?> id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" />
	<label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( 'Display post date?' ); ?></label></p>
<?php
}

通过上面四个步骤就把 “热门文章” 小工具的代码写好了,如果要把小工具集成到wordpress 后台管理工具中,还需要对 “热门文章” 小工具进行注册,代码如下:

function register_hot_widget() {
    register_widget( 'WP_Widget_Hot_Posts' );
}
add_action( 'widgets_init', 'register_hot_widget' );

接下来,使用 wordpress 后台管理工具选择 “外观” – “主题编辑” 子菜单,在右边主题文件列表里选择模板函数(functions.php), 滚动代码到尾部,把上面五个部分的所有代码添加到里面即可。

最后有一点要说明的是,热门文章是根据文章的点击量排序产生的,如何记录文章的阅览量,请参考另一篇文章《如何给 wordpress 添加文章阅览计数功能》

发表评论

邮箱地址不会被公开。 必填项已用*标注