今天去Wp Recipes逛了一下,发现一篇很有用的文章,描述如何在WordPress后台文章列表页面显示Pingbacks和Trackbacks。Sola的pings不多,不过真正让我有兴趣的是了解如何在post或者page的列表页面添加新的表单栏目。

来自Wp Recipes的代码

Sola自己试了一下,这段代码可以在文章列表页面显示一个新的栏目名为Counts,该栏目显示文章获得的pings数量,将代码放在主题的functions.php中即可看到效果,但从功能上讲,Sola认为这个做成插件更合适,因为它与内容相关,而非样式相关。

function commentCount($type = 'comments'){
	if($type == 'trackbacks'):
		$typeSql = 'comment_type = "trackback"';
		$oneText = 'One :trackback';
		$moreText = '% :trackbacks';
		$noneText = 'No :trackbacks';
	elseif($type == 'pingbacks'):
		$typeSql = 'comment_type = "pingback"';
		$oneText = 'One :pingback';
		$moreText = '% :pingbacks';
		$noneText = 'No :pingbacks';
	endif;
	global $wpdb;
    $result = $wpdb->get_var('
        SELECT
            COUNT(comment_ID)
        FROM
            '.$wpdb->comments.'
        WHERE
            '.$typeSql.' AND
            comment_approved="1" AND
            comment_post_ID= '.get_the_ID()
    );
	if($result == 0):
		echo str_replace('%', $result, $noneText);
	elseif($result == 1):
		echo str_replace('%', $result, $oneText);
	elseif($result > 1):
		echo str_replace('%', $result, $moreText);
	endif;
}
add_filter('manage_posts_columns', 'posts_columns_counts', 1);
add_action('manage_posts_custom_column', 'posts_custom_columns_counts', 1, 2);
function posts_columns_counts($defaults){
    $defaults['wps_post_counts'] = __('Counts');
    return $defaults;
}
function posts_custom_columns_counts($column_name, $id){
	if($column_name === 'wps_post_counts'){
		commentCount('trackbacks'); echo "<br />";
		commentCount('pingbacks');
    }
}

代码中并没有添加翻译支持,如果需要显示中文,将每个字符串都用__()函数替代。

学到的知识

学习就要举一反三,既然可以给posts添加,肯定也可以给page甚至自定义文章类型列表添加。上面代码用到的一个action和一个filter分别为

add_filter('manage_posts_columns', 'posts_columns_counts', 1);
add_action('manage_posts_custom_column', 'posts_custom_columns_counts', 1, 2);

filter: manage_pages_columns负责添加新的表单栏目Counts,与之类似的filters有

manage_pages_columns: 修改page页面栏目

manage_{$post_type}_posts_columns: 修改custom post type的列表页栏目

和manage_pages_columns一样,他们也接受参数$posts_columns,该参数记载了所有已经生效的栏目。

action: manage_posts_custom_column则负责输出栏目的内容,与它类似的action有

manage_pages_custom_column:适用于page类型的

manage_{$post->post_type}_posts_custom_column: 针对custom post type的

值得一提的是manage_posts_columns其实也接受第二个参数$post_type,原型如下

$posts_columns = apply_filters( 'manage_posts_columns', $posts_columns, $post_type );

manage_pages_custom_column同理

do_action( 'manage_posts_custom_column', $column_name, $post->ID );

官方文档:http://codex.wordpress.org/Plugin_API/Action_Reference/manage_posts_custom_column