WordPress 5.3 增強“網絡站點”的功能

對數據庫的更改

WordPress 5.1 中站點元數據的引入為多站點開闢了許多新的可能性。

在多站點元數據中保存數據庫版本和更新日期

[46193]中,數據庫版本和更新日期都保存在blogmeta表中。

如果您的多站點設置要求從全局上下文訪問數據庫版本,而不是使用switch_to_blog調用在每個站點周圍循環get_option( 'db_version' ),那您可以嘗試以下函數。

function get_site_versions() {
global $wpdb;
$query = $wpdb->prepare( "SELECT blog_id, meta_value FROM $wpdb->blogmeta WHERE meta_key = 'db_version' ORDER BY blog_id DESC");
return $wpdb->get_results( $query );
}

刪除blog_versions表

目前,多站點中有一個名為blog_versions的數據表。這個表將數據庫版本存儲為數字和更新日期。它是在#11644中引入的,但一直都沒有在WP核心中使用過。

由於現在將數據庫版本和更新日期都保存在blogmeta表中,所以blog_versions表就多餘了。

對WP_MS_Sites_List_Table的更改

WordPress 5.3在WP_MS_Sites_List_Table類中添加了一些增強功能,使插件作者可以利用站點元數據在“ 管理網絡站點”界面上為多站點管理員提供更豐富的體驗。

使用和/或自定義“所有文章”界面的人員將非常熟悉這些增強功能。

站點狀態視圖

現在,“網絡站點”界面將顯示一個鏈接列表,其中包含按狀態(例如“公共”,“垃圾”等)的站點計數,類似於“所有文章”屏幕上的文章狀態鏈接。

狀態鏈接也可以使用views_sites-network過濾器進行過濾。

例如,假設有一個多站點,其中主站點充當本地餐館的目錄,而每個站點都是針對單個餐館的,而餐館所有者可以購買“訂閱”,從而使他們可以顯示有關其餐館清單的更多信息:基本訂閱將允許他們添加餐廳的照片,高級訂閱將允許他們添加菜單。

然後可以將訂閱級別存儲在blogmeta表中,並可以為不同的訂閱級別添加“狀態”鏈接,如下所示:

add_filter( 'views_sites-network', 'myplugin_add_site_status_views' );
function myplugin_add_site_status_views( $view_links ) {
$statuses = array(
'free' => _n_noop(
'Free (%s)',
'Free (%s)',
'myplugin'
),
'basic' => _n_noop(
'Basic (%s)',
'Basic (%s)',
'myplugin'
),
'advanced' => _n_noop(
'Advanced (%s)',
'Advanced (%s)',
'myplugin'
),
);

// get the count of sites with each of our custom statuses.
$args = array(
'meta_query' => array(
array(
'key' => 'myplugin-status',
'compare' => '=',
),
),
'count' => true,
);
$counts = array();
foreach ( array_keys( $statuses ) as $status ) {
$args['meta_query'][0]['value'] = $status;
$counts[ $status ] = get_sites( $args );
}

$requested_status = isset( $_GET['status'] ) ? wp_unslash( trim( $_GET['status'] ) ) : '';

foreach ( $statuses as $status => $label_count ) {
$current_link_attributes = $requested_status === $status ?
' class="current" aria-current="page"' :
'';
if ( (int) $counts[ $status ] > 0 ) {
$label = sprintf( translate_nooped_plural( $label_count, $counts[ $status ] ), number_format_i18n( $counts[ $status ] ) );

$view_links[ $status ] = sprintf(
'%3$s',
esc_url( add_query_arg( 'status', $status, 'sites.php' ) ),
$current_link_attributes,
$label
);
}
}

return $view_links;
}

當用戶單擊一個自定義狀態鏈接時,可以使用現有的ms_sites_list_table_query_args將列表中的行限制為具有該特定自定義狀態的網站,如下所示:

add_filter( 'ms_sites_list_table_query_args', 'myplugin_sites_with_custom_status' );
function myplugin_sites_with_custom_status( $args ) {
$status = ! empty( $_GET['status' ] ) ? wp_unslash( $_GET['status' ] ) : '';

if ( empty( $status ) || ! in_array( $_GET['status'], array( 'free', 'basic', 'advanced' ) ) ) {
return $args;
}

$meta_query = array(
'key' => 'myplugin-status',
'value' => $status,
);

if ( isset( $args['meta_query'] ) ) {
// add our meta query to the existing one(s).
$args['meta_query'] = array(
'relation' => 'AND',
$meta_query,
array( $args['meta_query'] ),
);
}
else {
// add our meta query.
$args['meta_query'] = array(
$meta_query,
);
}

return $args;
}

額外的表格導航

顯示在“ 所有文章”界面上的文章可以按日期和分類進行過濾。插件還可以通過 restrict_manage_posts過濾器 添加自定義過濾條件。

繼續上面的餐廳指南示例,假設每個餐廳提供的食物也存儲在blogmeta表中。然後,我們可以允許網絡管理員通過添加各種美食的下拉列表,根據食物的類型來過濾站點:

這樣的下拉列表現在可以通過新的restrict_manage_sites動作鉤子(在Trac#45954中引入)添加到“網絡站點”界面上,如下所示:

add_action( 'restrict_manage_sites', 'myplugin_add_cuisines_dropdown' );
function myplugin_add_cuisines_dropdown( $which ) {
if ( 'top' !== $which ) {
return;
}

echo '';

return;
}

當用戶選擇一種食物類型並單擊“ 過濾器”按鈕時,列表中的行可以僅限於使用現有ms_sites_list_table_query_args過濾器提供該美食的站點, 如下所示:


add_filter( 'ms_sites_list_table_query_args', 'myplugin_sites_with_cuisine' );
function myplugin_sites_with_cuisine( $args ) {
if ( empty( $_GET['cuisine' ] ) ) {
return $args;
}

$meta_query = array(
'key' => 'myplugin-cuisine',
'value' => wp_unslash( $_GET['cuisine' ] ),
);

if ( isset( $args['meta_query'] ) ) {
// add our meta query to the existing one(s).
$args['meta_query'] = array(
'relation' => 'AND',
$meta_query,
array( $args['meta_query'] ),
);
}
else {
// add our meta query.
$args['meta_query'] = array(
$meta_query,
);
}

return $args;
}

網站顯示狀態

與其他列表一樣,“站點”列表中的每一行現在都有顯示狀態。默認情況下,每個網站的所有網站狀態(“公共”除外)都作為顯示狀態包括在內。此外,網絡的主站點也具有“主要”顯示狀態。

當用戶選擇了特定的站點狀態視圖時,該狀態將不在顯示狀態中(就像“所有文章”屏幕一樣)。

插件還可以使用display_site_states過濾器修改顯示狀態 。

為了進一步延續我們的餐廳指南示例,我們可以添加自定義狀態以及每個餐廳提供的美食作為顯示狀態。這可以通過以下方式實現:

add_filter( 'ms_sites_list_table_query_args', 'myplugin_sites_with_cuisine' );
function myplugin_sites_with_cuisine( $args ) {
if ( empty( $_GET['cuisine' ] ) ) {
return $args;
}

$meta_query = array(
'key' => 'myplugin-cuisine',
'value' => wp_unslash( $_GET['cuisine' ] ),
);

if ( isset( $args['meta_query'] ) ) {
// add our meta query to the existing one(s).
$args['meta_query'] = array(
'relation' => 'AND',
$meta_query,
array( $args['meta_query'] ),
);
}
else {
// add our meta query.
$args['meta_query'] = array(
$meta_query,
);
}

return $args;
}

其他變更

返回短路的多站點類

修復在 [44983]原始補丁,在多站點類中引入了預查詢過濾器。此錯誤使短路行為與其他短路行為有所不同,並且仍在繼續執行。現在,通過networks_pre_querysites_pre_query運行過濾後,該代碼將立即退出。這使開發人員可以完全熱線連接網絡和站點查詢,以從另一個來源(例如,不同的緩存或彈性搜索)進行加載。

通過ID改進了站點和網絡查找的性能

在早期版本的WordPress中,當運行代碼get_site( 12345 ) 時,如果沒有該站點的ID,是不會緩存結果的。這意味着隨後的所有查找仍將導致數據庫查詢被觸發,這是不必要的。在[45910]中,不存在的站點數據將存儲為-1而不是false,以便後續的數據庫查找。

發表評論

郵箱地址不會被公開。 必填項已用*標註