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 自定義字段入門