WordPress Version: 6.2
/**
* Retrieves list of WordPress theme features (aka theme tags).
*
* @since 3.1.0
* @since 3.2.0 Added 'Gray' color and 'Featured Image Header', 'Featured Images',
* 'Full Width Template', and 'Post Formats' features.
* @since 3.5.0 Added 'Flexible Header' feature.
* @since 3.8.0 Renamed 'Width' filter to 'Layout'.
* @since 3.8.0 Renamed 'Fixed Width' and 'Flexible Width' options
* to 'Fixed Layout' and 'Fluid Layout'.
* @since 3.8.0 Added 'Accessibility Ready' feature and 'Responsive Layout' option.
* @since 3.9.0 Combined 'Layout' and 'Columns' filters.
* @since 4.6.0 Removed 'Colors' filter.
* @since 4.6.0 Added 'Grid Layout' option.
* Removed 'Fixed Layout', 'Fluid Layout', and 'Responsive Layout' options.
* @since 4.6.0 Added 'Custom Logo' and 'Footer Widgets' features.
* Removed 'Blavatar' feature.
* @since 4.6.0 Added 'Blog', 'E-Commerce', 'Education', 'Entertainment', 'Food & Drink',
* 'Holiday', 'News', 'Photography', and 'Portfolio' subjects.
* Removed 'Photoblogging' and 'Seasonal' subjects.
* @since 4.9.0 Reordered the filters from 'Layout', 'Features', 'Subject'
* to 'Subject', 'Features', 'Layout'.
* @since 4.9.0 Removed 'BuddyPress', 'Custom Menu', 'Flexible Header',
* 'Front Page Posting', 'Microformats', 'RTL Language Support',
* 'Threaded Comments', and 'Translation Ready' features.
* @since 5.5.0 Added 'Block Editor Patterns', 'Block Editor Styles',
* and 'Full Site Editing' features.
* @since 5.5.0 Added 'Wide Blocks' layout option.
* @since 5.8.1 Added 'Template Editing' feature.
* @since 6.1.1 Replaced 'Full Site Editing' feature name with 'Site Editor'.
* @since 6.2.0 Added 'Style Variations' feature.
*
* @param bool $api Optional. Whether try to fetch tags from the WordPress.org API. Defaults to true.
* @return array Array of features keyed by category with translations keyed by slug.
*/
function get_theme_feature_list($api = true)
{
// Hard-coded list is used if API is not accessible.
$features = array(__('Subject') => array('blog' => __('Blog'), 'e-commerce' => __('E-Commerce'), 'education' => __('Education'), 'entertainment' => __('Entertainment'), 'food-and-drink' => __('Food & Drink'), 'holiday' => __('Holiday'), 'news' => __('News'), 'photography' => __('Photography'), 'portfolio' => __('Portfolio')), __('Features') => array('accessibility-ready' => __('Accessibility Ready'), 'block-patterns' => __('Block Editor Patterns'), 'block-styles' => __('Block Editor Styles'), 'custom-background' => __('Custom Background'), 'custom-colors' => __('Custom Colors'), 'custom-header' => __('Custom Header'), 'custom-logo' => __('Custom Logo'), 'editor-style' => __('Editor Style'), 'featured-image-header' => __('Featured Image Header'), 'featured-images' => __('Featured Images'), 'footer-widgets' => __('Footer Widgets'), 'full-site-editing' => __('Site Editor'), 'full-width-template' => __('Full Width Template'), 'post-formats' => __('Post Formats'), 'sticky-post' => __('Sticky Post'), 'style-variations' => __('Style Variations'), 'template-editing' => __('Template Editing'), 'theme-options' => __('Theme Options')), __('Layout') => array('grid-layout' => __('Grid Layout'), 'one-column' => __('One Column'), 'two-columns' => __('Two Columns'), 'three-columns' => __('Three Columns'), 'four-columns' => __('Four Columns'), 'left-sidebar' => __('Left Sidebar'), 'right-sidebar' => __('Right Sidebar'), 'wide-blocks' => __('Wide Blocks')));
if (!$api || !current_user_can('install_themes')) {
return $features;
}
$feature_list = get_site_transient('wporg_theme_feature_list');
if (!$feature_list) {
set_site_transient('wporg_theme_feature_list', array(), 3 * HOUR_IN_SECONDS);
}
if (!$feature_list) {
$feature_list = themes_api('feature_list', array());
if (is_wp_error($feature_list)) {
return $features;
}
}
if (!$feature_list) {
return $features;
}
set_site_transient('wporg_theme_feature_list', $feature_list, 3 * HOUR_IN_SECONDS);
$category_translations = array('Layout' => __('Layout'), 'Features' => __('Features'), 'Subject' => __('Subject'));
$wporg_features = array();
// Loop over the wp.org canonical list and apply translations.
foreach ((array) $feature_list as $feature_category => $feature_items) {
if (isset($category_translations[$feature_category])) {
$feature_category = $category_translations[$feature_category];
}
$wporg_features[$feature_category] = array();
foreach ($feature_items as $feature) {
if (isset($features[$feature_category][$feature])) {
$wporg_features[$feature_category][$feature] = $features[$feature_category][$feature];
} else {
$wporg_features[$feature_category][$feature] = $feature;
}
}
}
return $wporg_features;
}