WordPress 后台的文章列表、页面列表、用户列表等界面都内置了批量操作功能,比如批量删除、批量移动分类、批量编辑状态等。但对于许多定制化项目来说,默认的批量操作和列表列往往不能满足实际需求。扩展列表列、添加自定义筛选条件、增加批量操作选项,可以让内容管理效率大幅提升。

首先,修改文章列表的显示列是一个常见的优化。使用 manage_{post_type}_posts_columns 过滤器可以添加或删除列:

add_filter('manage_post_posts_columns', 'add_custom_post_columns');
function add_custom_post_columns($columns) {
    $columns['featured_image'] = '特色图片';
    $columns['shortcode'] = '短代码';
    $columns['views'] = '浏览次数';
    return $columns;
}

添加列之后,还需要填充数据。使用 manage_{post_type}_posts_custom_column 动作:

add_action('manage_post_posts_custom_column', 'fill_custom_post_columns', 10, 2);
function fill_custom_post_columns($column_name, $post_id) {
    if ($column_name == 'featured_image') {
        if (has_post_thumbnail($post_id)) {
            echo get_the_post_thumbnail($post_id, array(50, 50));
        } else {
            echo '无';
        }
    }
    if ($column_name == 'shortcode') {
        echo '[post id="' . $post_id . '"]';
    }
    if ($column_name == 'views') {
        echo get_post_meta($post_id, 'post_views', true) ?: 0;
    }
}

添加的列通常也可以排序。使用 manage_edit-post_sortable_columns 过滤器让列可排序,然后通过 pre_get_posts 处理排序逻辑:

add_filter('manage_edit-post_sortable_columns', 'make_custom_columns_sortable');
function make_custom_columns_sortable($columns) {
    $columns['views'] = 'views';
    return $columns;
}

add_action('pre_get_posts', 'handle_custom_column_sorting');
function handle_custom_column_sorting($query) {
    if (!is_admin() || !$query->is_main_query()) return;
    if ($query->get('orderby') == 'views') {
        $query->set('meta_key', 'post_views');
        $query->set('orderby', 'meta_value_num');
    }
}

筛选功能同样可以扩展。添加下拉筛选框可以让管理员按自定义字段、作者、分类等条件快速过滤列表。使用 restrict_manage_posts 动作输出筛选控件:

add_action('restrict_manage_posts', 'add_custom_category_filter');
function add_custom_category_filter($post_type) {
    if ($post_type != 'post') return;
    $selected = isset($_GET['custom_category']) ? $_GET['custom_category'] : '';
    ?>
    <select name="custom_category">
        <option value="">所有自定义分类</option>
        <option value="news" <?php selected($selected, 'news'); ?>>新闻</option>
        <option value="blog" <?php selected($selected, 'blog'); ?>>博客</option>
    </select>
    <?php
}

然后在 pre_get_posts 中解析筛选条件。

批量操作是另一个重要的扩展点。在文章列表的批量下拉菜单中,默认有“移动到回收站”、“编辑”等选项。你可以添加自定义批量操作:

add_filter('bulk_actions-edit-post', 'add_custom_bulk_actions');
function add_custom_bulk_actions($actions) {
    $actions['set_featured'] = '设为精选文章';
    $actions['add_redirect'] = '添加重定向';
    return $actions;
}

处理自定义批量操作需要在 handle_bulk_actions-edit-post 钩子中实现:

add_action('handle_bulk_actions-edit-post', 'handle_custom_bulk_actions', 10, 3);
function handle_custom_bulk_actions($redirect_to, $action, $post_ids) {
    if ($action == 'set_featured') {
        foreach ($post_ids as $post_id) {
            update_post_meta($post_id, 'is_featured', 'yes');
        }
        $redirect_to = add_query_arg('bulk_featured', count($post_ids), $redirect_to);
    }
    return $redirect_to;
}

处理完成后,可以用 admin_notices 显示操作成功的提示:

add_action('admin_notices', 'bulk_action_admin_notices');
function bulk_action_admin_notices() {
    if (!empty($_REQUEST['bulk_featured'])) {
        $count = intval($_REQUEST['bulk_featured']);
        echo '<div class="notice notice-success"><p>已设置 ' . $count . ' 篇文章为精选。</p></div>';
    }
}

快速编辑(Quick Edit)同样支持自定义字段。使用 quick_edit_custom_box 动作可以添加字段:

add_action('quick_edit_custom_box', 'add_quick_edit_field', 10, 2);
function add_quick_edit_field($column_name, $post_type) {
    if ($column_name == 'views') {
        wp_nonce_field('quick_edit_nonce', 'quick_edit_nonce');
        ?>
        <fieldset class="inline-edit-col-right">
            <div class="inline-edit-col">
                <label>
                    <span class="title">浏览次数</span>
                    <span class="input-text-wrap"><input type="text" name="post_views" value="" /></span>
                </label>
            </div>
        </fieldset>
        <?php
    }
}

然后通过 save_post 或 wp_ajax_inline-save 保存数据。

以上这些后台管理扩展,虽然看起来只是界面上的小改动,但对于每天需要管理大量内容的管理员来说,节省的时间和操作便利性是非常可观的。合理的后台定制能让内容管理流程更顺畅,减少出错的可能性。