對(duì)數(shù)據(jù)庫(kù)的更改
WordPress 5.1?中站點(diǎn)元數(shù)據(jù)的引入為多站點(diǎn)開(kāi)辟了許多新的可能性。
在多站點(diǎn)元數(shù)據(jù)中保存數(shù)據(jù)庫(kù)版本和更新日期
在[46193]中,數(shù)據(jù)庫(kù)版本和更新日期都保存在blogmeta表中。
如果您的多站點(diǎn)設(shè)置要求從全局上下文訪問(wèn)數(shù)據(jù)庫(kù)版本,而不是使用switch_to_blog調(diào)用在每個(gè)站點(diǎn)周圍循環(huán)get_option( 'db_version' ),那您可以嘗試以下函數(shù)。
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表
目前,多站點(diǎn)中有一個(gè)名為blog_versions的數(shù)據(jù)表。這個(gè)表將數(shù)據(jù)庫(kù)版本存儲(chǔ)為數(shù)字和更新日期。它是在#11644中引入的,但一直都沒(méi)有在WP核心中使用過(guò)。
由于現(xiàn)在將數(shù)據(jù)庫(kù)版本和更新日期都保存在blogmeta表中,所以blog_versions表就多余了。
對(duì)WP_MS_Sites_List_Table的更改
WordPress 5.3在WP_MS_Sites_List_Table類中添加了一些增強(qiáng)功能,使插件作者可以利用站點(diǎn)元數(shù)據(jù)在“ 管理網(wǎng)絡(luò)站點(diǎn)”界面上為多站點(diǎn)管理員提供更豐富的體驗(yàn)。
使用和/或自定義“所有文章”界面的人員將非常熟悉這些增強(qiáng)功能。
站點(diǎn)狀態(tài)視圖
現(xiàn)在,“網(wǎng)絡(luò)站點(diǎn)”界面將顯示一個(gè)鏈接列表,其中包含按狀態(tài)(例如“公共”,“垃圾”等)的站點(diǎn)計(jì)數(shù),類似于“所有文章”屏幕上的文章?tīng)顟B(tài)鏈接。

狀態(tài)鏈接也可以使用views_sites-network過(guò)濾器進(jìn)行過(guò)濾。
例如,假設(shè)有一個(gè)多站點(diǎn),其中主站點(diǎn)充當(dāng)本地餐館的目錄,而每個(gè)站點(diǎn)都是針對(duì)單個(gè)餐館的,而餐館所有者可以購(gòu)買“訂閱”,從而使他們可以顯示有關(guān)其餐館清單的更多信息:基本訂閱將允許他們添加餐廳的照片,高級(jí)訂閱將允許他們添加菜單。
然后可以將訂閱級(jí)別存儲(chǔ)在blogmeta表中,并可以為不同的訂閱級(jí)別添加“狀態(tài)”鏈接,如下所示:
add_filter( 'views_sites-network', 'myplugin_add_site_status_views' );
function myplugin_add_site_status_views( $view_links ) {
$statuses = array(
'free' => _n_noop(
'Free <span class="count">(%s)</span>',
'Free <span class="count">(%s)</span>',
'myplugin'
),
'basic' => _n_noop(
'Basic <span class="count">(%s)</span>',
'Basic <span class="count">(%s)</span>',
'myplugin'
),
'advanced' => _n_noop(
'Advanced <span class="count">(%s)</span>',
'Advanced <span class="count">(%s)</span>',
'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(
'<a href="%1$s"%2$s>%3$s</a>',
esc_url( add_query_arg( 'status', $status, 'sites.php' ) ),
$current_link_attributes,
$label
);
}
}
return $view_links;
}
當(dāng)用戶單擊一個(gè)自定義狀態(tài)鏈接時(shí),可以使用現(xiàn)有的ms_sites_list_table_query_args將列表中的行限制為具有該特定自定義狀態(tài)的網(wǎng)站,如下所示:
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;
}
額外的表格導(dǎo)航
顯示在“?所有文章”界面上的文章可以按日期和分類進(jìn)行過(guò)濾。插件還可以通過(guò) restrict_manage_posts過(guò)濾器 添加自定義過(guò)濾條件。
繼續(xù)上面的餐廳指南示例,假設(shè)每個(gè)餐廳提供的食物也存儲(chǔ)在blogmeta表中。然后,我們可以允許網(wǎng)絡(luò)管理員通過(guò)添加各種美食的下拉列表,根據(jù)食物的類型來(lái)過(guò)濾站點(diǎn):

這樣的下拉列表現(xiàn)在可以通過(guò)新的restrict_manage_sites動(dòng)作鉤子(在Trac#45954中引入)添加到“網(wǎng)絡(luò)站點(diǎn)”界面上,如下所示:
add_action( 'restrict_manage_sites', 'myplugin_add_cuisines_dropdown' );
function myplugin_add_cuisines_dropdown( $which ) {
if ( 'top' !== $which ) {
return;
}
echo '<select name="cuisine">';
printf( '<option value="">%s</option>', __( 'All cuisines', 'myplugin' ) );
$cuisines = array(
'French' => __( 'French', 'myplugin' ),
'Indian' => __( 'Indian', 'myplugin' ),
'Mexican' => __( 'Mexican', 'myplugin' ),
);
$requested_cuisine = isset( $_GET['cuisine'] ) ? wp_unslash( $_GET['cuisine'] ) : '';
foreach ( $cuisines as $cuisine => $label ) {
$selected = selected( $cuisine, $requested_cuisine, false );
printf( '<option%s>%s</option>', $selected, $label );
}
echo '</select>';
return;
}
當(dāng)用戶選擇一種食物類型并單擊“?過(guò)濾器”按鈕時(shí),列表中的行可以僅限于使用現(xiàn)有ms_sites_list_table_query_args過(guò)濾器提供該美食的站點(diǎn),?如下所示:
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;
}
網(wǎng)站顯示狀態(tài)
與其他列表一樣,“站點(diǎn)”列表中的每一行現(xiàn)在都有顯示狀態(tài)。默認(rèn)情況下,每個(gè)網(wǎng)站的所有網(wǎng)站狀態(tài)(“公共”除外)都作為顯示狀態(tài)包括在內(nèi)。此外,網(wǎng)絡(luò)的主站點(diǎn)也具有“主要”顯示狀態(tài)。

當(dāng)用戶選擇了特定的站點(diǎn)狀態(tài)視圖時(shí),該狀態(tài)將不在顯示狀態(tài)中(就像“所有文章”屏幕一樣)。
插件還可以使用display_site_states過(guò)濾器修改顯示狀態(tài)?。
為了進(jìn)一步延續(xù)我們的餐廳指南示例,我們可以添加自定義狀態(tài)以及每個(gè)餐廳提供的美食作為顯示狀態(tài)。這可以通過(guò)以下方式實(shí)現(xiàn):
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;
}
其他變更
返回短路的多站點(diǎn)類
修復(fù)在?[44983]原始補(bǔ)丁,在多站點(diǎn)類中引入了預(yù)查詢過(guò)濾器。此錯(cuò)誤使短路行為與其他短路行為有所不同,并且仍在繼續(xù)執(zhí)行。現(xiàn)在,通過(guò)networks_pre_query和sites_pre_query運(yùn)行過(guò)濾后,該代碼將立即退出。這使開(kāi)發(fā)人員可以完全熱線連接網(wǎng)絡(luò)和站點(diǎn)查詢,以從另一個(gè)來(lái)源(例如,不同的緩存或彈性搜索)進(jìn)行加載。
通過(guò)ID改進(jìn)了站點(diǎn)和網(wǎng)絡(luò)查找的性能
在早期版本的WordPress中,當(dāng)運(yùn)行代碼get_site( 12345 )?時(shí),如果沒(méi)有該站點(diǎn)的ID,是不會(huì)緩存結(jié)果的。這意味著隨后的所有查找仍將導(dǎo)致數(shù)據(jù)庫(kù)查詢被觸發(fā),這是不必要的。在[45910]中,不存在的站點(diǎn)數(shù)據(jù)將存儲(chǔ)為-1而不是false,以便后續(xù)的數(shù)據(jù)庫(kù)查找。





多站點(diǎn)玩的比較少,很大一部分原因就是很多主題和插件的不兼容多站點(diǎn)模式!
一般用多站點(diǎn)模式來(lái)做開(kāi)發(fā)和演示,偶爾也用來(lái)給客戶做多語(yǔ)言