首页 WordPress WordPress主题 WordPress 5.3 增强“网络站点”功能

WordPress 5.3 增强“网络站点”功能

2019-10-21 129

对数据库的更改

WordPress 5.1 中站点元数据的引入为多站点开辟了许多新的可能性。

在多站点元数据中保存数据库版本和更新日期

[46193]中,数据库版本和更新日期都保存在blogmeta表中。

如果您的多站点设置要求从全局上下文访问数据库版本,而不是使用switch_to_blog调用在每个站点周围循环get_option( 'db_version' ),那您可以尝试以下函数。

  1. function get_site_versions() {  
  2.     global $wpdb;  
  3.     $query = $wpdb->prepare( “SELECT blog_id, meta_value FROM $wpdb->blogmeta WHERE meta_key = ‘db_version’ ORDER BY blog_id DESC”);  
  4.     return $wpdb->get_results( $query );  
  5. }  

删除blog_versions表

目前,多站点中有一个名为blog_versions的数据表。这个表将数据库版本存储为数字和更新日期。它是在#11644中引入的,但一直都没有在WP核心中使用过。

由于现在将数据库版本和更新日期都保存在blogmeta表中,所以blog_versions表就多余了。

对WP_MS_Sites_List_Table的更改

WordPress 5.3WP_MS_Sites_List_Table类中添加了一些增强功能,使插件作者可以利用站点元数据在“ 管理网络站点”界面上为多站点管理员提供更丰富的体验。

使用和/或自定义“所有文章”界面的人员将非常熟悉这些增强功能。

站点状态视图

现在,“网络站点”界面将显示一个链接列表,其中包含按状态(例如“公共”,“垃圾”等)的站点计数,类似于“所有文章”屏幕上的文章状态链接。

状态链接也可以使用views_sites-network过滤器进行过滤。

例如,假设有一个多站点,其中主站点充当本地餐馆的目录,而每个站点都是针对单个餐馆的,而餐馆所有者可以购买“订阅”,从而使他们可以显示有关其餐馆清单的更多信息:基本订阅将允许他们添加餐厅的照片,高级订阅将允许他们添加菜单。

然后可以将订阅级别存储在blogmeta表中,并可以为不同的订阅级别添加“状态”链接,如下所示:

  1. add_filter( ‘views_sites-network’, ‘myplugin_add_site_status_views’ );  
  2. function myplugin_add_site_status_views( $view_links ) {  
  3.     $statuses = array(  
  4.         ‘free’      => _n_noop(  
  5.             ‘Free <span class=“count”>(%s)</span>’,  
  6.             ‘Free <span class=“count”>(%s)</span>’,  
  7.             ‘myplugin’  
  8.         ),  
  9.         ‘basic’   => _n_noop(  
  10.             ‘Basic <span class=“count”>(%s)</span>’,  
  11.             ‘Basic <span class=“count”>(%s)</span>’,  
  12.             ‘myplugin’  
  13.         ),  
  14.         ‘advanced’   => _n_noop(  
  15.             ‘Advanced <span class=“count”>(%s)</span>’,  
  16.             ‘Advanced <span class=“count”>(%s)</span>’,  
  17.             ‘myplugin’  
  18.         ),  
  19.     );  
  20.    
  21.     // get the count of sites with each of our custom statuses.  
  22.     $args = array(  
  23.         ‘meta_query’ => array(  
  24.             array(  
  25.                 ‘key’     => ‘myplugin-status’,  
  26.                 ‘compare’ => ‘=’,  
  27.             ),  
  28.         ),  
  29.         ‘count‘ => true,  
  30.     );  
  31.     $counts = array();  
  32.     foreach ( array_keys$statuses ) as $status ) {  
  33.         $args[‘meta_query’][0][‘value’] = $status;  
  34.         $counts$status ] = get_sites( $args );  
  35.     }  
  36.    
  37.     $requested_status = isset( $_GET[‘status’] ) ? wp_unslash( trim( $_GET[‘status’] ) ) : ;  
  38.    
  39.     foreach ( $statuses as $status => $label_count ) {  
  40.         $current_link_attributes = $requested_status === $status ?  
  41.             ‘ class=“current” aria-current=“page”‘ :  
  42.             ;  
  43.         if ( (int) $counts$status ] > 0 ) {  
  44.             $label = sprintf( translate_nooped_plural( $label_count$counts$status ] ), number_format_i18n( $counts$status ] ) );  
  45.    
  46.             $view_links$status ] = sprintf(  
  47.                 ‘<a href=“%1$s”%2$s>%3$s</a>’,  
  48.                 esc_url( add_query_arg( ‘status’, $status, ‘sites.php’ ) ),  
  49.                 $current_link_attributes,  
  50.                 $label  
  51.             );  
  52.         }  
  53.     }  
  54.    
  55.     return $view_links;  
  56. }  

当用户单击一个自定义状态链接时,可以使用现有的ms_sites_list_table_query_args将列表中的行限制为具有该特定自定义状态的网站,如下所示:

  1. add_filter( ‘ms_sites_list_table_query_args’, ‘myplugin_sites_with_custom_status’ );  
  2. function myplugin_sites_with_custom_status( $args ) {  
  3.     $status = ! emptyempty$_GET[‘status’ ] ) ? wp_unslash( $_GET[‘status’ ] ) : ;  
  4.    
  5.     if ( emptyempty$status ) || ! in_array( $_GET[‘status’], array( ‘free’, ‘basic’, ‘advanced’ ) ) ) {  
  6.         return $args;  
  7.     }  
  8.    
  9.     $meta_query = array(  
  10.         ‘key’   => ‘myplugin-status’,  
  11.         ‘value’ => $status,  
  12.     );  
  13.    
  14.     if ( isset( $args[‘meta_query’] ) ) {  
  15.         // add our meta query to the existing one(s).  
  16.         $args[‘meta_query’] = array(  
  17.             ‘relation’ => ‘AND’,  
  18.             $meta_query,  
  19.             array$args[‘meta_query’] ),  
  20.         );  
  21.     }  
  22.     else {  
  23.         // add our meta query.  
  24.         $args[‘meta_query’] = array(  
  25.             $meta_query,  
  26.         );  
  27.     }  
  28.    
  29.     return $args;  
  30. }  

额外的表格导航

显示在“ 所有文章”界面上的文章可以按日期和分类进行过滤。插件还可以通过 restrict_manage_posts过滤器 添加自定义过滤条件。

继续上面的餐厅指南示例,假设每个餐厅提供的食物也存储在blogmeta表中。然后,我们可以允许网络管理员通过添加各种美食的下拉列表,根据食物的类型来过滤站点:

这样的下拉列表现在可以通过新的restrict_manage_sites动作钩子(在Trac#45954中引入)添加到“网络站点”界面上,如下所示:

  1. add_action( ‘restrict_manage_sites’, ‘myplugin_add_cuisines_dropdown’ );  
  2. function myplugin_add_cuisines_dropdown( $which ) {  
  3.     if ( ‘top’ !== $which ) {  
  4.         return;  
  5.     }  
  6.    
  7.     echo ‘<select name=“cuisine”>’;  
  8.     printf( ‘<option value=“”>%s</option>’, __( ‘All cuisines’, ‘myplugin’ ) );  
  9.    
  10.     $cuisines = array(  
  11.         ‘French’  => __( ‘French’, ‘myplugin’ ),  
  12.         ‘Indian’  => __( ‘Indian’, ‘myplugin’ ),  
  13.         ‘Mexican’ => __( ‘Mexican’, ‘myplugin’ ),  
  14.     );  
  15.        
  16.     $requested_cuisine = isset( $_GET[‘cuisine’] ) ? wp_unslash( $_GET[‘cuisine’] ) : ;  
  17.        
  18.     foreach ( $cuisines as $cuisine => $label ) {  
  19.         $selected = selected( $cuisine$requested_cuisine, false );  
  20.         printf( ‘<option%s>%s</option>’, $selected$label );  
  21.     }  
  22.    
  23.     echo ‘</select>’;  
  24.    
  25.     return;  
  26. }  

当用户选择一种食物类型并单击“ 过滤器”按钮时,列表中的行可以仅限于使用现有ms_sites_list_table_query_args过滤器提供该美食的站点, 如下所示:

  1. add_filter( ‘ms_sites_list_table_query_args’, ‘myplugin_sites_with_cuisine’ );  
  2. function myplugin_sites_with_cuisine( $args ) {  
  3.     if ( emptyempty$_GET[‘cuisine’ ] ) ) {  
  4.         return $args;  
  5.     }  
  6.    
  7.     $meta_query = array(  
  8.         ‘key’   => ‘myplugin-cuisine’,  
  9.         ‘value’ => wp_unslash( $_GET[‘cuisine’ ] ),  
  10.     );  
  11.    
  12.     if ( isset( $args[‘meta_query’] ) ) {  
  13.         // add our meta query to the existing one(s).  
  14.         $args[‘meta_query’] = array(  
  15.             ‘relation’ => ‘AND’,  
  16.             $meta_query,  
  17.             array$args[‘meta_query’] ),  
  18.         );  
  19.     }  
  20.     else {  
  21.         // add our meta query.  
  22.         $args[‘meta_query’] = array(  
  23.             $meta_query,  
  24.         );  
  25.     }  
  26.    
  27.     return $args;  
  28. }  

网站显示状态

与其他列表一样,“站点”列表中的每一行现在都有显示状态。默认情况下,每个网站的所有网站状态(“公共”除外)都作为显示状态包括在内。此外,网络的主站点也具有“主要”显示状态。

当用户选择了特定的站点状态视图时,该状态将不在显示状态中(就像“所有文章”屏幕一样)。

插件还可以使用display_site_states过滤器修改显示状态 。

为了进一步延续我们的餐厅指南示例,我们可以添加自定义状态以及每个餐厅提供的美食作为显示状态。这可以通过以下方式实现:

  1. add_filter( ‘ms_sites_list_table_query_args’, ‘myplugin_sites_with_cuisine’ );  
  2. function myplugin_sites_with_cuisine( $args ) {  
  3.     if ( emptyempty$_GET[‘cuisine’ ] ) ) {  
  4.         return $args;  
  5.     }  
  6.    
  7.     $meta_query = array(  
  8.         ‘key’   => ‘myplugin-cuisine’,  
  9.         ‘value’ => wp_unslash( $_GET[‘cuisine’ ] ),  
  10.     );  
  11.    
  12.     if ( isset( $args[‘meta_query’] ) ) {  
  13.         // add our meta query to the existing one(s).  
  14.         $args[‘meta_query’] = array(  
  15.             ‘relation’ => ‘AND’,  
  16.             $meta_query,  
  17.             array$args[‘meta_query’] ),  
  18.         );  
  19.     }  
  20.     else {  
  21.         // add our meta query.  
  22.         $args[‘meta_query’] = array(  
  23.             $meta_query,  
  24.         );  
  25.     }  
  26.    
  27.     return $args;  
  28. }  

其他变更

返回短路的多站点类

修复在 [44983]原始补丁,在多站点类中引入了预查询过滤器。此错误使短路行为与其他短路行为有所不同,并且仍在继续执行。现在,通过networks_pre_querysites_pre_query运行过滤后,该代码将立即退出。这使开发人员可以完全热线连接网络和站点查询,以从另一个来源(例如,不同的缓存或弹性搜索)进行加载。

通过ID改进了站点和网络查找的性能

在早期版本的WordPress中,当运行代码get_site( 12345 ) 时,如果没有该站点的ID,是不会缓存结果的。这意味着随后的所有查找仍将导致数据库查询被触发,这是不必要的。在[45910]中,不存在的站点数据将存储为-1而不是false,以便后续的数据库查找。

标题:WordPress 5.3 增强“网络站点”功能

分类:WordPress主题

链接:https://www.bigetheme.cn/1251.html

版权:逼格网