On June 17, 2010, WordPress Version 3.0, named for Thelonious, was released to the public. For more information on this enhancement and bug-fix release, read the WordPress Blog and see the Changelog for 3.0.
For Version 3.0, the database version (db_version in wp_options) changed to 15260, and the Trac revision was 15274.
Highlights
- WordPress and WordPress MU have merged – allowing the management of multiple sites (called Multisite) from one WordPress installation.
- New default theme “Twenty Ten” – takes full advantage of the current features of WordPress.
- New Custom Menu Management feature – allows creation of custom menus combining posts, pages, categories, tags, and links for use in theme menus or widgets.
- Custom Header and Custom Background APIs.
- Contextual help – help text accessed under the Help tab of every screen in the WordPress administration.
- Ability to set the admin username and password during installation.
- Bulk updating of themes – with an automatic maintenance mode during the process.
- Support for Shortlinks.
- Improved Custom Post Types and Custom Taxonomies – including hierarchical (category-style) support. (Try the Custom Post Type UI or GD Custom Posts And Taxonomies Tools plugins to see the possibilities.)
- A lighter admin color scheme – to increase accessibility and put the focus more squarely on your content.
User Features
General
- Check required php and mysql versions in the update and notify if the server environment does not meet those requirements
- New wp_login_form() provides a simple login form for use anywhere
- New WordPress logo for admin header
- Place “Search Engines Blocked” mini-alert in the wp-admin header to prevent people from accidentally delisting themselves
- Remove ‘Turbo’ link from admin header and remove Turbo section from the Tools->Tools panel
- Renamed various menu items, for example Posts->Edit becomes Posts->Posts, and Links->Edit becomes Links->Links, and so on
- Revised administration menu icons
- Revised Gray Admin Color Scheme
- Revised information in
readme.html
file - Show login form upon email-sent for recover/reset passwords
Dashboard
- Add link so user can visit Dashboard after core upgrade
- Move Tools->Upgrade menu option to Dashboard->Updates and overhaul of user interface so themes, plugins, and core upgrades under one panel
- New menu management (navigation) via Menus option under Appearances Menu (#11817)
- Password nag for newly registered users
- Split Right Now widget into Content | Discussion
Posts
- Allow for removing all tags in quick edit
- Allow themes to style the visual editor with editor-style.css file, using add_editor_style() function
- Enable custom taxonomy UI for pages as well as for posts
- Improved revision comparison user interface
- Shortlinks enabled, but still requires a plugin or theme support to fully realize this feature
- Added capital_P_dangit() filter to change ‘WordPress’ to ‘WordPress’.
Media
- Add FunnyOrDie.com oEmbed support
- Allow Deletion of Media Alt text
- Change Media UI labels from “Post Thumbnails” to “Featured Image”
- Cleanup of the edit media screen
- Don’t let “Crunching” overlap image name while uploading
- Optimize scan for lost attachments
- Support for additional file type extensions (Changesets 12581 and 13349)
Links
- Order link categories by name, not count, on Add New/Edit Link page
Comments
- Add additional columns to the Posts Comments view
- Allow configuration of number of comments to display Recent Comments dashboard module
- Block comments for future posts and password protected posts (when password not provided)
- Change to comments UI to show when a comment is replying to another, and link to the parent comment
Appearance
- Add meta_value_num and meta_key ordering for WP_Query to allow natural numeric ordering of results
- Add filter to get_avatar() to allow avatars for custom comment types
- Allow Tab indenting, Shift-Tab (outdenting), and multi-line tabbing, in theme editor
- Allow the Tag Cloud Widget to support non-tag taxonomies
- Allow theme background customization via new Background panel under Appearance menu
- New template file, front-page.php, for the front page of a site
- New template file, single-{post_type}.php, for Custom Post Types
- New template files, author-{nicename}.php, and author-{id}.php, for author specific templates
- New template files, taxonomy.php, taxonomy-{taxonomy}.php and taxonomy-{taxonomy}-{term}.php for Custom Taxonomies
- Style tweaks to theme editor
- Tab interface for Manage Themes and Install Themes in Appearance->Themes panel
- Improved child theme support; child theme use is highly encouraged and as described in the Child Themes article, very simple to accomplish
- New comment_form() that outputs a complete commenting form for use within a theme template
- The Default (Kubrick), and Classic themes, are no longer included in the WordPress distribution, but are available in the Theme repository
Plugins
- Add Details and Install Now action links under each plugin listed in Install Plugins
- Allow Tab indenting, Shift-Tab (outdenting), and multi-line tabbing, in plugin editor
- Upgrade plugins in bulk from the Plugins->Installed panel (#11542)
- When deleting plugins, check for uninstall hooks, and warn of data deletion
Tools
- Add tag-to-category and category-to-tag converters to the Tools panel, add tag-to-category converter links to Posts->Post Tagspanel
- Clean up OPML link export script
- Expanded filter criteria in Tools->Export panel
- Import WordPress fixes notices, attachments, and users
- Removed Turbo menu item, but because Turbo files weren’t removed, Turbo may still work
- All importers moved to the plugin repository (e.g. WordPress Importer)
Users
- Allow “No role for this blog” to be chosen in Users->Add New panel
- Added update_core, list_users, remove_users, add_users, promote_users, edit_theme_options, delete_themesand export Capabilities
Settings
- Removed Settings->Miscellaneous admin menu, moved uploads settings to Settings->Media panel
- Revise Settings->General panel, change “Blog” reference to “Site”
- Revise Gray Admin Color Scheme
Install Process
- Choose username and password during installation rather than using ‘admin’
- Show “Log In” button on install.php when “Already Installed”
- Automatic generation of Security Keys during installation
- Validate table_prefix in wp-config.php generator
- Standardize information in
wp-config-sample.php
Multisite
- New Tools->Network panel to ‘install’ mulitsite/network ability, and is available only if WP_ALLOW_MULTISITE is defined in wp-config.php
- New Super Admin menu with Admin, Sites, Users, Themes, Options, Update, sub-menus (available only if is_multisite() && is_super_admin() )
- New Dashboard->My Sites panel
- New Tools->Delete Site panel
- Configure a Network (multisite/WPMU) using wp-config.php file
- Terminology changes regarding Sites, Blogs, Networks (see Andrew Nacin’s explanation)
Development, Themes, Plugins
- A better default excerpt; remove multiple white spaces from the excerpt as well as splitting safely on UTF8 strings
- Add Child theme support for theme header registrations, second call to register_theme_headers() should add more headers, and not replace existing headers.
- Add add_plugins_page() function to allow adding a submenu to under Plugins menu
- Add get_search_link() with Permastruct (/search/) support, update get_search_link(), get_search_feed_link() and get_search_comments_feed_link()
- Add is_comment_feed()
- Add redirect_to and associated filters to registration and password recovery
- Add a wp_loaded action that fires once WordPress init has finished
- Add an INDEX on comment_parent (wp_comments table) to speed up wp_delete_comment() and reparenting queries
- Add argument hide_if_empty to wp_dropdown_categories() to hide dropdown if no terms to display
- Add argument id to wp_dropdown_users() and wp_dropdown_categories()
- Add argument post_type to get_page_by_title()
- Add argument taxonomies to register_post_type()
- Add argument taxonomy to wp_list_categories() and wp_dropdown_categories() to be custom taxonomy aware
- Add capability ‘edit_theme_options’ (see developer discussion on this)
- Add capability ‘list_users’ to provide more controls over listing users vs. editing users
- Add compatibility code for old themes that relied on templates from the default theme without expressly identifying it as the parent theme (Note: the fallback to these template files is now deprecated and will be removed in a future version)
- Add custom hierarchical post type support to get_pages()
- Add defaults for ‘post_content’ and ‘post_title’ in wp_insert_post()
- Add email and login duplicate checking to wp_insert_user()
- Add extra hooks to “Right Now” dashboard widget
- Add filter to the links in paginate_links() and to the arguments in wp_link_pages()
- Add filter post_updated_messages to allow changes to the $messages array in wp-admin/edit-form-advanced.php
- Add filter post_updated action fires when a post is updated; post ID, current and previous post objects are passed and wp_check_for_changed_slugs() updated to use new hook
- Add flag to taxonomy registration allowing permalinks to be prepended with front, or not
- Add initial WP_DEBUG define to wp-config-sample.php and suggest plugin/theme developers use it
- Add mobile webkit styles for twentyten theme
- Add more orderby and select options to get_comments
- Add Multisite capabilities (#11644)
- Add new protocols for kses and make the list of protocols filterable
- Add optional comment ID argument to comment template functions
- Add replace method to $wpdb (#10864)
- Add support to get_terms() to allow ‘include’ & ‘exclude’ args to be arrays()
- Add support to is_singular() to allow testing of specific post_types such as is_singular(‘book’) or is_singular( array( ‘newspaper’, ‘book’ ) )
- Add the generator element in feeds through the {rss2|atom|rdf|rss|opml}_head hooks
- Add ‘themes_loaded’ hook to run after parent/child themes have been included
- Add ?ver=DATE query strings to all images that changed since 2.9, to expire browser cache and bump versions on all CSS/JS files modified in that process
- Admin support for Custom Post Types (#9674)
- Admin support for hierarchical taxonomies (#10122)
- Allow Custom Post Types to have custom icons
- Allow enabling/disabling title and editor per post type, introduce remove_post_type_support(), add enable/disable for author override
- Allow include/exclude arguments for get_posts() and get_pages() to be an array
- Allow methods to be used as a callback in wp_unique_filename()
- Allow more special characters in wp_generate_password()
- Allow multiple To: recipients in wp_mail() and improve handling of \r\n in headers and multiple CC/BCC headers
- Allow people to attach PHP 5.3 Closures to filters and actions
- Allow plugins to modify the query run by WP_User_Search
- Allow themes to specify a menu fallback other than wp_page_menu()
- Better inline documentation for WP_DEBUG, WP_DEBUG_DISPLAY, and WP_DEBUG_LOG.
- Better POST_BY_EMAIL logic
- Check PHP and MySQL versions in upgrade.php
- Convert Terms page to use WP_Ajax_Response(), hierarchical terms will now appear under their parent OR have the parents prefixed (Changeset 13086)
- Create metaboxes for hierarchical taxonomies
- Create post_status=auto-draft when creating a new post item and status changes to draft on first auto-save
- Customizable death (wp_die() is now pluggable) (#11892)
- Deprecate get_alloptions()
- Deprecate get_profile() for get_the_author_meta()
- Deprecate trackback_rdf() (#11139)
- Deprecate add_option_update_handler() and remove_option_update_handler() in favor of register_setting() and unregister_setting()
- Deprecate automatic_feed_links() in favor of add_theme_support(‘automatic-feed-links’)
- Deprecate get_bloginfo(‘text_direction’) in favor of is_rtl()
- Deprecate set_current_user() in favor of wp_set_current_user()
- Deprecate MagpieRSS in favor of Simplepie (#11982)
- Deprecate Snoopy
- Deprecate User Levels (use Roles and Capabilities instead) (#10805)
- Deprecate clean_url() in favor of esc_url() and esc_url_raw() (#12309)
- Deprecate VHOST in favor of a boolean, SUBDOMAIN_INSTALL (Note: core will keep VHOST defined for plugins’ sake, but you should only define SUBDOMAIN_INSTALL; will throw notice if VHOST is defined, and a warning if they somehow conflict; sunrise can still handle them
- Deprecate is_term and is_taxonomy in favor of term_exists and taxonomy_exists
- Don’t check for the existence of index.php in the htaccess rewrite rules
- Don’t query against entire users table in wp_dropdown_users()
- Don’t require a default category for post types other than ‘post’
- Ensure that for multiple sidebar additions, the ID is unique
- Extend the_modified_date() to support before/after/echo
- Fallback to wp_page_menu() from wp_nav_menu() if no menus are setup
- Fix Press This entity encoding
- Fix DST/Standard transition display in Settings->General
- Fix recursive chmod for WP_Filesystem
- Flag post statuses as public, private, protected, or internal
- Functon get_usernumposts() is now deprecated in favor of count_user_posts() for naming consistency
- Improve user listing performance
- In Twenty Ten theme, don’t use post thumbnail as the custom header if it’s smaller than the header size
- Introduce *_user_meta() functions, deprecate *_usermeta() family
- Introduce _ex(), a hybrid between _e() and _x(), to translate with context, then echo.
- Introduce add_editor_style() to easily register a stylesheet for the visual editor
- Introduce add_permastruct() and flush_rewrite_rules(), wrappers for the corresponding WP_Rewrite methods
- Introduce disabled() form helper, move selected() and checked() out of wp-admin and into full scope
- Introduce delete_user_option()
- Introduce get_available_languages()
- Introduce get_comment_id_fields() to get comment_id_fields() and introduce a filter on the output to add extra fields
- Introduce get_index_template() to allow child themes to override a parent theme’s index.php
- Introduce get_intermediate_image_sizes() for getting all the intermediate image sizes to be used both when adding attachements and deleting
- Introduce get_post_types() function to get a list of registered post types
- Introduce get_super_admins() and allow hard-coding a global super_admins array and bypassing site options
- Introduce get_taxonomies() function to get a list of all registered taxonomies (#12516)
- Introduce get_template_part() function to include generic files (other than header, sidebar, footer) (#13146, #13816)
- Introduce get_term_feed_link() and use it in wp_list_categories()
- Introduce get_the_author_link()
- Introduce get_the_date()
- Introduce home_url()
- Introduce is_child_theme()
- Introduce is_post_type_hierarchical() to use to check if a post type support hierarchical
- Introduce is_rtl() and becomes defined when locale is loaded
- Introduce is_super_admin()
- Introduce is_textdomain_loaded()
- Introduce menu_page_url() for plugins to use to get the URL for the pages they have added
- Introduce register_admin_color_schemes() to registers the default admin color schemes
- Introduce remove_theme_support()
- Introduce post_type_exists()
- Introduce sanitize_key()
- Introduce set_current_screen(). Set current screen for inline edit ajax requests so post rows can be properly displayed.
- Introduce taxonomy_exists() to replace is_taxonomy()
- Introduce term_exists() to replace is_term()
- Introduce the_shortlink() template tag (#10640)
- Introduce unload_textdomain() and add plugin_locale and theme_locale filters to load_*_textdomain() functions
- Introduce unregister_theme_headers()
- Introduce update_blog_details()
- Introduce wp_check_filetype_and_ext() to handle mime/ext image comparisons and corrections for upload and sideload
- Introduce wp_reset_postdata() to reset the post global for the current query_posts() call after using a loop with a new WP_Query object
- Introduce constant DISALLOW_FILE_MODS for disabling all ops that modify core, theme, or plugins files
- Introduce constant DISALLOW_FILE_EDIT flag for enabling/disabling the theme and plugin editors
- Introduce constant DISALLOW_UNFILTERED_HTML to disallow unfiltered_html for all users, even admins and super admins
- Introduce constant SUBDOMAIN_INSTALL boolean to replace VHOST
- Introduce constant WP_DEFAULT_THEME to use to set ‘default’ theme when installing new sites
- Introduce Custom Taxonomies translation strings
- Introduce theme compatibility files so incomplete themes that need to inherit templates will inherit them from wp-includes/theme-compat
- Introduce WP_User::for_blog() and current_user_can_for_blog() to avoid calls to WP_User::_init_caps()
- Introduce wpdb::tables() to fetch table names on a global or blog scope
- Introduce ZipArchive version of unzip_file() (more efficient on memory usage for supporting hosts)
- Make get_bloginfo(‘wpurl’) use site_url(), not get_option(‘siteurl’)
- Make better use of $wp_query->get_queried_object()
- Make calendar valid HTML 5
- Merge clear_global_post_cache() into clean_post_cache()
- Merge Categories/Hierarchical taxonomies into edit-tags.php
- Merge edit-page-form.php into edit-form-advanced.php
- Merge edit-pages.php into edit.php
- Merge page.php into post.php
- Merge page-new.php into post-new.php
- More powerful version of is_tax()
- Move send_nosniff_header() into wp-includes so it can be used in wp-ajax.php
- New $required_mysql_version global in wp-db.php
- New comment_form() that outputs a complete commenting form for use within a template (#10910)
- New posts_search filter in query.php
- Numerous functions deprecated and changes to not use those deprecated functions
- Optimize single_post_title(), single_tag_title() & single_cat_title() to use WP_Query globals if available
- Pass default post to default_content, default_title, and default_excerpt filters, to allow filtering by post_type and other attributes
- Prevent page(\d+) slugs, and force a suffix
- Recommended reading from a theme developer’s view regarding navigation menus; see Ryan Boren’s recommendation
- Redirect ?page_id=xx for the Po sts page to the posts page
- Refactor get_available_languages() to use glob() instead of *dir functions
- Reminder that escaping rules for options and transients changed so see Ryan Boren’s explanation
- Reminder to plugin authors to test and make sure they do not generate unexpected output; see Ryan Boren’s explanation
- Remove STYLE_DEBUG constant, SCRIPT_DEBUG now handles both scripts and CSS
- Remove wp-ajax.php. admin-ajax.php can be used (and is better for) for front-end/nopriv AJAX requests
- Rename get_post_link() to get_post_permalink() to avoid conflict with bbPress
- Rename the new ‘themes_loaded’ hook to ‘after_setup_theme’ to prevent confusion as to what it actually does & where its fired from
- Revised Coding Standards: no camelcase variables, use lowercase for variables
- Serve a real 404 for ?p=does-not-exist, ?cat=does-not-exist, etc
- Show custom hierarchical taxonomies in the menus
- Show theme installer only to super admins
- Suffix and version bump for ie.css
- The Settings API now supports automatic error display for validation problems with add_settings_error() (#11474)
- Tidy up logic for defining WP_DEBUG
- Update wp_popular_terms_checklist() to handle custom taxonomies
- Update jQuery to 1.4.2 (#12305)
- Update jQuery UI to 1.7.3
- Update json lib
- Update phpass to 0.2
- Update Prototype.js to 1.6.1
- Update Scriptaculous.js to 1.8.3
- Update SWFobject JS to 2.2
- Update wp_clear_scheduled_hook calls to use array when passing args
- Use admin_url() for images in wp-admin, to allow for filtering
- Use get_terms() in wp_count_terms()
- Various phpDoc updates
- Various changes to wp-includes/http.php
Features Deferred to Later Versions
These features didn’t make it into current release and have been designated for a future release.
- Overhaul of user roles
- Media uploader improvements