當(dāng)前位置:首頁(yè)>WordPress資訊>WordPress 5.3 增強(qiáng)“網(wǎng)絡(luò)站點(diǎn)”的功能

WordPress 5.3 增強(qiáng)“網(wǎng)絡(luò)站點(diǎn)”的功能

對(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.3WP_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_querysites_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ù)查找。

聲明:本站所有文章,如無(wú)特殊說(shuō)明或標(biāo)注,均為本站原創(chuàng)發(fā)布。任何個(gè)人或組織,在未征得本站同意時(shí),禁止復(fù)制、盜用、采集、發(fā)布本站內(nèi)容到任何網(wǎng)站、書(shū)籍等各類媒體平臺(tái)。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。

給TA打賞
共{{data.count}}人
人已打賞
歡迎關(guān)注WordPress大學(xué)公眾號(hào) WPDAXUE
WordPress資訊

WordPress 5.3 +將要求PHP安裝JSON擴(kuò)展

2019-10-16 9:37:49

WordPress資訊

WordPress主題插件相關(guān)漏洞匯總(2019年10月)

2019-10-30 9:52:26

2 條回復(fù) A文章作者 M管理員
  1. 縉哥哥

    多站點(diǎn)玩的比較少,很大一部分原因就是很多主題和插件的不兼容多站點(diǎn)模式!

    • 網(wǎng)站編輯

      一般用多站點(diǎn)模式來(lái)做開(kāi)發(fā)和演示,偶爾也用來(lái)給客戶做多語(yǔ)言

?
個(gè)人中心
購(gòu)物車
優(yōu)惠劵
今日簽到
有新私信 私信列表
搜索

商丘市| 荥经县| 开远市| 牙克石市| 西畴县| 长春市| 突泉县| 图木舒克市| 长宁区| 息烽县| 临高县| 南靖县| 阿荣旗| 临澧县| 扬中市| 武陟县| 和政县| 玉龙| 三门县| 汾西县| 和政县| 孟津县| 涪陵区| 揭阳市| 五原县| 沈阳市| 潢川县| 时尚| 渝北区| 阳高县| 山东省| 清镇市| 工布江达县| 宾川县| 怀安县| 岳普湖县| 盈江县| 宁都县| 大宁县| 甘泉县| 余干县|