_wp_theme_json_webfonts_handler
函式
_wp_theme_json_webfonts_handler ( No parameters )
- Access
- Private
- 定義位置
-
- wp-includes/script-loader.php , line 3187
- 相關方法
- _json_wp_die_handler_jsonp_wp_die_handlerwp_media_upload_handlerwp_embed_unregister_handlermedia_upload_form_handler
- 引入
- 6.0.0
- 棄用
- -
_wp_theme_json_webfonts_handler: 這個函式在WordPress的theme.json檔案中增加對網路字型的支援。它在after_setup_theme動作中被呼叫。
執行theme.json webfonts處理程式。
使用`WP_Theme_JSON_Resolver`,它獲得了`theme.json`中為當前選擇和風格變化所定義的字型,驗證了font-face屬性,生成了’@font-face’風格宣告,然後為編輯器和前端的風格排隊。
設計說明:
這不是一個公共API,而是一個內部處理程式。未來的公共Webfonts API將取代這個臨時性的程式碼。
這段程式碼的設計是故意的。
a. 它隱藏了內部工作。
b. 它沒有暴露API的內涵或外延,以供消費。
c. 它只對一個主題的`theme.json`起作用。
為什麼?
a. 為了避免在Core中引入Webfonts API時出現向後相容的問題。
b. 為了使`theme.json`中的`fontFace`宣告生效。
function _wp_theme_json_webfonts_handler() {
// Block themes are unavailable during installation.
if ( wp_installing() ) {
return;
}
// Webfonts to be processed.
$registered_webfonts = array();
/**
* Gets the webfonts from theme.json.
*
* @since 6.0.0
*
* @return array Array of defined webfonts.
*/
$fn_get_webfonts_from_theme_json = static function() {
// Get settings from theme.json.
$settings = WP_Theme_JSON_Resolver::get_merged_data()->get_settings();
// If in the editor, add webfonts defined in variations.
if ( is_admin() || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) {
$variations = WP_Theme_JSON_Resolver::get_style_variations();
foreach ( $variations as $variation ) {
// Skip if fontFamilies are not defined in the variation.
if ( empty( $variation['settings']['typography']['fontFamilies'] ) ) {
continue;
}
// Initialize the array structure.
if ( empty( $settings['typography'] ) ) {
$settings['typography'] = array();
}
if ( empty( $settings['typography']['fontFamilies'] ) ) {
$settings['typography']['fontFamilies'] = array();
}
if ( empty( $settings['typography']['fontFamilies']['theme'] ) ) {
$settings['typography']['fontFamilies']['theme'] = array();
}
// Combine variations with settings. Remove duplicates.
$settings['typography']['fontFamilies']['theme'] = array_merge( $settings['typography']['fontFamilies']['theme'], $variation['settings']['typography']['fontFamilies']['theme'] );
$settings['typography']['fontFamilies'] = array_unique( $settings['typography']['fontFamilies'] );
}
}
// Bail out early if there are no settings for webfonts.
if ( empty( $settings['typography']['fontFamilies'] ) ) {
return array();
}
$webfonts = array();
// Look for fontFamilies.
foreach ( $settings['typography']['fontFamilies'] as $font_families ) {
foreach ( $font_families as $font_family ) {
// Skip if fontFace is not defined.
if ( empty( $font_family['fontFace'] ) ) {
continue;
}
// Skip if fontFace is not an array of webfonts.
if ( ! is_array( $font_family['fontFace'] ) ) {
continue;
}
$webfonts = array_merge( $webfonts, $font_family['fontFace'] );
}
}
return $webfonts;
};
/**
* Transforms each 'src' into an URI by replacing 'file:./'
* placeholder from theme.json.
*
* The absolute path to the webfont file(s) cannot be defined in
* theme.json. `file:./` is the placeholder which is replaced by
* the theme's URL path to the theme's root.
*
* @since 6.0.0
*
* @param array $src Webfont file(s) `src`.
* @return array Webfont's `src` in URI.
*/
$fn_transform_src_into_uri = static function( array $src ) {
foreach ( $src as $key => $url ) {
// Tweak the URL to be relative to the theme root.
if ( ! str_starts_with( $url, 'file:./' ) ) {
continue;
}
$src[ $key ] = get_theme_file_uri( str_replace( 'file:./', '', $url ) );
}
return $src;
};
/**
* Converts the font-face properties (i.e. keys) into kebab-case.
*
* @since 6.0.0
*
* @param array $font_face Font face to convert.
* @return array Font faces with each property in kebab-case format.
*/
$fn_convert_keys_to_kebab_case = static function( array $font_face ) {
foreach ( $font_face as $property => $value ) {
$kebab_case = _wp_to_kebab_case( $property );
$font_face[ $kebab_case ] = $value;
if ( $kebab_case !== $property ) {
unset( $font_face[ $property ] );
}
}
return $font_face;
};
/**
* Validates a webfont.
*
* @since 6.0.0
*
* @param array $webfont The webfont arguments.
* @return array|false The validated webfont arguments, or false if the webfont is invalid.
*/
$fn_validate_webfont = static function( $webfont ) {
$webfont = wp_parse_args(
$webfont,
array(
'font-family' => '',
'font-style' => 'normal',
'font-weight' => '400',
'font-display' => 'fallback',
'src' => array(),
)
);
// Check the font-family.
if ( empty( $webfont['font-family'] ) || ! is_string( $webfont['font-family'] ) ) {
trigger_error( __( 'Webfont font family must be a non-empty string.' ) );
return false;
}
// Check that the `src` property is defined and a valid type.
if ( empty( $webfont['src'] ) || ( ! is_string( $webfont['src'] ) && ! is_array( $webfont['src'] ) ) ) {
trigger_error( __( 'Webfont src must be a non-empty string or an array of strings.' ) );
return false;
}
// Validate the `src` property.
foreach ( (array) $webfont['src'] as $src ) {
if ( ! is_string( $src ) || '' === trim( $src ) ) {
trigger_error( __( 'Each webfont src must be a non-empty string.' ) );
return false;
}
}
// Check the font-weight.
if ( ! is_string( $webfont['font-weight'] ) && ! is_int( $webfont['font-weight'] ) ) {
trigger_error( __( 'Webfont font weight must be a properly formatted string or integer.' ) );
return false;
}
// Check the font-display.
if ( ! in_array( $webfont['font-display'], array( 'auto', 'block', 'fallback', 'swap' ), true ) ) {
$webfont['font-display'] = 'fallback';
}
$valid_props = array(
'ascend-override',
'descend-override',
'font-display',
'font-family',
'font-stretch',
'font-style',
'font-weight',
'font-variant',
'font-feature-settings',
'font-variation-settings',
'line-gap-override',
'size-adjust',
'src',
'unicode-range',
);
foreach ( $webfont as $prop => $value ) {
if ( ! in_array( $prop, $valid_props, true ) ) {
unset( $webfont[ $prop ] );
}
}
return $webfont;
};
/**
* Registers webfonts declared in theme.json.
*
* @since 6.0.0
*
* @uses $registered_webfonts To access and update the registered webfonts registry (passed by reference).
* @uses $fn_get_webfonts_from_theme_json To run the function that gets the webfonts from theme.json.
* @uses $fn_convert_keys_to_kebab_case To run the function that converts keys into kebab-case.
* @uses $fn_validate_webfont To run the function that validates each font-face (webfont) from theme.json.
*/
$fn_register_webfonts = static function() use ( &$registered_webfonts, $fn_get_webfonts_from_theme_json, $fn_convert_keys_to_kebab_case, $fn_validate_webfont, $fn_transform_src_into_uri ) {
$registered_webfonts = array();
foreach ( $fn_get_webfonts_from_theme_json() as $webfont ) {
if ( ! is_array( $webfont ) ) {
continue;
}
$webfont = $fn_convert_keys_to_kebab_case( $webfont );
$webfont = $fn_validate_webfont( $webfont );
$webfont['src'] = $fn_transform_src_into_uri( (array) $webfont['src'] );
// Skip if not valid.
if ( empty( $webfont ) ) {
continue;
}
$registered_webfonts[] = $webfont;
}
};
/**
* Orders 'src' items to optimize for browser support.
*
* @since 6.0.0
*
* @param array $webfont Webfont to process.
* @return array Ordered `src` items.
*/
$fn_order_src = static function( array $webfont ) {
$src = array();
$src_ordered = array();
foreach ( $webfont['src'] as $url ) {
// Add data URIs first.
if ( str_starts_with( trim( $url ), 'data:' ) ) {
$src_ordered[] = array(
'url' => $url,
'format' => 'data',
);
continue;
}
$format = pathinfo( $url, PATHINFO_EXTENSION );
$src[ $format ] = $url;
}
// Add woff2.
if ( ! empty( $src['woff2'] ) ) {
$src_ordered[] = array(
'url' => sanitize_url( $src['woff2'] ),
'format' => 'woff2',
);
}
// Add woff.
if ( ! empty( $src['woff'] ) ) {
$src_ordered[] = array(
'url' => sanitize_url( $src['woff'] ),
'format' => 'woff',
);
}
// Add ttf.
if ( ! empty( $src['ttf'] ) ) {
$src_ordered[] = array(
'url' => sanitize_url( $src['ttf'] ),
'format' => 'truetype',
);
}
// Add eot.
if ( ! empty( $src['eot'] ) ) {
$src_ordered[] = array(
'url' => sanitize_url( $src['eot'] ),
'format' => 'embedded-opentype',
);
}
// Add otf.
if ( ! empty( $src['otf'] ) ) {
$src_ordered[] = array(
'url' => sanitize_url( $src['otf'] ),
'format' => 'opentype',
);
}
$webfont['src'] = $src_ordered;
return $webfont;
};
/**
* Compiles the 'src' into valid CSS.
*
* @since 6.0.0
*
* @param string $font_family Font family.
* @param array $value Value to process.
* @return string The CSS.
*/
$fn_compile_src = static function( $font_family, array $value ) {
$src = "local($font_family)";
foreach ( $value as $item ) {
if (
str_starts_with( $item['url'], site_url() ) ||
str_starts_with( $item['url'], home_url() )
) {
$item['url'] = wp_make_link_relative( $item['url'] );
}
$src .= ( 'data' === $item['format'] )
? ", url({$item['url']})"
: ", url('{$item['url']}') format('{$item['format']}')";
}
return $src;
};
/**
* Compiles the font variation settings.
*
* @since 6.0.0
*
* @param array $font_variation_settings Array of font variation settings.
* @return string The CSS.
*/
$fn_compile_variations = static function( array $font_variation_settings ) {
$variations = '';
foreach ( $font_variation_settings as $key => $value ) {
$variations .= "$key $value";
}
return $variations;
};
/**
* Builds the font-family's CSS.
*
* @since 6.0.0
*
* @uses $fn_compile_src To run the function that compiles the src.
* @uses $fn_compile_variations To run the function that compiles the variations.
*
* @param array $webfont Webfont to process.
* @return string This font-family's CSS.
*/
$fn_build_font_face_css = static function( array $webfont ) use ( $fn_compile_src, $fn_compile_variations ) {
$css = '';
// Wrap font-family in quotes if it contains spaces.
if (
str_contains( $webfont['font-family'], ' ' ) &&
! str_contains( $webfont['font-family'], '"' ) &&
! str_contains( $webfont['font-family'], "'" )
) {
$webfont['font-family'] = '"' . $webfont['font-family'] . '"';
}
foreach ( $webfont as $key => $value ) {
/*
* Skip "provider", since it's for internal API use,
* and not a valid CSS property.
*/
if ( 'provider' === $key ) {
continue;
}
// Compile the "src" parameter.
if ( 'src' === $key ) {
$value = $fn_compile_src( $webfont['font-family'], $value );
}
// If font-variation-settings is an array, convert it to a string.
if ( 'font-variation-settings' === $key && is_array( $value ) ) {
$value = $fn_compile_variations( $value );
}
if ( ! empty( $value ) ) {
$css .= "$key:$value;";
}
}
return $css;
};
/**
* Gets the '@font-face' CSS styles for locally-hosted font files.
*
* @since 6.0.0
*
* @uses $registered_webfonts To access and update the registered webfonts registry (passed by reference).
* @uses $fn_order_src To run the function that orders the src.
* @uses $fn_build_font_face_css To run the function that builds the font-face CSS.
*
* @return string The `@font-face` CSS.
*/
$fn_get_css = static function() use ( &$registered_webfonts, $fn_order_src, $fn_build_font_face_css ) {
$css = '';
foreach ( $registered_webfonts as $webfont ) {
// Order the webfont's `src` items to optimize for browser support.
$webfont = $fn_order_src( $webfont );
// Build the @font-face CSS for this webfont.
$css .= '@font-face{' . $fn_build_font_face_css( $webfont ) . '}';
}
return $css;
};
/**
* Generates and enqueues webfonts styles.
*
* @since 6.0.0
*
* @uses $fn_get_css To run the function that gets the CSS.
*/
$fn_generate_and_enqueue_styles = static function() use ( $fn_get_css ) {
// Generate the styles.
$styles = $fn_get_css();
// Bail out if there are no styles to enqueue.
if ( '' === $styles ) {
return;
}
// Enqueue the stylesheet.
wp_register_style( 'wp-webfonts', '' );
wp_enqueue_style( 'wp-webfonts' );
// Add the styles to the stylesheet.
wp_add_inline_style( 'wp-webfonts', $styles );
};
/**
* Generates and enqueues editor styles.
*
* @since 6.0.0
*
* @uses $fn_get_css To run the function that gets the CSS.
*/
$fn_generate_and_enqueue_editor_styles = static function() use ( $fn_get_css ) {
// Generate the styles.
$styles = $fn_get_css();
// Bail out if there are no styles to enqueue.
if ( '' === $styles ) {
return;
}
wp_add_inline_style( 'wp-block-library', $styles );
};
add_action( 'wp_loaded', $fn_register_webfonts );
add_action( 'wp_enqueue_scripts', $fn_generate_and_enqueue_styles );
add_action( 'admin_init', $fn_generate_and_enqueue_editor_styles );
}
常見問題
FAQs-
如何使用get_users獲取所有使用者列表?
要使用`
get_users`函式獲取所有使用者列表,可以按照以下步驟進行:1. 使用`
get_users`函式呼叫獲取使用者列表:$users = get_users();
2. 您可以按需使用引數來過濾結果。例如,您可以通過角色、使用者ID、使用者登入名等過濾使用者列表。以下是一個根據使用者角色為過濾條件的示例:
$users = get_users( array( 'role' => 'subscriber' // 將角色名稱替換為您要過濾的角色 ) );在上述示例中,將`
role`引數設定為所需的角色名稱來過濾使用者列表。3. 您可以使用迴圈遍歷獲取的使用者列表,並訪問每個使用者的屬性。例如,以下示例將顯示每個使用者的使用者名稱和電子郵件地址:
foreach( $users as $user ) { echo '使用者名稱:' . $user->user_login . ', 電子郵件:' . $user->user_email . ; }在上述示例中,通過`
$user->user_login`和`$user->user_email`訪問每個使用者的使用者名稱和電子郵件地址。請注意,`
get_users`函式預設返回所有使用者,並可以根據需要使用更多引數進行過濾。您可以參閱WordPress官方文件中的`get_users`函式文件,瞭解更多可用引數和用法示例。總結起來,使用`
get_users`函式獲取所有使用者列表的步驟是:- 呼叫`
get_users`函式獲取使用者列表。 - 使用可選的過濾引數,根據需要過濾使用者列表。
- 使用迴圈遍歷使用者列表,並訪問每個使用者的屬性。
- 呼叫`
-
如何使用WP_PLUGIN_DIR和WP_PLUGIN_URL定義外掛的目錄和URL?
在WordPress中,可以使用WP_PLUGIN_DIR和WP_PLUGIN_URL常量來定義外掛的目錄路徑和URL。
1. `WP_PLUGIN_DIR`:這是一個常量,用於定義外掛的目錄路徑(檔案系統路徑)。您可以使用以下程式碼在外掛檔案中訪問該常量:
$plugin_dir = WP_PLUGIN_DIR . '/your-plugin-folder/';
在上述程式碼中,將"your-plugin-folder"替換為您外掛的實際資料夾名稱。使用該常量,您可以獲取外掛檔案的完整路徑。
2. `WP_PLUGIN_URL`:這是一個常量,用於定義外掛的URL(用於在網頁上訪問外掛檔案)。以下是一個使用該常量的示例:
$plugin_url = WP_PLUGIN_URL . '/your-plugin-folder/';
同樣,請將"your-plugin-folder"替換為您外掛的實際資料夾名稱。使用該常量,您可以獲取外掛在網頁上的完整URL。
請注意,`WP_PLUGIN_DIR`和`WP_PLUGIN_URL`常量在WordPress版本2.6之後引入。從WordPress 5.5版本開始,這兩個常量被標記為過時(deprecated),因為WordPress更傾向於使用新的外掛檔案結構。如果您正在開發新外掛,建議使用新的外掛檔案結構和相關函式。
在新的外掛檔案結構中,可以使用以下函式來獲取外掛的目錄路徑和URL:
- `plugin_dir_path()`:獲取外掛目錄路徑。
- `plugin_dir_url()`:獲取外掛URL。這些函式會自動將外掛的版本、多站點和SSL等考慮因素納入計算。
總結起來,使用`WP_PLUGIN_DIR`和`WP_PLUGIN_URL`常量定義外掛的目錄和URL的方法是:
$plugin_dir = WP_PLUGIN_DIR . '/your-plugin-folder/'; $plugin_url = WP_PLUGIN_URL . '/your-plugin-folder/';
但請注意,這兩個常量已被標記為過時,建議使用新的外掛檔案結構和相關函式來獲取外掛的路徑和URL。
-
如何使用PHP在WordPress中新增自定義功能?
使用PHP在WordPress中新增自定義功能可以通過以下方式實現:
- 建立一個自定義外掛,將功能程式碼新增到外掛中。
- 使用WordPress的鉤子系統,將自定義功能繫結到適當的鉤子上。
- 在主題檔案中新增自定義功能程式碼,例如functions.php檔案。
- 使用WordPress的短程式碼功能,將自定義功能封裝為短程式碼。
- 使用WordPress的外掛或主題編輯器,將自定義功能程式碼新增到適當的位置。
下面是一個實操示例。
要在WordPress中新增自定義功能,可以按照以下步驟使用PHP編寫並新增自定義功能:
- 開啟WordPress安裝目錄中的主題資料夾,通常位於wp-content/themes/下,找到正在使用的主題資料夾。
- 在主題資料夾中,可以建立一個名為functions.php的檔案。如果該檔案已經存在,可以直接編輯它。
- 在functions.php檔案中,可以使用PHP程式碼新增自定義功能。以下是一些常見的示例:
// 新增自定義功能示例 // 1. 建立自定義短程式碼 function custom_shortcode() { return '這是我的自定義短程式碼內容'; } add_shortcode('custom', 'custom_shortcode'); // 2. 自定義小工具 function custom_widget() { echo '這是我的自定義小工具內容'; } register_widget('custom_widget'); // 3. 自定義選單 function custom_menu() { register_nav_menu('custom-menu', '自定義選單'); } add_action('after_setup_theme', 'custom_menu'); // 4. 自定義頁面模板 function custom_page_template() { /* Template Name: 自定義模板 */ // 自定義模板的內容和樣式 } - 編輯完functions.php檔案後,儲存並上傳到WordPress主題資料夾中。
請注意,修改主題檔案可以在主題更新時丟失,因此建議在進行任何更改之前備份functions.php檔案。此外,為避免不必要的錯誤和衝突,建議在新增自定義功能前先了解WordPress開發文件和最佳實踐,以確保正確、安全地實現所需的自定義功能。
-
如何進行WordPress資料庫查詢優化?
-
如何使用do_action來觸發一個鉤子函式?
使用
do_action函式可以觸發一個鉤子函式。do_action函式的引數與要觸發的鉤子函式的引數相同。例如,觸發save_post鉤子函式的程式碼如下:
do_action( 'save_post', $post_ID, $post );
這裡,
$post_ID和$post是傳遞給鉤子函式的引數。 -
如何使用wp_get_current_user獲取當前登入使用者的資訊?
使用
wp_get_current_user獲取當前登入使用者的資訊:$current_user = wp_get_current_user(); // 獲取當前使用者的ID $user_id = $current_user->ID; // 獲取當前使用者的使用者名稱 $user_login = $current_user->user_login; // 獲取當前使用者的郵箱 $user_email = $current_user->user_email; // 獲取當前使用者的顯示名稱 $display_name = $current_user->display_name;
