add_theme_support()
云策文档标注
概述
add_theme_support() 函数用于在 WordPress 主题中注册对特定功能的支持,例如标题标签、自定义徽标、文章缩略图等。它必须在主题的 functions.php 文件中调用,或通过 'after_setup_theme' 钩子附加,以确保正确初始化。
关键要点
- 必须在 functions.php 或 'after_setup_theme' 钩子中调用,'init' 钩子可能对某些功能太晚。
- 支持多种核心功能,如 'title-tag'、'custom-logo'、'post-thumbnails'、'html5' 等,每个功能可能有可选参数。
- 对于子主题,add_theme_support('post-formats') 会覆盖父主题的格式,而不是添加。
- 某些功能如 'post-thumbnails' 和 'html5' 需要传递数组参数,否则可能触发警告或错误。
- 使用 get_theme_support() 检查功能支持状态,避免使用只读参数如 'sidebars' 或 'menus'。
- 从 WordPress 5.9 开始,块主题默认启用某些功能,如 'post-thumbnails' 和 'responsive-embeds'。
代码示例
// 基本用法示例
add_theme_support( 'title-tag' );
add_theme_support( 'custom-logo', array(
'height' => 480,
'width' => 720,
) );
add_theme_support( 'post-formats', array( 'aside', 'gallery' ) );
add_theme_support( 'post-thumbnails', array( 'post', 'movie' ) );
add_theme_support( 'html5', array( 'comment-list', 'comment-form', 'search-form' ) );注意事项
- 对于 'custom-background' 的 'default-color' 参数,主题需要通过 CSS 实现背景颜色,函数本身不直接设置。
- add_theme_support() 不能以数组形式传递多个功能,必须分别调用每个功能。
- 在 WordPress 5.3 及以上版本,add_theme_support('html5', ['script', 'style']) 可以移除脚本和样式标签中的 type 属性。
- 使用 remove_theme_support() 可以禁用特定功能,例如 'widgets-block-editor'。
原文内容
Registers theme support for a given feature.
Description
Must be called in the theme’s functions.php file to work.
If attached to a hook, it must be ‘after_setup_theme’.
The ‘init’ hook may be too late for some features.
Example usage:
add_theme_support( 'title-tag' );
add_theme_support( 'custom-logo', array(
'height' => 480,
'width' => 720,
) );
Parameters
$featurestringrequired-
The feature being added. Likely core values include:
'admin-bar''align-wide''appearance-tools''automatic-feed-links''block-templates''block-template-parts''border''core-block-patterns''custom-background''custom-header''custom-line-height''custom-logo''customize-selective-refresh-widgets''custom-spacing''custom-units''dark-editor-style''disable-custom-colors''disable-custom-font-sizes''disable-custom-gradients''disable-layout-styles''editor-color-palette''editor-gradient-presets''editor-font-sizes''editor-spacing-sizes''editor-styles''featured-content''html5''link-color''menus''post-formats''post-thumbnails''responsive-embeds''starter-content''title-tag''widgets''widgets-block-editor''wp-block-styles'
$argsmixedoptional-
Optional extra arguments to pass along with certain features.
Source
function add_theme_support( $feature, ...$args ) {
global $_wp_theme_features;
if ( ! $args ) {
$args = true;
}
switch ( $feature ) {
case 'post-thumbnails':
// All post types are already supported.
if ( true === get_theme_support( 'post-thumbnails' ) ) {
return;
}
/*
* Merge post types with any that already declared their support
* for post thumbnails.
*/
if ( isset( $args[0] ) && is_array( $args[0] ) && isset( $_wp_theme_features['post-thumbnails'] ) ) {
$args[0] = array_unique( array_merge( $_wp_theme_features['post-thumbnails'][0], $args[0] ) );
}
break;
case 'post-formats':
if ( isset( $args[0] ) && is_array( $args[0] ) ) {
$post_formats = get_post_format_slugs();
unset( $post_formats['standard'] );
$args[0] = array_intersect( $args[0], array_keys( $post_formats ) );
} else {
_doing_it_wrong(
"add_theme_support( 'post-formats' )",
__( 'You need to pass an array of post formats.' ),
'5.6.0'
);
return false;
}
break;
case 'html5':
// You can't just pass 'html5', you need to pass an array of types.
if ( empty( $args[0] ) || ! is_array( $args[0] ) ) {
_doing_it_wrong(
"add_theme_support( 'html5' )",
__( 'You need to pass an array of types.' ),
'3.6.1'
);
if ( ! empty( $args[0] ) && ! is_array( $args[0] ) ) {
return false;
}
// Build an array of types for back-compat.
$args = array( 0 => array( 'comment-list', 'comment-form', 'search-form' ) );
}
// Calling 'html5' again merges, rather than overwrites.
if ( isset( $_wp_theme_features['html5'] ) ) {
$args[0] = array_merge( $_wp_theme_features['html5'][0], $args[0] );
}
break;
case 'custom-logo':
if ( true === $args ) {
$args = array( 0 => array() );
}
$defaults = array(
'width' => null,
'height' => null,
'flex-width' => false,
'flex-height' => false,
'header-text' => '',
'unlink-homepage-logo' => false,
);
$args[0] = wp_parse_args( array_intersect_key( $args[0], $defaults ), $defaults );
// Allow full flexibility if no size is specified.
if ( is_null( $args[0]['width'] ) && is_null( $args[0]['height'] ) ) {
$args[0]['flex-width'] = true;
$args[0]['flex-height'] = true;
}
break;
case 'custom-header-uploads':
return add_theme_support( 'custom-header', array( 'uploads' => true ) );
case 'custom-header':
if ( true === $args ) {
$args = array( 0 => array() );
}
$defaults = array(
'default-image' => '',
'random-default' => false,
'width' => 0,
'height' => 0,
'flex-height' => false,
'flex-width' => false,
'default-text-color' => '',
'header-text' => true,
'uploads' => true,
'wp-head-callback' => '',
'admin-head-callback' => '',
'admin-preview-callback' => '',
'video' => false,
'video-active-callback' => 'is_front_page',
);
$jit = isset( $args[0]['__jit'] );
unset( $args[0]['__jit'] );
/*
* Merge in data from previous add_theme_support() calls.
* The first value registered wins. (A child theme is set up first.)
*/
if ( isset( $_wp_theme_features['custom-header'] ) ) {
$args[0] = wp_parse_args( $_wp_theme_features['custom-header'][0], $args[0] );
}
/*
* Load in the defaults at the end, as we need to insure first one wins.
* This will cause all constants to be defined, as each arg will then be set to the default.
*/
if ( $jit ) {
$args[0] = wp_parse_args( $args[0], $defaults );
}
/*
* If a constant was defined, use that value. Otherwise, define the constant to ensure
* the constant is always accurate (and is not defined later, overriding our value).
* As stated above, the first value wins.
* Once we get to wp_loaded (just-in-time), define any constants we haven't already.
* Constants should be avoided. Don't reference them. This is just for backward compatibility.
*/
if ( defined( 'NO_HEADER_TEXT' ) ) {
$args[0]['header-text'] = ! NO_HEADER_TEXT;
} elseif ( isset( $args[0]['header-text'] ) ) {
define( 'NO_HEADER_TEXT', empty( $args[0]['header-text'] ) );
}
if ( defined( 'HEADER_IMAGE_WIDTH' ) ) {
$args[0]['width'] = (int) HEADER_IMAGE_WIDTH;
} elseif ( isset( $args[0]['width'] ) ) {
define( 'HEADER_IMAGE_WIDTH', (int) $args[0]['width'] );
}
if ( defined( 'HEADER_IMAGE_HEIGHT' ) ) {
$args[0]['height'] = (int) HEADER_IMAGE_HEIGHT;
} elseif ( isset( $args[0]['height'] ) ) {
define( 'HEADER_IMAGE_HEIGHT', (int) $args[0]['height'] );
}
if ( defined( 'HEADER_TEXTCOLOR' ) ) {
$args[0]['default-text-color'] = HEADER_TEXTCOLOR;
} elseif ( isset( $args[0]['default-text-color'] ) ) {
define( 'HEADER_TEXTCOLOR', $args[0]['default-text-color'] );
}
if ( defined( 'HEADER_IMAGE' ) ) {
$args[0]['default-image'] = HEADER_IMAGE;
} elseif ( isset( $args[0]['default-image'] ) ) {
define( 'HEADER_IMAGE', $args[0]['default-image'] );
}
if ( $jit && ! empty( $args[0]['default-image'] ) ) {
$args[0]['random-default'] = false;
}
/*
* If headers are supported, and we still don't have a defined width or height,
* we have implicit flex sizes.
*/
if ( $jit ) {
if ( empty( $args[0]['width'] ) && empty( $args[0]['flex-width'] ) ) {
$args[0]['flex-width'] = true;
}
if ( empty( $args[0]['height'] ) && empty( $args[0]['flex-height'] ) ) {
$args[0]['flex-height'] = true;
}
}
break;
case 'custom-background':
if ( true === $args ) {
$args = array( 0 => array() );
}
$defaults = array(
'default-image' => '',
'default-preset' => 'default',
'default-position-x' => 'left',
'default-position-y' => 'top',
'default-size' => 'auto',
'default-repeat' => 'repeat',
'default-attachment' => 'scroll',
'default-color' => '',
'wp-head-callback' => '_custom_background_cb',
'admin-head-callback' => '',
'admin-preview-callback' => '',
);
$jit = isset( $args[0]['__jit'] );
unset( $args[0]['__jit'] );
// Merge in data from previous add_theme_support() calls. The first value registered wins.
if ( isset( $_wp_theme_features['custom-background'] ) ) {
$args[0] = wp_parse_args( $_wp_theme_features['custom-background'][0], $args[0] );
}
if ( $jit ) {
$args[0] = wp_parse_args( $args[0], $defaults );
}
if ( defined( 'BACKGROUND_COLOR' ) ) {
$args[0]['default-color'] = BACKGROUND_COLOR;
} elseif ( isset( $args[0]['default-color'] ) || $jit ) {
define( 'BACKGROUND_COLOR', $args[0]['default-color'] );
}
if ( defined( 'BACKGROUND_IMAGE' ) ) {
$args[0]['default-image'] = BACKGROUND_IMAGE;
} elseif ( isset( $args[0]['default-image'] ) || $jit ) {
define( 'BACKGROUND_IMAGE', $args[0]['default-image'] );
}
break;
// Ensure that 'title-tag' is accessible in the admin.
case 'title-tag':
// Can be called in functions.php but must happen before wp_loaded, i.e. not in header.php.
if ( did_action( 'wp_loaded' ) ) {
_doing_it_wrong(
"add_theme_support( 'title-tag' )",
sprintf(
/* translators: 1: title-tag, 2: wp_loaded */
__( 'Theme support for %1$s should be registered before the %2$s hook.' ),
'<code>title-tag</code>',
'<code>wp_loaded</code>'
),
'4.1.0'
);
return false;
}
}
$_wp_theme_features[ $feature ] = $args;
}
Changelog
| Version | Description |
|---|---|
| 6.6.0 | The editor-spacing-sizes feature was added. |
| 6.5.0 | The appearance-tools feature enables a few design tools for blocks, see WP_Theme_JSON::APPEARANCE_TOOLS_OPT_INS for a complete list. |
| 6.3.0 | The border feature allows themes without theme.json to add border styles to blocks. |
| 6.1.0 | The disable-layout-styles feature disables the default layout styles. |
| 6.0.0 | The html5 feature warns if no array is passed as the second parameter. |
| 5.8.0 | The block-templates feature indicates whether a theme uses block-based templates. |
| 5.6.0 | The post-formats feature warns if no array is passed as the second parameter. |
| 5.5.0 | The custom-logo feature now also accepts 'unlink-homepage-logo'. |
| 5.4.0 | The disable-custom-gradients feature limits to default gradients or gradients added through editor-gradient-presets theme support. |
| 5.3.0 | Formalized the existing and already documented ...$args parameter by adding it to the function signature. |
| 5.0.0 | The responsive-embeds, align-wide, dark-editor-style, disable-custom-colors, disable-custom-font-sizes, editor-color-palette, editor-font-sizes, editor-styles, and wp-block-styles features were added. |
| 4.7.0 | The starter-content feature was added. |
| 4.5.0 | The customize-selective-refresh-widgets feature was added. |
| 4.1.0 | The title-tag feature was added. |
| 3.9.0 | The html5 feature now also accepts 'gallery' and 'caption'. |
| 3.6.1 | The html5 feature requires an array of types to be passed. Defaults to 'comment-list', 'comment-form', 'search-form' for backward compatibility. |
| 3.6.0 | The html5 feature was added. |
| 3.4.0 | The custom-header-uploads feature was deprecated. |
| 2.9.0 | Introduced. |
Skip to note 15 content
Binsaifullah
/** * Essential theme supports * */ function theme_setup(){ /** automatic feed link*/ add_theme_support( 'automatic-feed-links' ); /** tag-title **/ add_theme_support( 'title-tag' ); /** post formats */ $post_formats = array('aside','image','gallery','video','audio','link','quote','status'); add_theme_support( 'post-formats', $post_formats); /** post thumbnail **/ add_theme_support( 'post-thumbnails' ); /** HTML5 support **/ add_theme_support( 'html5', array( 'comment-list', 'comment-form', 'search-form', 'gallery', 'caption' ) ); /** refresh widgest **/ add_theme_support( 'customize-selective-refresh-widgets' ); /** custom background **/ $bg_defaults = array( 'default-image' => '', 'default-preset' => 'default', 'default-size' => 'cover', 'default-repeat' => 'no-repeat', 'default-attachment' => 'scroll', ); add_theme_support( 'custom-background', $bg_defaults ); /** custom header **/ $header_defaults = array( 'default-image' => '', 'width' => 300, 'height' => 60, 'flex-height' => true, 'flex-width' => true, 'default-text-color' => '', 'header-text' => true, 'uploads' => true, ); add_theme_support( 'custom-header', $header_defaults ); /** custom log **/ add_theme_support( 'custom-logo', array( 'height' => 60, 'width' => 400, 'flex-height' => true, 'flex-width' => true, 'header-text' => array( 'site-title', 'site-description' ), ) ); } add_action('after_setup_theme','theme_setup');Skip to note 16 content
Joy
Feedback:
There needs to be a section for starter content.
This page has good explanation https://make.wordpress.org/core/2016/11/30/starter-content-for-themes-in-4-7/
and this function shows all the default values: https://developer.wordpress.org/reference/functions/get_theme_starter_content/
Skip to note 17 content
Birgit Pauli-Haack
Enabling theme support for align full and align wide option for the block editor, use
add_theme_support( 'align-wide' );Skip to note 18 content
Marcio Duarte
The following features are enabled by default in block themes from version 5.9 onwards:
post-thumbnailsresponsive-embedseditor-styleshtml5automatic-feed-linksSee #35593 | (source)
Skip to note 19 content
Matt Radford
From WP 5.3,
add_theme_support('html5', ['script', 'style']);removestype="text/javascript"and type=”text/css” from enqueued scripts and styles.See https://make.wordpress.org/core/2019/10/15/miscellaneous-developer-focused-changes-in-5-3/ – HTML5 Supports Argument for Script and Style Tags
Skip to note 20 content
Cameron Jones
To determine if the theme support exists (and retrieve it’s arguments), use
get_theme_support( $feature )https://developer.wordpress.org/reference/functions/get_theme_support/
Skip to note 21 content
puggan
The Changelog missing the row:
“The html5 feature now also accepts ‘script and ‘style’.”
Don’t know what version it was added in, but its there in 5.3.1 atleast.
Exemple of use:
https://github.com/WordPress/WordPress/blob/48692b65241fcbadcd686c3f66696e16883a0e83/wp-includes/theme.php#L708
https://github.com/WordPress/WordPress/blob/48692b65241fcbadcd686c3f66696e16883a0e83/wp-includes/theme.php#L3233
Commit:
https://github.com/WordPress/WordPress/commit/252628652e7706cabb3913f4aa57218fa5012e4b
Skip to note 22 content
Will Skora
Note that you have to individually call each of these; including multiple ones as an array
<br />
add_theme_support( array( 'editor-styles', 'align-wide' ) )<br />
Instead, you must call them individually:
add_theme_support( 'editor-styles' ); add_theme_support( 'align-wide' );Skip to note 23 content
Marcio Zebedeu
Declare support for navigation widgets markup.
add_theme_support( 'html5', array( 'navigation-widgets' ) );“Theme developers are highly encouraged to utilize this improvement in their themes. This new theme support feature is an easy way to improve semantics and accessibility in all of the sites using your theme.”
Skip to note 24 content
benoitadam
“default-color” for custom background doesn’t work
Solution is to define your own stylesheet class and add the CSS class to the
bodytag.default-colorargument doesn’t actually set the background color: the theme has to implement the default color using CSS.Skip to note 25 content
Farrukh Hassan
Declare support for Block Styles.
add_theme_support( 'wp-block-styles' );These will enable the support for default Gutenberg block styles in the theme.
Skip to note 26 content
birgandi
deactivate new block editor Widget and active old editor Widget
remove_theme_support( 'widgets-block-editor' );Skip to note 27 content
Lovro Hrust
If you enable
'responsive-embeds', these are responsive classes you can use (.wp-embed-aspect-21-9) etc. on embedded block (like e.g. youtube):.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper::before { padding-top: 42.85%; } .wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper::before { padding-top: 50%; } .wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper::before { padding-top: 56.25%; } .wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper::before { padding-top: 75%; } .wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper::before { padding-top: 100%; } .wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper::before { padding-top: 177.77%; } .wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper::before { padding-top: 200%; }Skip to note 28 content
justinmahar
Starter Content #
Defines and registers starter content to showcase themes on new sites.
add_theme_support( 'starter-content', array( // Place widgets in the desired locations (such as sidebar or footer). // Example widgets: archives, calendar, categories, meta, recent-comments, recent-posts, // search, text_business_info, text_about 'widgets' => array( 'sidebar-1' => array( 'search', 'categories', 'meta'), ), // Specify pages to create, and optionally add custom thumbnails to them. // Note: For thumbnails, use attachment symbolic references in {{double-curly-braces}}. // Post options: post_type, post_title, post_excerpt, post_name (slug), post_content, // menu_order, comment_status, thumbnail (featured image ID), and template 'posts' => array( 'home', 'about', 'blog' => array( 'thumbnail' => '{{image-cafe}}' ), ), // Create custom image attachments used as post thumbnails for pages. // Note: You can reference these attachment IDs in the posts section above. Example: {{image-cafe}} 'attachments' => array( 'image-cafe' => array( 'post_title' => 'Cafe', 'file' => 'assets/images/cafe.jpg' ), ), // Assign options defaults, such as front page settings. // The 'show_on_front' value can be 'page' to show a specified page, or 'posts' to show your latest posts. // Note: Use page ID symbolic references from the posts section above wrapped in {{double-curly-braces}}. 'options' => array( 'show_on_front' => 'page', 'page_on_front' => '{{home}}', 'page_for_posts' => '{{blog}}', ), // Set the theme mods. 'theme_mods' => array( 'panel_1' => '{{about}}' ), // Set up nav menus. 'nav_menus' => array( 'top' => array( 'name' => 'Top Menu', 'items' => array( 'link_home', 'page_about', 'page_blog' )), ), ) );For full examples of each option, you can reference the Twenty Seventeen theme’s
functions.php:https://github.com/xwp/wordpress-develop/blob/master/src/wp-content/themes/twentyseventeen/functions.php#L117