WordPress 管理员列表:添加自定义过滤器

已发表: 2021-02-26

WordPress Admin 中有关您的页面和帖子的大多数信息都组织成表格。 任何使用 WordPress 的人都会熟悉这些。 它们运行良好,允许您对某些页面或帖子信息进行“快速编辑”,向您显示帖子或页面的发布日期等等。 此外,您可能已经注意到,您可以使用显示在每个表格顶部的下拉菜单来过滤这些表格。

然而,只有少数几个过滤器。 那么,如果你想过滤一个在 Admin 中没有过滤框的值,你会怎么做? 幸运的是,WordPress 确实允许我们添加自己的过滤器。 我们将看看如何。

为什么使用自定义过滤器

那么,为什么您需要任何自定义过滤器来组织 WordPress 中的管理表呢? 假设我们有一个拥有大量帖子作者和大量帖子的网站。

使用 Pressidium 托管您的网站

60 天退款保证

查看我们的计划

您可以从 Admin 表中查看 Posts 作者,无需任何修改。 您目前无法按作者对帖子进行排序。 如果您希望能够轻松查看特定作者撰写的所有帖子,显然这是一个重大限制。 如果您可以查看所有帖子作者的下拉菜单,然后从列表中选择一个,这会有所帮助。 这真的可以加快速度。

让我们看看我们如何构建它。

创建我们的自定义过滤器

为了帮助您构建自己的过滤器,WordPress 提供了restrict_manage_postspre_get_posts挂钩。

wp-admin/includes/class-wp-posts-list-table.php文件中的第 557 行附近引入了restrict_manage_posts ,并在在管理表列表上方创建过滤器按钮之前触发。

我们将使用自定义函数并像往常一样将其与restrict_manage_posts挂钩链接(查看此处了解更多信息)。 转到活动主题的主文件夹并使用您喜欢的编辑器打开functions.php文件。 在文件内容的末尾插入以下代码:

 function my_author_filter(){ $screen = get_current_screen(); global $post_type; if( $screen->id == 'edit-post' ){ $my_args = array( 'show_option_all' => 'All Authors', 'orderby' => 'display_name', 'order' => 'ASC', 'name' => 'authors_admin_filter', 'who' => 'authors', 'include_selected' => true ); if(isset($_GET['authors_admin_filter'])){ $my_args['selected'] = (int)sanitize_text_field($_GET['authors_admin_filter']); } wp_dropdown_users($my_args); } } add_action('restrict_manage_posts','my_author_filter');

我们使用的主要条件是if( $screen->id == 'edit-post') 。 在这里,我们使用了get_current_screen() WordPress 函数,它返回我们所在的屏幕 ID。

在这种情况下,管理屏幕 ID 是“edit-post”。 换句话说,我们确保我们在帖子管理屏幕上。 例如,如果我们想将其应用于我们应该使用的页面管理屏幕if( $screen->id == 'edit-page'或者如果我们正在处理自定义帖子类型,那么edit-{post_type}将是正确的 if 语句。

注意:要查看每个管理屏幕对应的 ID,您可以查看有关管理屏幕参考的官方文档。

在下面的代码中,我们检查是否已经选择了作者,如果是,我们应用选定的值:

 if(isset($_GET['authors_admin_filter'])){ $my_args['selected'] = (int)sanitize_text_field($_GET['authors_admin_filter']); }

最后,通过使用wp_dropdown_users WordPress 函数,我们将根据我们之前定义的参数生成作者的下拉列表。

接下来,我们选择了将在show_option_all参数中显示“show-all”选项的文本。 我们选择了“所有作者”字符串。 在“名称”参数中,我们为下拉列表填写所需的名称。 稍后我们将使用此值来过滤帖子列表结果。

在“谁”参数中,我们定义了要查询的用户类型,在我们的例子中是“作者”。 使用“include_selected”参数,我们选择是否要在下拉列表中包含选定的用户 ID。

此时,如果您刷新管理员帖子屏幕,您应该会在其他内置过滤器菜单旁边看到作者下拉菜单。

如果您选择一个值并按“过滤器”,该值将在页面重新加载时保持选中状态,但结果将保持不变。 在下一步中,我们将进行必要的更改,以过滤帖子列表以仅显示链接到我们选择的作者的帖子。

过滤结果

再一次, pre_get_posts过滤器将完成工作。 我们已经在我们的文章 WordPress 管理员搜索:扩展结果中检查了这个钩子。 在实际查询运行之前,我们将再次使用它来更改在管理后屏幕中创建的查询变量对象。 在您的functions.php中插入以下行:

 function my_author_filter_results($query){ $screen = get_current_screen(); global $post_type; if ( $screen->id == 'edit-post' ) { if(isset($_GET['authors_admin_filter'])){ $author_id = sanitize_text_field($_GET['authors_admin_filter']); if($author_id != 0){ $query->query_vars['author'] = $author_id; } } } } add_action('pre_get_posts','my_author_filter_results');

和以前一样,主要条件在这里也是必要的,以确保我们在管理帖子屏幕上。

$author_id = sanitize_text_field($_GET['authors_admin_filter']); 将选定的作者 ID 保存在$author_id变量中。 在此之后,如果作者 ID 不为 0(选择了所有作者),我们在查询的作者参数中传递$author_id值。

就是这样。 现在显示的帖子将仅是属于所选作者/用户 ID 的帖子。

结论

管理员屏幕中的自定义过滤可以使管理员用户轻松搜索您的内容,这在您拥有大量帖子或页面时非常宝贵。 当然,这只是在 Admin 表中使用过滤器的一种可能方式。 您可能会发现它有用的替代方法有很多,希望我们在此处概述的技术将帮助您创建自己的过滤器。

例如,您可能希望创建一个下拉过滤器菜单,其中包含显示过去 30 天内创建的帖子的选项,或者可能希望创建一个按任何分类对帖子进行排序的过滤器。 query_vars 列表可以帮助您集思广益!

玩这个很棒的功能,玩得开心!

也可以看看

WordPress 管理员列表:添加自定义过滤器
WordPress 自定义字段入门