wp_count_posts()获取各个类型的文章总数

目录

描述

译文

该函数在WordPress 2.5版本中被引入,函数输出每篇文章状态类型的数字。也可以使用wp_count_posts()作为带有第二个参数的template_tag使用,这样会将私密文章状态也包含进去。默认情况下以及用户未登录和一般页面访问者访问时,不显示私密状态文章计数。

函数返回对象的属性为文章状态。需要私密文章状态值时可利用isset() PHP函数来检验其属性。

原文

该函数在WordPress 2.5版本中被引入,函数输出每种文章状态类型的数字。也可以使用wp_count_posts()作为带有第二个参数的template_tag使用,这样会将私密文章状态也包含进去。默认情况下以及用户未登录和一般页面访问者访问时,不显示私密状态文章计数。

函数返回对象的属性为文章状态。需要私密文章状态值时可利用isset() PHP函数来检验其属性。

wp_count_posts() 描述

用法

 <?php wp_count_posts$type$perm ); ?> 

wp_count_posts() 用法

参数

$type

(string) (可选) wp_posts 中文章的类型,用于核查哪种类型与post_type对应。默认post。

默认值: 'post'

$perm

(string) (可选) 如果该参数设置为'readable'并且用户已登录,则可将私密文章状态算入文章状态中。默认为empty string。

默认值: empty string

wp_count_posts() 参数

示例

缺省用法

缺省用法返回已发表文章的计数。这是一个对象,可以在内容中用 var_dump() 来调试输出结果。

/* ----------------------------------
 * wordpress之魂 © http://wphun.com
 * ---------------------------------- */
<?php
$count_posts = wp_count_posts();
?>

获取发表状态文章的计数

要获取已发表文章的状态类型,应先调用wp_count_posts()函数然后确查看“publish”属性。

/* ----------------------------------
 * wordpress之魂 © http://wphun.com
 * ---------------------------------- */
<?php
$count_posts = wp_count_posts();

$published_posts = $count_posts->publish;
?>

若使用PHP5可以用下面更为便捷的方法。这个代码在PHP4中无法运行,因此如果希望保持后台的兼容性,应该选择上面的代码。

/* ----------------------------------
 * wordpress之魂 © http://wphun.com
 * ---------------------------------- */
<?php
$published_posts = wp_count_posts()->publish;
?>

草稿计数

计算草稿数量方法与获取发表状态计数方法一致。

/* ----------------------------------
 * wordpress之魂 © http://wphun.com
 * ---------------------------------- */
<?php
$count_posts = wp_count_posts();

$draft_posts = $count_posts->draft;
?>

页面计数

计算页面类型数量的方法与计算文章一样,也需要利用第一个参数。查找某一状态下的页面数量与查找该状态下的日志方法相同。

/* ----------------------------------
 * wordpress之魂 © http://wphun.com
 * ---------------------------------- */
<?php
$count_pages = wp_count_posts('page');
?>

其他用法

wp_count_posts() 可查找日志状态下任何日志类型的数量,包括附件以及将要添加的任何日志类型,也可以通过插件或WordPress部分核心团队达到这一效果。

wp_count_posts() 示例

源文件

wp_count_posts() 函数的代码位于 wp-includes/post.php.

/* ----------------------------------
 * wordpress之魂 © http://wphun.com
 * ---------------------------------- */
/**
 * Count number of posts of a post type and if user has permissions to view.
 *
 * This function provides an efficient method of finding the amount of post's
 * type a blog has. Another method is to count the amount of items in
 * get_posts(), but that method has a lot of overhead with doing so. Therefore,
 * when developing for 2.5+, use this function instead.
 *
 * The $perm parameter checks for 'readable' value and if the user can read
 * private posts, it will display that for the user that is signed in.
 *
 * @since 2.5.0
 *
 * @global wpdb $wpdb
 *
 * @param string $type Optional. Post type to retrieve count. Default 'post'.
 * @param string $perm Optional. 'readable' or empty. Default empty.
 * @return object Number of posts for each status.
 */
function wp_count_posts( $type = 'post', $perm = '' ) {
	global $wpdb;

	if ( ! post_type_exists( $type ) )
		return new stdClass;

	$cache_key = _count_posts_cache_key( $type, $perm );

	$counts = wp_cache_get( $cache_key, 'counts' );
	if ( false !== $counts ) {
		/** This filter is documented in wp-includes/post.php */
		return apply_filters( 'wp_count_posts', $counts, $type, $perm );
	}

	$query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s";
	if ( 'readable' == $perm && is_user_logged_in() ) {
		$post_type_object = get_post_type_object($type);
		if ( ! current_user_can( $post_type_object->cap->read_private_posts ) ) {
			$query .= $wpdb->prepare( " AND (post_status != 'private' OR ( post_author = %d AND post_status = 'private' ))",
				get_current_user_id()
			);
		}
	}
	$query .= ' GROUP BY post_status';

	$results = (array) $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A );
	$counts = array_fill_keys( get_post_stati(), 0 );

	foreach ( $results as $row ) {
		$counts[ $row['post_status'] ] = $row['num_posts'];
	}

	$counts = (object) $counts;
	wp_cache_set( $cache_key, $counts, 'counts' );

	/**
	 * Modify returned post counts by status for the current post type.
	 *
	 * @since 3.7.0
	 *
	 * @param object $counts An object containing the current post_type's post
	 *                       counts by status.
	 * @param string $type   Post type.
	 * @param string $perm   The permission to determine if the posts are 'readable'
	 *                       by the current user.
	 */
	return apply_filters( 'wp_count_posts', $counts, $type, $perm );
}

wp_count_posts() 源文件

相关