在研究文章列表页的添加自定义列实现方法《 关于自定义列详情参考:wordpress-在文章列表页添加自定义列 》,疑惑于display_custom_column_content动作钩子为什么只对自定义列字段产生作用,对其列表项渲染过程产生好奇,遂作简要研究,笔记备忘。

如下代码,其中【title】、【data】是自定义文章默认展示列,字段【fanhua_category_column】是我自定义的列。
{
"cb": "<input type=\"checkbox\" />",
"title": "标题",
"date": "日期",
"fanhua_category_column": "分类"
}
◆ title列渲染
用call_user_func 的 PHP 函数,调用指定以_column_开头并且后面跟着列名的方法,即_column_title方法。
// class-wp-list-table.php
elseif ( method_exists( $this, '_column_' . $column_name ) ) {
echo call_user_func(
array( $this, '_column_' . $column_name ),
$item,
$classes,
$data,
$primary
);
html渲染如下代码
// class-wp-posts-list-table.php
protected function _column_title( $post, $classes, $data, $primary ) {
echo '<td class="' . $classes . ' page-title" ', $data, '>';
echo $this->column_title( $post );
echo $this->handle_row_actions( $post, 'title', $primary );
echo '</td>';
}
◆ data列渲染
普通列【data】字段,则以column_开头并且后面跟着列名的方法,即column_data方法。
// class-wp-list-table.php
elseif ( method_exists( $this, 'column_' . $column_name ) ) {
echo "<td $attributes>";
echo call_user_func( array( $this, 'column_' . $column_name ), $item );
echo $this->handle_row_actions( $item, $column_name, $primary );
echo '</td>';

◆ 自定义列渲染
// class-wp-list-table.php
else {
echo "<td $attributes>";
echo $this->column_default( $item, $column_name );
echo $this->handle_row_actions( $item, $column_name, $primary );
echo '</td>';
}
字段【fanhua_category_column】是我自定义的,其<td>标签里的自定义值内容,是调用column_default方法并触发manage_{$post->post_type}_posts_custom_column动作钩子而后所赋具体的值。
// class-wp-posts-list-table.php
public function column_default( $item, $column_name ) {
...
do_action( "manage_{$post->post_type}_posts_custom_column", $column_name, $post->ID );
}