<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>op111.net » planet-wp-en</title>
	
	<link>http://op111.net</link>
	<description>Everything about anything.  Or, a website about technology, the web and web publishing.</description>
	<lastBuildDate>Fri, 23 Jul 2010 11:25:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/op111net_planet-wp-en" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="op111net_planet-wp-en" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>WordPress 3.0: What’s new</title>
		<link>http://op111.net/76</link>
		<comments>http://op111.net/76#comments</comments>
		<pubDate>Mon, 07 Jun 2010 15:13:53 +0000</pubDate>
		<dc:creator>demetris</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[ellak]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[features]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[lang-en]]></category>
		<category><![CDATA[merge]]></category>
		<category><![CDATA[new]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[planet-wp-en]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[wp3.0]]></category>
		<category><![CDATA[wpmu]]></category>

		<guid isPermaLink="false">http://op111.net/?p=76</guid>
		<description><![CDATA[A detailed illustrated look into the new features WordPress 3.0 brings for end-users and for developers. <a href="http://op111.net/76" title="View post WordPress 3.0: What’s new" rel="bookmark">More...</a>]]></description>
			<content:encoded><![CDATA[<!--nm: WordPress 3.0: What’s new-->

<!--sl: wp-30-new-features-->

<!--id: 76-->

<!--

    CHECKED UP TO: r15264

*   v3.0 START: r12456
*   v2.9 START: r11552
*   v2.8 START: r10188

--->

<!--INTRO............................................................................................................-->

<p>UPDATE.  WordPress 3.0 was released today, Thursday 17 June 2010.  <a href="http://wordpress.org/download/" title="Download WordPress 3.0 from the official WordPress site [wordpress.org]">Get it here</a> or upgrade automatically!</p>

<p>The first release candidate of WordPress 3.0 came out on 28 May 2010.  The second followed a week after that, and the final release is expected sometime after 14 June 2010.</p>

<p>WordPress 3.0 is a large release.  The codebase underwent more changes than in any previous version (about 2700 sets of changes at this moment), and more people than ever before (above 200) contributed changes directly.  However, for the most part the changes are not immediately obvious. <span id="more-76"></span></p>

<p>Much of what changed is under the surface:  A lot of rewriting for the merge with WordPres MU, good features for developers, things to make WP a better tool internally, and many bug fixes.  Then, there are several new user features, but some of them are not visible either unless you select to use them or unless your theme explicitly supports them.</p>

<p>COMPATIBILITY NOTE</p>

<p>Backwards compatibility is good.  If op111.net is any indication, of <a href="http://op111.net/about/plugins-used" title="List of WordPress plugins used in op111.net [op111.net]">the 25 plugins it uses</a> 24 have been working flawlessly with WordPress 3.0.  One (HeadSpace2) caused a small issue recently, because of a JavaScript conflict.</p>

<p>See also “Known Issues”, right below.</p>

<h2>Known issues</h2>

<ul>
<li>Upgrading to 3.0 may need more than 32MB of memory (because the package is larger now).
If you cannot upgrade because of insufficient memory, try adding in your <em>wp-config.php</em> this:
<code>define('WP_MEMORY_LIMIT', '256M');</code> </li>
<li>Plugins that replace the WordPress database class, and probably also plugins that extend it, need to be updated.
This is because of substantial changes that were required for the merge with WordPress MU.</li>
<li>Conversion from single-site to multi-site can become problematic if <em>subdirectories</em>—rather than subdomains—are used.</li>
<li>See also the <a href="http://wordpress.org/support/topic/411649" title="WordPress 3.0 Issues, Problems, Resolutions thread at the WordPress forum [wordpress.org]">Issues, Problems and Resolutions</a> thread at the official WordPress forum.</li>
</ul>

<h2>Highlights</h2>

<h3>WordPress MU merge</h3>

<p><a href="http://mu.wordpress.org/" title="WordPress MU › Blog Tool and Publishing Platform [mu.wordpress.org]">WordPress MU</a> is a variation of WordPress designed for running multiple sites and weblogs on a single installation.  As an application it is not as widely known as WordPress, but there are probably more people using it daily to publish on the web than there are using WordPress.  Its users include educational institutions, research centres and publishing companies all over the world, and also services like WordPress.com (which must be the largest user of WordPress MU and for which MU was initially developed).</p>

<p>WordPress 3.0 brings together WordPress and WordPress MU. All MU functionality was merged into WordPress, and MU will now be discontinued. Its current version, 2.9.2, will be the last.</p>

<p>The merge and transition were designed to be invisible to users:  Users of WordPress MU 2.9.2 will simply see a notice to update to WordPress 3.0,  while users of single-site WordPress won’t see anything related to multi-site functionality unless they define a specific constant in <em>wp-config.php</em>.</p>

<p><a href="http://op111.net/wp-content/uploads/2010/06/wp30-ms-network-r15050.png" rel="lightbox[76]" title="WordPress 3.0: Setting up a multi-site network"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-ms-network-r15050-192x144.png" alt="WordPress 3.0: Setting up a multi-site network" title="WordPress 3.0: Setting up a multi-site network" width="192" height="144" /></a>
<a href="http://op111.net/wp-content/uploads/2010/06/wp30-ms-themes-r15050.png" rel="lightbox[76]" title="WordPress 3.0: The super admin sets the available themes"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-ms-themes-r15050-192x144.png" alt="WordPress 3.0: The super admin sets the available themes" title="WordPress 3.0: The super admin sets the available themes" width="192" height="144" /></a></p>

<h4>Terminology changes</h4>

<p>One difference users of single-site WordPress <em>will</em> notice is in terminology.  All instances of “blog” in the administration interface were replaced with “site”, to standardize terminology between single-site and multi-site.</p>

<p>The new meanings, which I hope I’m getting right, are as follows:</p>

<ul>
<li><em>example.com</em> in a single-site installation is now a <strong>site</strong> (which can of course be a blog).</li>
<li><em>example.com</em> in a multi-site installation is a <strong>network</strong> of sites and also the main site of the network (and can of course be a blog).</li>
<li><em>demetris.example.com</em> or <em>example.com/demetris</em> in a multi-site installation is one of the sites that make up the network.</li>
</ul>

<h4>Trying WordPress MS</h4>

<p>If you want to try the multi-site mode, there are two things you should know:</p>

<ul>
<li>Setting up multi-site is not as easy as the rest of WordPress.</li>
<li>You should keep copies of <em>wp-config.php</em> and <em>.htaccess</em>, in case you change your mind later and want to return to the single-site mode.</li>
</ul>

<p>Setting up WordPress for multi-site use will probably become easier in the future.  In this release, however, the aim was different:  To merge the two code bases as well as possible, and to make the transition seamless—even invisible—for all, both WordPress users and WordPress MU users.  This aim was achieved.</p>

<p>DOCUMENTATION.
<a href="http://codex.wordpress.org/Create_A_Network" title="Documentation on setting up a multi-site WordPress at the WordPress Codex [codex.wordpress.org]">codex.wordpress.org/Create_a_Network</a></p>

<h3>Update centre</h3>

<p>The new update centre displays in one place everything for which there is an update, and lets you update everything—WordPress itself, plugins, and themes—from the same place.  It also lets you update themes in bulk, which was not possible before.  Notifications of available updates appear in a little bubble next to the menu item from which the updater is accessed:  <em>Dashboard&nbsp;›&nbsp;Updates</em>.</p>

<p><a href="http://op111.net/wp-content/uploads/2010/06/wp30-updater-1-r15050.png" rel="lightbox[76]" title="WordPress 3.0: Update Centre, selecting updates"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-updater-1-r15050-192x192.png" alt="WordPress 3.0: Update Centre, selecting updates" title="WordPress 3.0: Update Centre, selecting updates" width="192" height="192" /></a>
<a href="http://op111.net/wp-content/uploads/2010/06/wp30-updater-2-r15050.png" rel="lightbox[76]" title="WordPress 3.0: Update Centre, done!"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-updater-2-r15050-192x144.png" alt="WordPress 3.0: Update Centre, done!" title="WordPress 3.0: Update Centre, done!" width="192" height="144" /></a>
<a href="http://op111.net/wp-content/uploads/2010/06/wp30-updater-3-r15050.png" rel="lightbox[76]" title="WordPress 3.0: Plugins, bulk updating"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-updater-3-r15050-192x144.png" alt="WordPress 3.0: Plugins, bulk updating" title="WordPress 3.0: Plugins, bulk updating" width="192" height="144" /></a></p>

<p>The update centre is my favourite new user feature in WordPress 3.0.  It makes maintenance easier and it helps keep your website up to date and secure, all from a simple interface that does not betray the complexity of the underlying mechanism.  (A bulk updater that works well across all the different environments and setups in which WordPress runs is not a simple matter!)</p>

<h3>Custom post types improved and simplified</h3>

<p>Custom post types were already possible in WordPress but the functionality was basic.  In WordPress 3.0 they come with many improvements and they can have their own <abbr title="User Interface">UI</abbr> too!</p>

<p>What are <em>custom post types</em>?  Think of the WordPress Posts and Pages that you already know.  They are both post types, same in many ways and different in some—mainly in that Pages are arranged hierarchically, while Posts are arranged chronologically—and they exist by default in WordPress.  A custom post type is a post type that does not exist by default and that <em>you</em> create.</p>

<p>And why make a custom post type?</p>

<p>Say, for example, that you enjoy publishing recipes but it always nagged you that in WordPress your recipes had to be either Posts or Pages.  Now you can create your own post type, “Recipes”, to write about your recipes, and you can add to it exactly the set of features you want:  It can have its own <abbr title="User Interface">UI</abbr>, e.g. “Edit Recipe” instead of “Edit Post”, and “Add New Recipe” instead of “Add New Post”, it can have or not have features like Excerpts, Featured Images, Comments, etc., and it can also be associated with custom taxonomies.</p>

<h4>Custom taxonomies</h4>

<p>Like custom post types, custom taxonomies already existed but they are now improved.  One of the improvements is that they can be combined with custom post types.  So, continuing the above example, if you don’t like using Tags for your Recipes, you can make a new flat taxonomy, say “Ingredients”, and associate it with the post type “Recipes”.</p>

<p>Not excited by all that?  Don’t worry!  You probably don’t need so much custom.  Not everyone does.  In fact, I would say that most WordPress sites can be organized perfectly well with what we already had:  Posts, Pages, Categories and Tags.</p>

<p>Yet, custom post types and taxonomies open up new possibilities, and it would be interesting to see what applications entertaining minds find for them, especially as the functionality is refined and improved in the future.</p>

<p>FURTHER READING</p>

<ul>
<li><a href="http://ottopress.com/2010/wordpress-3-0-and-custom-post-types/" title="WordPress 3.0 and Custom Post Types, by Otto [ottopress.com]">WordPress 3.0 and Custom Post Types</a> is a level-headed explanation and assessment by Otto.</li>
</ul>

<p>PLUGINS FOR CUSTOM POST TYPES AND TAXONOMIES</p>

<ul>
<li><a href="http://wordpress.org/extend/plugins/custom-post-type-ui/" title="Custom Post Type UI plugin at WordPress Extend [wordpress.org]">Custom Post Type <abbr title="User Interface">UI</abbr></a>
makes it easy to create new post types and taxonomies.</li>
<li><a href="http://wordpress.org/extend/plugins/post-type-switcher/" title="Post Type Switcer plugin at WordPress Extend [wordpress.org]">Post Type Switcher</a>
lets you switch posts from one type to another.</li>
</ul>

<h3>New theme</h3>

<p>WordPress 3.0 has a new default theme named Twenty Ten (after the year in which it is introduced).</p>

<p>Twenty Ten is a simple theme with a clean and modern design and a number of interesting features, my favourite among which is the array of four widget areas above the footer.  In addition, and as is always the case with the default WordPress theme, it implements all the new features of this release;  most notably, custom background and header (see below) and custom menus (see below).</p>

<p><a href="http://op111.net/wp-content/uploads/2010/06/wp30-twentyten-headers-r15071.png" rel="lightbox[76]" title="WordPress 3.0: Twenty Ten theme, Headers"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-twentyten-headers-r15071-192x192.png" alt="WordPress 3.0: Twenty Ten theme, Headers" title="WordPress 3.0: Twenty Ten theme, Headers" width="192" height="192" /></a>
<a href="http://op111.net/wp-content/uploads/2010/06/wp30-twentyten-2010dev-r15071.png" rel="lightbox[76]" title="WordPress 3.0: Twenty Ten theme"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-twentyten-2010dev-r15071-192x144.png" alt="WordPress 3.0: Twenty Ten theme" title="WordPress 3.0: Twenty Ten theme" width="192" height="144" /></a></p>

<p>One thing I particularly like in Twenty Ten is the collection of header images it comes with.</p>

<p>One thing I do not like is its typography, which I find noisy.  (Too many combinations—unnecessarily many for such a clean design—of font family, font size, font style, font weight, and font colour).  That is easily fixed, however, even with a very basic child theme:  Unlike the previous default theme, Kubrick, Twenty Ten supports child themes well.</p>

<p>MORE.  <a href="http://ma.tt/2010/06/headers-of-twenty-ten/" title="The headers of Twenty Ten [ma.tt]">The story of the Twenty Ten header images</a> by Matt Mullenweg</p>

<p>Twenty Ten is the only theme bundled with WordPress 3.0, since both Classic and Default (Kubrick) were removed.  Both are now at WordPress Extend:</p>

<ul>
<li><a href="http://wordpress.org/extend/themes/classic" title="Classic theme at WordPress Extend [wordpress.org]">Classic</a></li>
<li><a href="http://wordpress.org/extend/themes/default" title="Default (Kubrick) theme at WordPress Extend [wordpress.org]">Default (Kubrick)</a></li>
</ul>

<p>NOTE.  When upgrading to 3.0 from an earlier version, Classic and Default are not removed or affected in any way!</p>

<h3>Custom menus</h3>

<p>The most anticipated of the many “custom” things in this release is probably the new menu creator.  It lets you create navigation menus exactly how you want them, and then assign them to predefined menu locations of your theme.</p>

<p><a href="http://op111.net/wp-content/uploads/2010/06/wp30-nav-menus-r15072.png" rel="lightbox[76]" title="WordPress 3.0: Menu creator"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-nav-menus-r15072-192x144.png" alt="WordPress 3.0: Menu creator" title="WordPress 3.0: Menu creator" width="192" height="144" /></a>
<a href="http://op111.net/wp-content/uploads/2010/06/wp30-nav-menus-result-r15072.png" rel="lightbox[76]" title="WordPress 3.0: Menu creator in action"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-nav-menus-result-r15072-192x144.png" alt="WordPress 3.0: Menu creator in action" title="WordPress 3.0: Menu creator in action" width="192" height="144" /></a></p>

<p>One thing to note about the custom menus is that they must be supported explicitly by your theme.  But you can use them even if your theme does not support them yet:  The new Custom Menu widget lets you add any of you custom menus to any of your theme’s sidebars.</p>

<p>Another thing to note is that the custom menus are not always a viable alternative to the methods by which menus were built up to now.  Why?  Because they are not dynamic.  For example, you cannot make an item whose subitems are all existing and future categories;  or add a page to the menu and specify that all its current and future subpages be added as subitems.</p>

<p>I imagine theme authors will find ways to deal with that, probably by offering a choice between the two menu systems.</p>

<p>ACCESSIBILITY NOTE. The menu creator is fully functional without JavaScript too.</p>

<p><abbr title="For developers">DEV</abbr></p>

<ul>
<li><a href="http://codex.wordpress.org/Function_Reference/wp_nav_menu" title="[codex.wordpress.org]">Documenation on wp_nav_menu() at the WordPress Codex</a></li>
<li><a href="http://justintadlock.com/archives/2010/06/01/goodbye-headaches-hello-menus" title="[justintadlock.com]">Goodbye, headaches. Hello, menus!</a> By Justin Tadlock</li>
</ul>

<h3>Custom header and custom background</h3>

<p>Two new APIs were introduced that make it easy for theme authors to offer options for custom header images and custom backgrounds.  If your theme supports this, you will see the menu items under <em>Appearance</em>.  We already saw the Custom Header screen in one of the Twenty Ten screenshots.  Here is the Custom Background screen:</p>

<p><a href="http://op111.net/wp-content/uploads/2010/06/wp30-custom-bg-r15152.png" rel="lightbox[76]" title="WordPress 3.0: Custom Background screen"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-custom-bg-r15152-192x144.png" alt="WordPress 3.0: Custom Background screen" title="WordPress 3.0: Custom Background screen" width="192" height="144" class="alignnone size-medium wp-image-843" /></a></p>

<p><em>The tiled image in the screenshot is from
<a href="http://patterns.ava7.com/" title="ava7 patterns /// Free seamless background patterns [patterns.ava7.com]">ava7 patterns</a>.</em></p>

<p><abbr title="For developers">DEV</abbr>.  Twenty Ten’s <a href="http://core.trac.wordpress.org/browser/trunk/wp-content/themes/twentyten/functions.php" title="[core.trac.wordpress.org]"><em>functions.php</em></a> is a good starting point to see how all this works.</p>

<h2>More new things</h2>

<h3>Selectable username and password during installation</h3>

<p><a href="http://op111.net/wp-content/uploads/2010/06/wp30-install-r15067.png" rel="lightbox[76]" title="WordPress 3.0: Selectable username and password in installation"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-install-r15067-192x144.png" alt="WordPress 3.0: Selectable username and password in installation" title="WordPress 3.0: Selectable username and password in installation" width="192" height="144" /></a></p>

<p>Now the installation process lets you choose username and password for the administrator account.  That is, you no longer have to use “admin” or the password generated by WordPress.  (Of course, you can still use these if you prefer.)</p>

<p>TIP.  In earlier versions the admin account can be renamed with a plugin like <a href="http://wordpress.org/extend/plugins/admin-renamer-extended/" title="Admin Renamer Extended at WordPress Extend [wordpress.org]">Admin Renamer Extended</a>.</p>

<h3>Shortlinks</h3>

<p>WordPress 3.0 comes with a new function that themes can use to display a shortlink for the current URL.  By default, shortlinks are generated for Posts only (not for Pages or for anything else) and are of the form <em>http://example.com/?p=123</em>.  So, for example, the default shortlink for the page you are viewing is:</p>

<p><a href="http://op111.net/?p=76">http://op111.net/?p=76</a></p>

<p><em>op111.net uses the shortest possible permalink structure—/%post_id%—, so in this case the default shortlink happens to be longer than the long link,&nbsp;:-D but you get the idea.</em></p>

<p>Plugins can easily change the default form to anything they like.</p>

<p><abbr title="For developers">DEV</abbr>.  Shortlink functions and their filters are all in <a href="http://core.trac.wordpress.org/browser/trunk/wp-includes/link-template.php" title="[core.trac.wordpress.org]">link-template.php</a>.  Look at the inline documentation of:</p>

<ul>
<li>the_shortlink()</li>
<li>wp_get_shortlink()</li>
<li>wp_shortlink_header()</li>
<li>wp_shortlink_wp_head()</li>
</ul>

<h3>Better security by default</h3>

<p>WordPress 2.6 introduced security keys, which help add a bit more security to an installation.  WordPress&nbsp;3.0 adds security keys by default when setting up the configuration file of a new installation:</p>

<p><a href="http://op111.net/wp-content/uploads/2010/06/wp30-config-setup-step-1-r15144.png" rel="lightbox[76]" title="WordPress 3.0: Setting up wp-config.php, Step 1"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-config-setup-step-1-r15144-192x144.png" alt="WordPress 3.0: Setting up wp-config.php, Step 1" title="WordPress 3.0: Setting up wp-config.php, Step 1" width="192" height="144" /></a>
<a href="http://op111.net/wp-content/uploads/2010/06/wp30-config-setup-step-2-r15144.png" rel="lightbox[76]" title="WordPress 3.0: Setting up wp-config.php, Step 2, keys and salts"><img src="http://op111.net/wp-content/uploads/2010/06/wp30-config-setup-step-2-r15144-192x144.png" alt="WordPress 3.0: Setting up wp-config.php, Step 2, keys and salts" title="WordPress 3.0: Setting up wp-config.php, Step 2, keys and salts" width="192" height="144" /></a></p>

<p>You can change these keys at any time, or add them if you don’t have them, by making new ones yourself or by visiting the Secret Keys Generator at WordPress.org:</p>

<p><a href="https://api.wordpress.org/secret-key/1.1/salt/">https://api.wordpress.org/secret-key/1.1/salt/</a></p>

<p>(Just copy the whole lot and paste it in your <em>config.php</em>.)</p>

<h2>Even more</h2>

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/12523">r12523</a>.
    Check PHP, MySQL versions in update response and notify if reqs are not met.
    See <a href="http://core.trac.wordpress.org/ticket/11562">#11562</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12815">r12815</a>.
    Make login form shake when incorrect info is entered.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13012">r13012</a>.
    Twenty Ten theme initial import.
    See <a href="http://core.trac.wordpress.org/ticket/9015">#9015</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13026">r13026</a>.
    Update keys and salts with random values from api.wordpress.org.
    See <a href="http://core.trac.wordpress.org/ticket/12159">#12159</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13034">r13034</a>.
    Introduce DISALLOW_FILE_EDIT for enabling/disabling theme/plugin editor.
    See <a href="http://core.trac.wordpress.org/ticket/11306">#11306</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13041">r13041</a>.
<a href="http://core.trac.wordpress.org/changeset/13574">r13574</a>.
    Custom background support. Background color selection.
    See <a href="http://core.trac.wordpress.org/ticket/12186">#12186</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13084">r13084</a>.
    Add setting for no. of comments to Recent Comments dashboard widget.
    See <a href="http://core.trac.wordpress.org/ticket/11891">#11891</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13134">r13134</a>.
    Selectable username/password in installation.
    See <a href="http://core.trac.wordpress.org/ticket/10396">#10396</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13168">r13168</a>.
<a href="http://core.trac.wordpress.org/changeset/13767">r13767</a>.
<a href="http://core.trac.wordpress.org/changeset/14237">r14237</a>.
    “Search Engines Blocked” mini-alert when Privacy is on.
    See <a href="http://core.trac.wordpress.org/ticket/12211">#12211</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13233">r13233</a>.
    Show must-use plugins and drop-ins in Plugins screen.
    See <a href="http://core.trac.wordpress.org/ticket/11861">#11861</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13257">r13257</a>.
<a href="http://core.trac.wordpress.org/changeset/14248">r14248</a>.
    Introduce custom menus. New menu <abbr title="User Interface">UI</abbr>.
    See <a href="http://core.trac.wordpress.org/ticket/11817">#11817</a>.
    See <a href="http://core.trac.wordpress.org/ticket/12713">#12713</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13272">r13272</a>.
    Enable threaded comments by default.
    See <a href="http://core.trac.wordpress.org/ticket/11992">#11992</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13276">r13276</a>.
    Add support for non-tag taxonomies to Tag Cloud widget.
    See <a href="http://core.trac.wordpress.org/ticket/11612">#11612</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13403">r13403</a>.
    Header image selector.
    See <a href="http://core.trac.wordpress.org/ticket/12343">#12343</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13424">r13424</a>. <!--BUGFIX-->
    Reject numeric page slugs (they don’t work) and force suffix.
    See <a href="http://core.trac.wordpress.org/ticket/11917">#11917</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13470">r13470</a>.
    When deleting plugins, check for uninstall routines and warn of data deletion.
    See <a href="http://core.trac.wordpress.org/ticket/11850">#11850</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13516">r13516</a>.
    Better <em>readme.html</em>.
    See <a href="http://core.trac.wordpress.org/ticket/10835">#10835</a>.
    See it while it’s fresh:  <a href="http://op111.net/readme.html">http://op111.net/readme.html</a></li>
<li><a href="http://core.trac.wordpress.org/changeset/13529">r13529</a>.
    Move Upload folder settings to <em>Settings › Media</em>.
    See <a href="http://core.trac.wordpress.org/ticket/11687">#11687</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13541">r13541</a>.
    Display MIME type when file has no extension.
    See <a href="http://core.trac.wordpress.org/changeset/9924">#9924</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13573">r13573</a>.
    Add options to <em>Tools › Export</em>.
    See <a href="http://core.trac.wordpress.org/changeset/10317">#10317</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13587">r13587</a>.
<a href="http://core.trac.wordpress.org/changeset/13634">r13634</a>.
    Show Network menu only if WP_ALLOW_MULTISITE is true.
    See <a href="http://core.trac.wordpress.org/ticket/11644">#11644</a>.
    See <a href="http://core.trac.wordpress.org/ticket/11816">#11816</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13588">r13588</a>.
    Move <em>Tools › Upgrade</em> to <em>Dashboard › Updates</em>.
    See <a href="http://core.trac.wordpress.org/ticket/12517">#12517</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13602">r13602</a>.
<a href="http://core.trac.wordpress.org/changeset/13686">r13686</a>.
    New <abbr title="User Interface">UI</abbr> for bulk plugin/theme upgrades.
    See <a href="http://core.trac.wordpress.org/ticket/11232">#11232</a>.
    See <a href="http://core.trac.wordpress.org/ticket/12528">#12528</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13636">r13636</a>.
    Don’t paginate comments by default in <em>Settings › Discussion</em>.
    See <a href="http://core.trac.wordpress.org/ticket/12562">#12562</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13744">r13744</a>.
    Remove defunct link update checker from core.
    See <a href="http://core.trac.wordpress.org/ticket/12437">#12437</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13745">r13745</a>.
    Remove empty <em>Options › Misc</em>.
    Redirect plugin options to <em>Options › General</em>.
    See <a href="http://core.trac.wordpress.org/ticket/12437">#12437</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13750">r13750</a>.
    Change “Blog” to “Site” in Settings screens. (And in any other place in later revisions.)</li>
<li><a href="http://core.trac.wordpress.org/changeset/13824">r13824</a>.
<a href="http://core.trac.wordpress.org/changeset/13842">r13842</a>.
<a href="http://core.trac.wordpress.org/changeset/15127">r15127</a>.
    Lighter header/footer for gray color scheme.
    New logo for header.<br />
    See <a href="http://core.trac.wordpress.org/ticket/12586">#12586</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13833">r13833</a>.
    Remove “Turbo” link from admin header.
    See <a href="http://core.trac.wordpress.org/ticket/11301">#11301</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13879">r13879</a>.
    Remove Classic and Default themes.
    See <a href="http://core.trac.wordpress.org/ticket/10654">#10654</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13898">r13898</a>.
    Add link to <a href="http://codex.wordpress.org/Updating_WordPress" title="[codex.wordpress.org]">Updating WordPress</a> (Codex article).
    See <a href="http://core.trac.wordpress.org/ticket/11280">#11280</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13900">r13900</a>.
    Add Password Mismatch feedback to Password Strength Meter.
    See <a href="http://core.trac.wordpress.org/ticket/12576">#12576</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13932">r13932</a>.
    Fix out-of-order comments when nesting depth is reduced.
    See <a href="http://core.trac.wordpress.org/ticket/8841">#8841</a>.
    Displays child comments on same level as parent when <em>max_depth</em> is reached.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13942">r13942</a>.
    Better default excerpt. Remove multiple white spaces and split safely on UTF-8 strings.
    See <a href="http://core.trac.wordpress.org/ticket/10376">#10376</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13963">r13963</a>.
    Link to new <a href="http://codex.wordpress.org/Child_Themes" title="[codex.wordpress.org]">Child Themes</a> Codex article from the Updater.
    See <a href="http://core.trac.wordpress.org/ticket/12787">#12787</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13981">r13981</a>.
    Remove Gears from <abbr title="User Interface">UI</abbr>.
    See <a href="http://core.trac.wordpress.org/ticket/11301">#11301</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14010">r14010</a>.
    Update stats provided to api.wordpress.org.
    See <a href="http://core.trac.wordpress.org/ticket/12672">#12672</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14088">r14088</a>.
    Introduce DISALLOW_FILE_MOD for disabling all operations that modify core, theme, or plugin files.
    See <a href="http://core.trac.wordpress.org/ticket/13000">#13000</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14280">r14280</a>.
    Keep “Remember me” checked when user password is incorrect.
    See <a href="http://core.trac.wordpress.org/ticket/13165">#13165</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14324">r14324</a>.
    Change “WordPress Development Blog” to “WordPress Blog” in dashboard widget.

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/15027">r15027</a>.
    Use “WordPress Blog” (instead of “Development Blog”) in initial blogroll.
    See <a href="http://core.trac.wordpress.org/ticket/14324">#14324</a>.</li>
</ul></li>
<li><a href="http://core.trac.wordpress.org/changeset/14487">r14487</a>.
    Improve cross-DST future post publishing behaviour to try and publish at correct time if we have PHP5 timezone support available to help.
    See <a href="http://core.trac.wordpress.org/ticket/9285">#9285</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14491">r14491</a>.
    Bump <em>memory_limit</em> for admins in wp-admin. Should help in imports, upgrades, uploads, etc.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14764">r14764</a>.
    Move importers to WordPress Extend.
    See <a href="http://core.trac.wordpress.org/ticket/13307">#13307</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14836">r14836</a>.
    Contextual Help for Dashboard (and for all admin screens in subsequent revisions). 
    See <a href="http://core.trac.wordpress.org/ticket/13467">#13467</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15032">r15032</a>.
    Check capabilities properly when processing bulk edited posts.
    Hide checkbox on Page edit screen for users without capabilities.
    (Also in 2.9.x.)</li>
</ul>

<h2>Highlights for developers</h2>

<p>The part below this point is for developers, those who like getting their hands dirty, and, of course, the curious.</p>

<p class="insert">
Multi-site things are mostly omitted here, for two reasons:  First, while all are new to WordPress, most existed already in WordPress MU.  Second, I know almost nothing about the multi-site functionality.
</p>

<h3>Compatibility</h3>

<p>Backwards compatibility in version 3.0 is in general very good.  Areas that may need attention are highlighted in a number of compatibility posts at the WordPress Development Updates blog:</p>

<p><a href="http://wpdevel.wordpress.com/tag/30compat/" title="Posts on version 3.0 and plugin/theme compatibility at the WordPress Development Updates blog [wpdevel.wordpress.com]">wpdevel.wordpress.com/tag/30compat</a></p>

<h3>WP_DEBUG and deprecated functions</h3>

<p>WP_DEBUG was improved.  It now informs of the version as of which a function is deprecated, and it also informs about deprecated arguments.  Its definition is included for the first time by default in <em>wp-config.php</em> (set to <em>false</em>, of course), along with the recommendation to enable it when developing.</p>

<p>Why enable WP_DEBUG?  Three reasons:</p>

<ol>
<li>It helps make code better and future-proof</li>
<li>It helps make code faster:  Code without errors is faster than code with errors</li>
<li>It helps fellow developers (who won’t have to sift through messages generated by our code when they enable WP_DEBUG to debug their code)</li>
</ol>

<p>Andrew Nacin has more: <a href="http://www.andrewnacin.com/2010/03/22/deprecated-functions-and-wp_debug/" title="[andrewnacin.com]">Deprecated functions and WP_DEBUG</a></p>

<h3>&#42;_option() and &#42;_transient() functions now expect unslashed data</h3>

<p>See the explanation by Ryan Boren, and the relevant ticket:</p>

<ul>
<li><a href="http://wpdevel.wordpress.com/2010/04/19/this-is-a-reminder-that-as-per-ticket-12" title="[wpdevel.wordpress.com]">Explanation by Ryan Boren at wpdevel.wordpress.com</a></li>
<li><a href="http://core.trac.wordpress.org/ticket/12416" title="[core.trac.wordpress.org]">#12416: &#42;_option(), &#42;_transient() and &#42;_meta() functions should all expect unslashed data</a> </li>
</ul>

<h3>comment_form()</h3>

<p>I believe this new template function will become a favourite of all WordPress developers, theme authors and plugin authors.  Just use:</p>

<pre><code>comment_form();
</code></pre>

<p>&hellip; and you get a comment form that is complete, fully filterable and fully actionable.</p>

<p>DOCUMENTATION.
<a href="http://codex.wordpress.org/Template_Tags/comment_form" title="Documentation on comment_form() at the WordPress Codex [codex.wordpress.org]">codex.wordpress.org/Template_Tags/comment_form</a></p>

<h3>get_template_part()</h3>

<p>get_template part() is a new template function that helps avoid repetitive code in themes and makes it easier to modify themes via child themes.  Again, usage is simple:</p>

<pre><code>get_template_part('nav');
</code></pre>

<p>This will bring <em>nav.php</em> in, in the same way that get_header() brings in <em>header.php</em> and get_footer() brings in <em>footer.php</em>.</p>

<p>Of course, the above was already possible with PHP constructs like <em>include</em> and <em>require</em>.  What get_template_part() adds to that is granularity and awareness of child themes.</p>

<p>First, it can take a second parameter. E.g.:</p>

<pre><code>get_template_part('nav', 'main');
</code></pre>

<p>Here it will first look for <em>nav-main.php</em> and include it if it exists.  Otherwise it will include <em>nav.php</em>.</p>

<p>Second, if the active theme is a child theme, get_template_part() looks in the child’s directory first.  So, for example, you can add a <em>nav.php</em> template to your child theme, and it will be used instead of the <em>nav.php</em> of the parent.</p>

<p>DOCUMENTATION.
<a href="http://codex.wordpress.org/Function_Reference/get_template_part" title="Documentation on get_template_part() at the WordPress Codex [codex.wordpress.org]">codex.wordpress.org/Function_Reference/get_template_part</a></p>

<h3>Hyperminimal themes deprecated</h3>

<p>These are themes that rely on the default theme for any of <em>header.php</em>, <em>footer.php</em>, <em>sidebar.php</em>, <em>comments.php</em>, <em>comments-popup.php</em>.  This method is now deprecated and may stop working in the future:</p>

<p><a href="http://westi.wordpress.com/2010/05/03/themes-and-wordpress-3-0-some-important-changes/" title="[westi.wordpress.com]">Themes and WordPress 3.0: Some important changes</a> by westi (Peter Westwood)</p>

<h3>Improved inline documentation</h3>

<p>Over the last versions inline documentation has become more or less a requirement for any function, class and file added to WordPress.
In addition, supplying documentation where it’s missing, and improving existing documentation, is an ongoing project.
So, inline documentation gets better and more useful with every new release.  A small example of this ongoing effort:</p>

<p><a href="http://core.trac.wordpress.org/changeset/12761" title="[core.trac.wordpress.org]">r12761: phpDoc for the metadata <abbr title="Application Programming Interface">API</abbr></a></p>

<p>The official web interface of the inline documentation was also improved:
<a href="phpdoc.wordpress.org/trunk/" title="Web interface of the WordPress inline documenation [phpdoc.wordpress.org]">phpdoc.wordpress.org/trunk</a></p>

<h2>More for developers</h2>

<p class="insert">Work on this part is in progress.</p>

<h3>3rd-party libraries</h3>

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/12491">r12491</a>.
    JSON lib updated. Use encodeUnsafe in our JSON wrapper.
    See <a href="http://core.trac.wordpress.org/ticket/11537">#11537</a> for trunk.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12521">r12521</a>.
    phpass 0.2.
    See <a href="http://core.trac.wordpress.org/ticket/10727">#10727</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12522">r12522</a>.
    SWFobject JS 2.2.
    See <a href="http://core.trac.wordpress.org/ticket/11109">#11109</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12557">r12557</a>.
    Prototype.js 1.6.1.
    Scriptaculous.js 1.8.3.
    See <a href="http://core.trac.wordpress.org/ticket/11041">#11041</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12822">r12822</a>.
    MagpieRSS deprecated. Use SimplePie (<em>class-simplepie.php</em>).
    See <a href="http://core.trac.wordpress.org/ticket/11982">#11982</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13201">r13201</a>.
<a href="http://core.trac.wordpress.org/changeset/15243">r15243</a>.
    jQuery <abbr title="User Interface">UI</abbr> 1.7.3.
    See <a href="http://core.trac.wordpress.org/ticket/11595">#11595</a>.
    See <a href="http://core.trac.wordpress.org/ticket/13868">#13868</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13310">r13310</a>.
    jQuery 1.4.2.
    See <a href="http://core.trac.wordpress.org/ticket/12305">#12305</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14052">r14052</a>.
    Snoopy deprecated. Use WP_Http (<em>http.php</em>, <em>class-http.php</em>).
    See <a href="http://core.trac.wordpress.org/ticket/12882">#12882</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14718">r14718</a>.
    <em>autocomplete.js</em>, CodePress removed.
    See <a href="http://core.trac.wordpress.org/ticket/13283">#13283</a>.
    See <a href="http://core.trac.wordpress.org/ticket/13307">#13307</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14728">r14728</a>.
    <em>interface.js</em> removed.
    See <a href="http://core.trac.wordpress.org/ticket/13442">#13442</a>.</li>
</ul>

<h3>New constants</h3>

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/13034">r13034</a>.
    DISALLOW_FILE_EDIT. Banishes theme/plugin editor.
    (By removing the <em>edit_files</em>, <em>edit_plugins</em> and <em>edit_themes</em> capabilities from all roles.) 
    See <a href="http://core.trac.wordpress.org/ticket/11306">#11306</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13737">r13737</a>.
<a href="http://core.trac.wordpress.org/changeset/14485">r14485</a>.
    WP_DEFAULT_THEME.
    See <a href="http://core.trac.wordpress.org/ticket/12846">#12846</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13587">r13587</a>.
<a href="http://core.trac.wordpress.org/changeset/13634">r13634</a>.
    WP_ALLOW_MULTISITE. To display <em>Tools › Network</em> menu.
    See <a href="http://core.trac.wordpress.org/ticket/11644">#11644</a>.
    See <a href="http://core.trac.wordpress.org/ticket/11816">#11816</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14088">r14088</a>.
    DISALLOW_FILE_MOD. Disables all operations that modify core/theme/plugin files.
    See <a href="http://core.trac.wordpress.org/ticket/13000">#13000</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14244">r14244</a>.
    DISALLOW_UNFILTERED_HTML.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15225">r15225</a>.
    ALLOW_SUBDIRECTORY_INSTALL.
    See <a href="http://core.trac.wordpress.org/ticket/13844">#13844</a>.
    (For conversion to multi-site.)</li>
</ul>

<h3>New action and filter hooks</h3>

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/12790">r12790</a>.
    wp_die_handler(). AKA “customizable death”. Filter for wp_die(). 
    See <a href="http://core.trac.wordpress.org/ticket/11892">#11892</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13037">r13037</a>.
<a href="http://core.trac.wordpress.org/changeset/13037">r14603</a>.
    posts_search(). Filter. Lets plugins contextually add/remove/modify search section of database query.
    See <a href="http://core.trac.wordpress.org/ticket/10667">#10667</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13073">r13073</a>.
    activate_wp_head(). Action in <em>wp-activate.php</em>.
    See <a href="http://core.trac.wordpress.org/ticket/12166">#12166</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13156">r13156</a>.
<a href="http://core.trac.wordpress.org/changeset/13214">r13214</a>.
    after_setup_theme(). Action. Runs after parent/child themes are included.
    See <a href="http://core.trac.wordpress.org/ticket/12231">#12231</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13231">r13231</a>.
    get_avatar_comment_types(). Filter for get_avatar(), to allow avatars for custom comment types.
    See <a href="http://core.trac.wordpress.org/ticket/11880">#11880</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13252">r13252</a>.
    template_include(). Filter to modify template path before it is included.
    See <a href="http://core.trac.wordpress.org/ticket/11242">#11242</a>.
    See <a href="http://core.trac.wordpress.org/ticket/12739">#12739</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13305">r13305</a>.
    show_advanced_plugins(). Filter to hide mu-plugins/drop-ins tabs in Plugins screen.
    See <a href="http://core.trac.wordpress.org/ticket/11861">#11861</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13330">r13330</a>.
    plugin_locale(), theme_locale(). Filters for load_&#42;_textdomain() functions.
    See <a href="http://core.trac.wordpress.org/ticket/9686">#9686</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13523">r13523</a>.
    tables_to_repair(). Filter.
    See <a href="http://core.trac.wordpress.org/ticket/11707">#11707</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13430">r13430</a>.
    pre_insert_term(). Filter for wp_insert_term().
    See <a href="http://core.trac.wordpress.org/ticket/10943">#10943</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13434">r13434</a>.
    comment_duplicate_trigger(). Action. Runs when duplicate comment is detected.
    See <a href="http://core.trac.wordpress.org/ticket/12188">#12188</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13549">r13549</a>.
    pre_post_link(). Filter for get_permalink() before token replacement occurs.
    See <a href="http://core.trac.wordpress.org/ticket/12240">#12240</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13478">r13478</a>.
    paginate_links(). Filter for links in paginate_links().
    See <a href="http://core.trac.wordpress.org/ticket/10826">#10826</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13479">r13479</a>.
    wp_link_pages_args(). Filter for wp_link_pages().
    See <a href="http://core.trac.wordpress.org/ticket/12158">#12158</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13481">r13481</a>.
    wp_loaded(). Action. Runs once WP init has finished.
    See <a href="http://core.trac.wordpress.org/ticket/12400">#12400</a>.
    <!--
        phpDoc
        This hook is fired once WP, all plugins, and the theme are fully loaded and instantiated.
        @link http://codex.wordpress.org/AJAX_in_Plugins
        ---></li>
<li><a href="http://core.trac.wordpress.org/changeset/13525">r13525</a>.
    widgets_admin_page(). Action at top of <em>widgets.php</em>.
    See <a href="http://core.trac.wordpress.org/ticket/12190">#12190</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13629">r13629</a>.
    before_signup_form(), after_signup_form(). Actions.
    See <a href="http://core.trac.wordpress.org/ticket/12199">#12199</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13867">r13867</a>.
    right_now_content_table_end(), right_now_discussion_table_end(). Actions.
    See <a href="http://core.trac.wordpress.org/ticket/12202">#12202</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13891">r13891</a>.
    robots_txt(). Filter for <em>robots.txt</em> output.
    See <a href="http://core.trac.wordpress.org/ticket/11918">#11918</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14067">r14067</a>.
    comment_id_fields(). Filter for get_comment_id_fields()
    See <a href="http://core.trac.wordpress.org/ticket/12893">#12893</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14382">r14382</a>.
    Actions for the Widgets <abbr title="Application Programming Interface">API</abbr>.
    See <a href="http://core.trac.wordpress.org/ticket/12546">#12546</a>.

<ul>
<li>register_sidebar()</li>
<li>wp_register_sidebar_widget()</li>
<li>wp_unregister_sidebar_widget()</li>
<li>dynamic_sidebar()</li>
<li>the_widget()</li>
</ul></li>
<li><a href="http://core.trac.wordpress.org/changeset/14814">r14814</a>.
    post_updated(). Action. Runs when a post is updated.
    See <a href="http://core.trac.wordpress.org/ticket/12473">#12473</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15174">r14996</a>.
    capital_P_dangit(). Default filter for the_content(), the_title(), comment_text().
    (An addition that will have to be removed or modified, because it causes problems.)</li>
</ul>

<h3>New functions</h3>

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/12487">r12487</a>. <!--CONDITIONAL-->
    is_comment_feed().
    See <a href="http://core.trac.wordpress.org/ticket/10827">#10827</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12598">r12598</a>.
    home_url(). Returns <em>home</em> option in appropriate protocol, HTTP or HTTPS. 
    See <a href="http://core.trac.wordpress.org/ticket/9008">#9008</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12609">r12609</a>. <!--CONDITIONAL-->
    is_multisite().
    See <a href="http://core.trac.wordpress.org/ticket/11644">#11644</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12611">r12611</a>. <!--CONDITIONAL-->
    is_super_admin().
    See <a href="http://core.trac.wordpress.org/ticket/11644">#11644</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12659">r12659</a>.
    get_intermediate_image_sizes().
    See <a href="http://core.trac.wordpress.org/ticket/10263">#10263</a>.
    For when adding/deleting attachments.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12696">r12696</a>.
    wp_login_form(). Emits complete login form for use in templates.
    See <a href="http://core.trac.wordpress.org/ticket/11172">#11172</a>.
    <a href="http://codex.wordpress.org/Function_Reference/wp_login_form" title="Documentation on wp_login_form() at the WordPress Codex [codex.wordpress.org]">CODEX</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12714">r12714</a>. <!--CONDITIONAL-->
    is_main_site().
    See <a href="http://core.trac.wordpress.org/ticket/11644">#11644</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12719">r12719</a>.
    register_post_status().
    See <a href="http://core.trac.wordpress.org/ticket/9674">#9674</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12796">r12796</a>.
    WP_User::for_blog(), current_user_can_for_blog().
    See <a href="http://core.trac.wordpress.org/ticket/11781">#11781</a>.
    To avoid calls to WP_User::_init_caps().</li>
<li><a href="http://core.trac.wordpress.org/changeset/12810">r12810</a>.
    comment_form(). Emits complete comment form for use in templates.
    See <a href="http://core.trac.wordpress.org/ticket/10910">#10910</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12917">r12917</a>.
    get_the_date().
    See <a href="http://core.trac.wordpress.org/ticket/11264">#11264</a>.
    Defaults to <em>date_format</em> option.
    <a href="http://codex.wordpress.org/Template_Tags/get_the_date" title="Documentation on get_the_date() at the WordPress Codex [codex.wordpress.org]">CODEX</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12923">r12923</a>.
<a href="http://core.trac.wordpress.org/changeset/13023">r13023</a>.
    get_post_permalink().
    See <a href="http://core.trac.wordpress.org/ticket/9674">#9674</a>.
    See <a href="http://core.trac.wordpress.org/ticket/12172">#12172</a>.
    Returns permalink for post of custom type.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12946">r12946</a>.
<a href="http://core.trac.wordpress.org/changeset/14417">r14417</a>.
    get_available_languages().
    See <a href="http://core.trac.wordpress.org/ticket/11774">#11774</a>.
    See <a href="http://core.trac.wordpress.org/ticket/13023">#13023</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13304">r13004</a>. <!--CONDITIONAL-->
    is_textdomain_loaded().
    See <a href="http://core.trac.wordpress.org/ticket/10527">#10527</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13082">r13082</a>.
    add_plugins_page(). Adds submenu to Plugins page.
    See <a href="http://core.trac.wordpress.org/ticket/11377">#11377</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13146">r13146</a>.
<a href="http://core.trac.wordpress.org/changeset/13816">r13816</a>.
<a href="http://core.trac.wordpress.org/changeset/14047">r14047</a>.
    get_template_part(). For themes to bring in template parts.
    See <a href="http://core.trac.wordpress.org/ticket/12371">#12371</a>.
    See <a href="http://core.trac.wordpress.org/ticket/12248">#12248</a>.
    See <a href="http://core.trac.wordpress.org/ticket/12941">#12941</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13177">r13177</a>.
    add_settings_error(). In the Settings <abbr title="Application Programming Interface">API</abbr>, to register messages for users.
    See <a href="http://core.trac.wordpress.org/ticket/11474">#11474</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13330">r13229</a>.
    wpdb::tables(). To fetch table names on global/blog scope.
    See <a href="http://core.trac.wordpress.org/ticket/11614">#11614</a>.
    See <a href="http://core.trac.wordpress.org/ticket/12083">#12083</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13330">r13330</a>.
    unload_textdomain().
    See <a href="http://core.trac.wordpress.org/ticket/9686">#9686</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13358">r13358</a>.
    wp_kses_named_entities(). Whitelists valid named entity references.
    See <a href="http://core.trac.wordpress.org/ticket/12284">#12284</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13403">r13403</a>.
<a href="http://core.trac.wordpress.org/changeset/13928">r13928</a>.
    register_theme_headers(), unregister_theme_headers().
    See <a href="http://core.trac.wordpress.org/ticket/12343">#12343</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13409">r13409</a>.
<a href="http://core.trac.wordpress.org/changeset/13806">r13806</a>.
    send_nosniff_header(). Turns off content sniffing in supporting browsers.
    See <a href="http://core.trac.wordpress.org/ticket/10671">#10671</a>.
    See <a href="http://core.trac.wordpress.org/ticket/12683">#12683</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13413">r13413</a>.
<a href="http://core.trac.wordpress.org/changeset/13526">r13526</a>.
<a href="http://core.trac.wordpress.org/changeset/14639">r14639</a>.
<a href="http://core.trac.wordpress.org/changeset/14641">r14641</a>.
    Functions for returning various values to filters:

<ul>
<li>&#95;&#95;return_false()</li>
<li>&#95;&#95;return_true()</li>
<li>&#95;&#95;return_zero()</li>
<li>&#95;&#95;return_empty_array()</li>
</ul></li>
<li><a href="http://core.trac.wordpress.org/changeset/13438">r13438</a>.
    add_permastruct(), flush_rewrite_rules().  Wrappers for the WP_Rewrite methods.
    See <a href="http://core.trac.wordpress.org/ticket/10912">#10912</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13441">r13441</a>.
    add_editor_style(). Registers stylesheet for visual editor.
    See <a href="http://core.trac.wordpress.org/ticket/11512">#11512</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13454">r13454</a>.
    wpdb::replace(). For replacing queries.
    See <a href="http://core.trac.wordpress.org/ticket/10864">#10864</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13483">r13483</a>.
    get_search_link().
    See <a href="http://core.trac.wordpress.org/ticket/10552">#10552</a>.
    Has permastruct support. E.g.: <em>http://example.com/search/foo</em></li>
<li><a href="http://core.trac.wordpress.org/changeset/13557">r13557</a>.
    the_feed_link().
    See <a href="http://core.trac.wordpress.org/ticket/11794">#11794</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13576">r13576</a>.
    cache_users().
    See <a href="http://core.trac.wordpress.org/ticket/11914">#11914</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13608">r13608</a>.
    get_taxonomies().
    See <a href="http://core.trac.wordpress.org/ticket/12516">#12516</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13635">r13635</a>.
<a href="http://core.trac.wordpress.org/changeset/13683">r13683</a>.
    wp_get_shortlink(), the_shortlink(), wp_shortlink_wp_head(), wp_shortlink_header().
    See <a href="http://core.trac.wordpress.org/ticket/10640">#10640</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13658">r13658</a>.
    disabled(). Form helper, companion for selected() and checked().
    See <a href="http://core.trac.wordpress.org/ticket/12581">#12581</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13718">r13718</a>.
    sanitize_key(). Sanitizes string keys.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13756">r13756</a>.
    apply_filters_ref_array().
    See <a href="http://core.trac.wordpress.org/ticket/9886">#9886</a>.
    Like apply_filters(), but args passed are in array.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13819">r13819</a>.
    get_index_template(). So that child themes can override a parent’s <em>index.php</em>.
    See <a href="http://core.trac.wordpress.org/ticket/12635">#12635</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13877">r13877</a>.
    remove_theme_support().</li>
<li><a href="http://core.trac.wordpress.org/changeset/14028">r14028</a>.
    get_the_author_link().
    See <a href="http://core.trac.wordpress.org/ticket/12892">#12892</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14053">r14053</a>. <!--CONDITIONAL-->
    is_post_type_hierarchical().
    See <a href="http://core.trac.wordpress.org/ticket/12950">#12950</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14067">r14067</a>.
    get_comment_id_fields(). Getter for comment_id_fields().
<!--    Introduce a filter on the output to add extra fields. --->
    See <a href="http://core.trac.wordpress.org/ticket/12893">#12893</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14360">r14360</a>. <!--CONDITIONAL-->
    is_rtl().
    See <a href="http://core.trac.wordpress.org/ticket/13206">#13206</a>.
    Defined when locale is loaded, cannot be used too early.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14409">r14409</a>. <!--CONDITIONAL-->
    is_child_theme().
    See <a href="http://core.trac.wordpress.org/ticket/12998">#12998</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14607">r14607</a>.
    wp_reset_postdata().
    Restores <em>post</em> global to current post in main query after looping through a separate query.
    See <a href="http://core.trac.wordpress.org/ticket/12320">#12320</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14647">r14647</a>.
    _ex(). Combines _e() and _x(): Translate with context, then echo.
    See <a href="http://core.trac.wordpress.org/ticket/13395">#13395</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14649">r14649</a>.
    wp_check_filetype_and_ext(). To handle MIME/ext image comparisons/corrections for upload/sideload.
    See <a href="http://core.trac.wordpress.org/ticket/11946">#11946</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14711">r14711</a>.
    get_term_feed_link(). Returns feed link for taxomomy term.
    See <a href="http://core.trac.wordpress.org/ticket/13058">#13058</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14760">r14760</a>.
    WP_Importer class.
    See <a href="http://core.trac.wordpress.org/ticket/13034">#13034</a>.
    <a href="http://phpdoc.wordpress.org/trunk/WordPress/WP_Importer.html" title="Inline documentation for the WP_Importer class [phpdoc.wordpress.org]">phpDoc</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14950">r14950</a>.
    comments_link_feed(). Echoes link to comments of current post properly escaped for XML.
    See <a href="http://core.trac.wordpress.org/ticket/13555">#13555</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15174">r15174</a>.
    get_current_user_id().
    See <a href="http://core.trac.wordpress.org/ticket/13785">#13785</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15193">r15193</a>.
    register_nav_menu(), register_nav_menus().  For themes to register one or more menus.
    See <a href="http://core.trac.wordpress.org/ticket/13825">#13825</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15203">r15203</a>.
    menu_page_url(). For plugin authors, to get URLs of pages they have added.
    See <a href="http://core.trac.wordpress.org/ticket/13829">#13829</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15220">r15220</a>.
<a href="http://core.trac.wordpress.org/changeset/14158">r14158</a>.
    post_type_exists(). Checks if post type is registered.
    See <a href="http://core.trac.wordpress.org/ticket/13747">#13747</a>.
    See <a href="http://core.trac.wordpress.org/ticket/12588">#12588</a>.</li>
</ul>

<h3>Improved and modified functions</h3>

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/12514">r12514</a>.
    the_modified_date(). New <em>before/after/echo</em> args.
    See <a href="http://core.trac.wordpress.org/ticket/11255">#11255</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12518">r12518</a>.
    get_comments(). More <em>orderby</em> and <em>select</em> options.
    See <a href="http://core.trac.wordpress.org/ticket/10668">#10668</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12558">r12558</a>.
    WP_Dependencies. New <em>null</em> arg to disable script/CSS version query strings.
    See <a href="http://core.trac.wordpress.org/ticket/11315">#11315</a>.
    Useful, e.g., when scripts are loaded from an external CDN.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12658">r12658</a>.
    get_terms(). Now <em>include</em> and <em>exclude</em> args can be arrays.
    See <a href="http://core.trac.wordpress.org/ticket/11076">#11076</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12667">r12667</a>.
    wpdb class. Compatibility with WP, MU &amp; MS.
    See <a href="http://core.trac.wordpress.org/ticket/11644">#11644</a>.
    <a href="http://core.trac.wordpress.org/log/trunk/wp-includes/wp-db.php" title="Full changelog for the wp-db.php file [core.trac.wordpress.org]">wp-db.php changelog</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12719">r12719</a>.
    register_post_type().
    See <a href="http://core.trac.wordpress.org/ticket/9674">#9674</a>.
    <a href="http://codex.wordpress.org/Function_Reference/register_post_type" title="Documentation on register_post_type() at the WordPress Codex [codex.wordpress.org]">CODEX</a></li>
<li><a href="http://core.trac.wordpress.org/changeset/13048">r13048</a>.
    get_search_form(), wp_loginout(), wp_register(), get_calendar().
    New <em>echo</em> arg.
    See <a href="http://core.trac.wordpress.org/ticket/11842">#11842</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13350">r13350</a>.
    post_class(). New <em>.type-{post_type}</em> class.
    See <a href="http://core.trac.wordpress.org/ticket/11609">#11609</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13417">r13417</a>.
    add_theme_support(). New <em>custom-background</em>, <em>custom-header</em>, <em>nav-menus</em> params.
    See <a href="http://core.trac.wordpress.org/ticket/11817">#11817</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13467">r13467</a>.
    single_(post|cat|tag|month)_title(). Filters standardized on strip_tags() and wptexturize().
    See <a href="http://core.trac.wordpress.org/ticket/10900">#10900</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13483">r13483</a>.
    get_search_feed_link(), get_search_comments_feed_link().
    Updated to use get_search_link() (new, with permastruct support).
    See <a href="http://core.trac.wordpress.org/ticket/10552">#10552</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13486">r13486</a>.
    is_tax(). New <em>term</em> parameter.
    See <a href="http://core.trac.wordpress.org/ticket/11904">#11904</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13673">r13673</a>.
    &#42;_option(), &#42;_transient(). Now consistently expect unslashed data.
    See <a href="http://core.trac.wordpress.org/ticket/12416">#12416</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13695">r13695</a>.
    get_pages(). Now supports custom hierarchical post types.
    See <a href="http://core.trac.wordpress.org/ticket/12600">#12600</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13773">r13773</a>.
    add_endpoint(). Now accepts custom Endpoint Mask.
    See <a href="http://core.trac.wordpress.org/ticket/12605">#12605</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13854">r13854</a>.
    wp_list_categories(). Now aware of custom taxonomies.
    See <a href="http://core.trac.wordpress.org/ticket/11838">#11838</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13952">r13952</a>.
    wp_unique_filename(). Now methods too can be a callback.
    See <a href="http://core.trac.wordpress.org/ticket/12824">#12824</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13978">r13978</a>.
    get_search_query(). Now escapes by default, like the_search_query().
    See <a href="http://core.trac.wordpress.org/ticket/12780">#12780</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13982">r13982</a>.
    wpautop(). New block-level HTML5 elements.
    See <a href="http://core.trac.wordpress.org/ticket/12335">#12335</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13995">r13995</a>.
    wp_delete_comment(). New <em>force_delete</em> arg.
    See <a href="http://core.trac.wordpress.org/ticket/12766">#12766</a>.
    See <a href="http://core.trac.wordpress.org/ticket/11470">#11470</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14095">r14095</a>.
    wptexturize(). Improved for single quotes.
    See <a href="http://core.trac.wordpress.org/ticket/4539">#4539</a>.
    (Abbreviated years followed by punctuation or markup.)</li>
<li><a href="http://core.trac.wordpress.org/changeset/14131">r14131</a>.
    wp_list_bookmarks(). Now <em>orberby</em> accepts comma-delimited list of fields.
    See <a href="http://core.trac.wordpress.org/ticket/12421">#12421</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14133">r14133</a>.
    get_posts(), get_pages(). Now <em>include/exclude</em> args can be arrays.
    See <a href="http://core.trac.wordpress.org/ticket/11076">#11076</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14766">r14766</a>.
    stripslashes_deep(). Attempt to make object-safe.
    See <a href="http://core.trac.wordpress.org/ticket/12860">#12860</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14887">r14887</a>.
    is_singular(). Now understands custom post-types.
    Usage: <em>is_singular('book')</em> or <em>is_singular(array('newspapers', 'books'))</em>.
    See <a href="http://core.trac.wordpress.org/ticket/12588">#12588</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15002">r15002</a>.
<a href="http://core.trac.wordpress.org/changeset/15003">r15003</a>.
    wp_constrain_dimensions(). Tweaks for better fits and consistency.
    See <a href="http://core.trac.wordpress.org/ticket/13556">#13556</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15107">r15107</a>.
    wp_list_categories(). Now filter accepts <em>args</em>.
    See <a href="http://core.trac.wordpress.org/ticket/13682">#13682</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15188">r15188</a>.
    get_page(). Now alias of get_post().
    See <a href="http://core.trac.wordpress.org/ticket/13753">#13753</a>.</li>
</ul>

<h3>Deprecated functions and their replacements</h3>

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/12526">r12526</a>.
    Set version when function was deprecated for all deprecated functions.
    See <a href="http://core.trac.wordpress.org/ticket/7493">#7493</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12536">r12536</a>.
    Introduce _deprecated_argument() for marking args as deprecated,
    so that with WP_DEBUG enabled developers can see they need to review and update their code.
    See <a href="http://core.trac.wordpress.org/ticket/11386">#11386</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13185">r13185</a>.
    Add WP_DEBUG define to wp-config-sample.php and suggest plugin/theme developers use it.
    See <a href="http://core.trac.wordpress.org/ticket/12236">#12236</a>.</li>
</ul>

<p>Following is a not complete list of functions added to the deprecated group in WordPress v3.0:</p>

<p><em>You don’t need to memorize all that, of course!  Simply enable WP_DEBUG, and it will tell you if there is anything you should not be using.</em></p>

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/12459">r12459</a>.
    _nc(). Use _nx() for specifying contexts.
    See <a href="http://core.trac.wordpress.org/ticket/11404">#11404</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12585">r12585</a>. <!--MOVE!-->
    Deprecate user levels.
    See <a href="http://core.trac.wordpress.org/ticket/10805">#10805</a>.
    Use <a href="http://codex.wordpress.org/Roles_and_Capabilities" title="Documentation on Roles and Capabilities at the WordPress Codex [codex.wordpress.org]&quot;">Roles and Capabilities</a> instead.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12624">r12624</a>.
    generate_random_password(). Use wp_generate_password().
    See <a href="http://core.trac.wordpress.org/ticket/11746">#11746</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13093">r13093</a>.
    Move deprecated functions to <em>deprecated.php</em>.
    See <a href="http://core.trac.wordpress.org/ticket/11388">#11388</a>.

<ul>
<li>get_the_attachment_link(). Use wp_get_attachment_link().</li>
<li>get_attachment_icon_src(). Use wp_get_attachment_image_src().</li>
<li>get_attachment_icon(), get_attachment_innerHTML(). Use wp_get_attachment_image().</li>
<li>get_link(). Use get_bookmark().</li>
</ul></li>
<li><a href="http://core.trac.wordpress.org/changeset/13096">r13096</a>.
    Deprecate old L10n and sanitization APIs.
    See <a href="http://core.trac.wordpress.org/ticket/11388">#11388</a>.

<ul>
<li>ngettext(). Use _n().</li>
<li>ngettext_noop(). Use _n_noop().</li>
<li>translate_with_context(). Use _x().</li>
<li>sanitize_url(). Use esc_url_raw().</li>
<li>js_escape(). Use esc_js().</li>
<li>wp_specialchars(). Use esc_html().</li>
<li>attribute_escape(). Use esc_attr().</li>
</ul></li>
<li><a href="http://core.trac.wordpress.org/changeset/13299">r13299</a>.
    clean_url(). Use esc_url().
    See <a href="http://core.trac.wordpress.org/ticket/12309">#12309</a></li>
<li><a href="http://core.trac.wordpress.org/changeset/13300">r13300</a>.
    &#42;_usermeta() family. Use new &#42;_user_meta() functions.
    See <a href="http://core.trac.wordpress.org/ticket/10837">#10837</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13398">r13398</a>.
    automatic_feed_links(). Use <em>add_theme_support('automatic-feed-links')</em>.
    See <a href="http://core.trac.wordpress.org/ticket/12364">#12364</a>.

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/13399">r13399</a>.
    Restore back compat in automatic_feed_links() to deregister the extra feeds.
    See <a href="http://core.trac.wordpress.org/ticket/12364">#12364</a>.</li>
</ul></li>
<li><a href="http://core.trac.wordpress.org/changeset/13464">r13464</a>.
    get_profile(). Use get_the_author_meta().
    See <a href="http://core.trac.wordpress.org/ticket/10695">#10695</a>.
    <a href="http://codex.wordpress.org/Template_Tags/the_author_meta" title="Documentation on the_author_meta() at the WordPress Codex [codex.wordpress.org]">CODEX</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13761">r13761</a>.
    get_usernumposts(). Use count_user_posts().
    See <a href="http://core.trac.wordpress.org/ticket/12642">#12642</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13805">r13805</a>.
    (add|remove)_option_update_handler(). Use (un)register_setting().
    See <a href="http://core.trac.wordpress.org/ticket/11730">#11730</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13988">r13988</a>.
    funky_javascript_fix() and callback.
    See <a href="http://core.trac.wordpress.org/ticket/12520">#12520</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13991">r13991</a>.
    trackback_rdf().
    See <a href="http://core.trac.wordpress.org/ticket/11139">#11139</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14090">r14090</a>.
    set_current_user(). Use wp_set_current_user().</li>
<li><a href="http://core.trac.wordpress.org/changeset/14646">r14646</a>.
    get_bloginfo('text_direction'). Use is_rtl().
    See <a href="http://core.trac.wordpress.org/ticket/13206">#13206</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15168">r15168</a>.
<a href="http://core.trac.wordpress.org/changeset/15170">r15170</a>.
    get_most_active_blogs(), get_blog_list().
    See <a href="http://core.trac.wordpress.org/ticket/13773">#13773</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15220">r15220</a>.
    Replace misnamed is_&#42;() functions with &#42;_exists() ones.
    See <a href="http://core.trac.wordpress.org/ticket/13747">#13747</a>.

<ul>
<li>is_taxonomy(). Use taxonomy_exists().</li>
<li>is_term(). Use term_exists().</li>
</ul></li>
</ul>

<h3>Performance, optimization</h3>

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/11976">r11976</a>.
    Improve get_page_hierarchy().
    See <a href="http://core.trac.wordpress.org/ticket/10853">#10853</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12464">r12464</a>.
    Improve do_action() performance. Make <em>$wp_actions</em> an associative array.
    See <a href="http://core.trac.wordpress.org/ticket/10561">#10561</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12657">r12657</a>.
    Switch to passing arrays instead of query strings to functions.
    See <a href="http://core.trac.wordpress.org/ticket/6647">#6647</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13143">r13143</a>.
    Optimize single_(post|tag|cat)_title() to use WP_Query globals if available.
    Removes extra DB query in single_post_title() in most cases.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13205">r13205</a>.
    Bail early for favicon.ico requests so we don’t load WP twice.
    See <a href="http://core.trac.wordpress.org/ticket/3426">#3426</a>.
    Reduces server load when certain browsers arbitrarily request <em>/favicon.ico</em> and <em>/favicon.ico</em> does not exist.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13227">r13227</a>.
    Add INDEX on <em>comment_parent</em> to speed up wp_delete_comment() reparenting queries.
    See <a href="http://core.trac.wordpress.org/ticket/12289">#12289</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13576">r13576</a>.
    Improve user listing performance.
    See <a href="http://core.trac.wordpress.org/ticket/11914">#11914</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13647">r13647</a>.
    Add <em>no_found_rows</em> arg to WP_Query::get_posts() to allow forcibly defeating SQL_CALC_FOUND_ROWS.
    Use <em>no_found_rows</em> for the query in get_boundary_post().
    See <a href="http://core.trac.wordpress.org/ticket/12557">#12557</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13653">r13653</a>.
    Cache get_lastpostmodified() results.
    See <a href="http://core.trac.wordpress.org/ticket/12575">#12575</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13676">r13676</a>.
    Don’t check for existence of <em>index.php</em> in <em>.htaccess</em> rewrite rules.
    See <a href="http://core.trac.wordpress.org/ticket/11845">#11845</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13676">r13676</a>.
    Use wp_cache_set() instead of wp_cache_add() in Recent Posts and Archives widgets.
    See <a href="http://core.trac.wordpress.org/ticket/11580">#11580</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14139">r14139</a>.
    Use relative paths when including files, to avoid <em>include_path</em>.
    See <a href="http://core.trac.wordpress.org/ticket/12594">#12594</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14665">r14665</a>.
    Don’t update_post_caches() if a persistent object cache is installed.
    See <a href="http://core.trac.wordpress.org/ticket/12611">#12611</a>.</li>
</ul>

<h3>Other</h3>

<ul>
<li><a href="http://core.trac.wordpress.org/changeset/12602">r12602</a>.
    Add multi-site settings code.
    <em>Here starts the MU merge!</em></li>
<li><a href="http://core.trac.wordpress.org/changeset/12641">r12641</a>.
    Allow attaching <a href="http://php.net/manual/functions.anonymous.php" title="Anonymous functions, AKA closures, in the PHP Manual [php.net]">PHP 5.3 closures</a> to filters and actions.
    See <a href="http://core.trac.wordpress.org/ticket/10493">#10493</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12727">r12727</a>.
    Always set default timezone to UTC. Do offsets on top of that to be portable across all environments.
    See <a href="http://core.trac.wordpress.org/ticket/9588">#9588</a>.
    See <a href="http://core.trac.wordpress.org/ticket/11665">#11665</a>.
    See <a href="http://core.trac.wordpress.org/ticket/11672">#11672</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12914">r12914</a>.
    Add phpDoc to all add&#95;&#42;&#95;page() functions.
    Rename arguments to emphasise that people should be using Capabilities, not User Levels, and named hooks, not &#95;&#95;FILE&#95;&#95;.
    See <a href="http://core.trac.wordpress.org/ticket/12101">#12101</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/12915">r12915</a>.
    Support specific author templates by ID or <em>user_nicename</em>.
    See <a href="http://core.trac.wordpress.org/ticket/12064">#12064</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13032">r13032</a>.
    Look for <em>single-&#42;.php</em> templates. Add <em>single-</em> class to get_body_class().
    See <a href="http://core.trac.wordpress.org/ticket/12105">#12105</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13167">r13167</a>.
<a href="http://core.trac.wordpress.org/changeset/13452">r13452</a>.
<a href="http://core.trac.wordpress.org/changeset/15017">r15017</a>.
    Warn of unexpected output when activating plugins.
    See <a href="http://core.trac.wordpress.org/ticket/12089">#12089</a>.
    See <a href="http://core.trac.wordpress.org/ticket/13585">#13585</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13427">r13427</a>.
    Use is_ssl() instead of <em>$_SERVER['HTTPS'] == 'on'</em> checks (which don’t work on all hosts).
    See <a href="http://core.trac.wordpress.org/ticket/11885">#11885</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13433">r13433</a>. <!--IMPORTANT-->
    Consistently pass unserialized values to hooks in update_site_option().
    Change add_option() and add_site_option() to do the same.
    Plugins using maybe_unserialize() would continue to work as the value would no longer need to be unserialized.
    See <a href="http://core.trac.wordpress.org/ticket/10788">#10788</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13484">r13484</a>.
    Support non-BASIC authentication schemes in HTTP <abbr title="Application Programming Interface">API</abbr> if server supports them.
    See <a href="http://core.trac.wordpress.org/ticket/4011">#4011</a>.
    See <a href="http://core.trac.wordpress.org/ticket/12200">#12200</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13499">r13499</a>.
    Display PHP start-up errors and warnings.
    See <a href="http://core.trac.wordpress.org/ticket/12395">#12395</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/13456">r13456</a>.
    Allow multiple To: recipients in wp_mail().
    Improve handling of <em>\r\n</em> in headers and multiple CC/BCC headers.
    See <a href="http://core.trac.wordpress.org/ticket/10420">#10420</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14086">r14086</a>.
    Register <em>inherit</em> as post status. Check parent post status when commenting on attachments.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14111">r14111</a>.
    Introduce <em>edit_theme_options</em> capability.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14276">r14276</a>.
    Introduce template file for front page.
    Has priority over other templates which apply, falls back to standard template flow for the page/list of posts.
    See <a href="http://core.trac.wordpress.org/ticket/6801">#6801</a>.
    <a href="http://codex.wordpress.org/Template_Hierarchy" title="Documentation on Template_Hierarchy at the WordPress Codex [codex.wordpress.org]">CODEX</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14406">r14406</a>.
    Add HTML5 elements to KSES.
    See <a href="http://core.trac.wordpress.org/ticket/12835">#12835</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/14412">r14412</a>.
    Add protocols to KSES, make protocol list filterable, start esc_url() with same list.
    See <a href="http://core.trac.wordpress.org/ticket/10914">#10914</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15096">r15096</a>.
    Introduce <em>export</em> capability.
    See <a href="http://core.trac.wordpress.org/ticket/13681">#13681</a>.</li>
<li><a href="http://core.trac.wordpress.org/changeset/15239">r15239</a>.
    Missile guidance capabilities.</li>
</ul>

<h2>That’s it, folks!</h2>

<p>I wish you enjoy WordPress 3.0 (once it’s officially out!) and you publish even better content with it!</p>

<p>Thanks for reading!</p>

<p>/δκ</p>

<h2>Changes in this document</h2>

<dl>
<dt>2010-06-21</dt>
<dd>Link to <a href="http://ma.tt/2010/06/headers-of-twenty-ten/" title="The headers of Twenty Ten [ma.tt]">the story of the Twenty Ten headers</a>.</dd>

<dt>2010-06-19</dt>
<dd>Link to <a href="http://wordpress.org/support/topic/411649" title="WordPress 3.0 Issues, Problems, Resolutions thread at the WordPress forum [wordpress.org]">issues thread at the official forum</a>.</dd>

<dt>2010-06-17</dt>
<dd>Additions.  “Known issue” of insufficient memory for upgrading.</dd>

<dt>2010-06-16</dt>
<dt>2010-06-14</dt>
<dt>2010-06-13</dt>
<dd>Additions.</dd>

<dt>2010-06-12</dt>
<dd>What you need to return from multi-site to single-site (see comment no. 3 by Ron).
Fixed link to <a href="http://wpdevel.wordpress.com/2010/04/19/this-is-a-reminder-that-as-per-ticket-12" title="[wpdevel.wordpress.com]">Ryan Boren on &#42;&#95;(option|transient)() functions and unslashed data</a>.</dd>

<dt>2010-06-11</dt>
<dd>Additions.  Typos.  WP/MU/MS terminology explanation corrected (see comment no. 1 by Andrew Nacin).</dd>

<dt>2010-06-10</dt>
<dd>Additions.
Link to <a href="http://ottopress.com/2010/wordpress-3-0-and-custom-post-types/" title="WordPress 3.0 and Custom Post Types, by Otto [ottopress.com]">Otto on custom post-types</a>.</dd>

<dt>2010-06-09</dt>
<dd>Improvements, additions, new links.  WP/MU/MS terminology explanation to be corrected.
Link to <a href="phpdoc.wordpress.org/trunk/" title="Web interface of the WordPress inline documenation [phpdoc.wordpress.org]">improved webif of inline docs</a>.
Link to <a href="http://wpdevel.wordpress.com/tag/30compat/" title="Posts on version 3.0 and plugin/theme compatibility at the WordPress Development Updates blog [wpdevel.wordpress.com]">wpdevel compatibility posts</a>.</dd>
</dl>

<!--ABBREVIATIONS....................................................................................................-->

<!--URIs.............................................................................................................-->

<p>RELATED</p>

<ul><li><a href="http://op111.net/73" rel="bookmark" title="31 Dec 2009">Page Lists Plus: Comprehensive control of your WordPress page menu</a></li>

<li><a href="http://op111.net/57" rel="bookmark" title="23 Sep 2008">Add any link to your WordPress navigation menu with Page Links To</a></li>

<li><a href="http://op111.net/74" rel="bookmark" title="8 Jan 2010">Progressive enhancement of drop-down menus with the :not CSS selector</a></li>

<li><a href="http://op111.net/63" rel="bookmark" title="3 Nov 2008">WordPress 2.7: Ten useful new features</a></li>
</ul>

<!-- Similar Posts took 13.569 ms -->
<!-- PHP 5.x --><hr />
<p>Add to <a title="Bookmark in del.icio.us" href="http://del.icio.us/post?url=http://op111.net/76&title=WordPress 3.0: What’s new">del.icio.us</a></p>
<hr />
<p>© 2010 <a href="http://op111.net">op111.net</a> | <a href="http://op111.net/76">Permalink</a></p> ]]></content:encoded>
			<wfw:commentRss>http://op111.net/76/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Making clean archives for distribution on Mac OS X</title>
		<link>http://op111.net/75</link>
		<comments>http://op111.net/75#comments</comments>
		<pubDate>Thu, 29 Apr 2010 14:20:15 +0000</pubDate>
		<dc:creator>demetris</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[.ds_store]]></category>
		<category><![CDATA[bzip2]]></category>
		<category><![CDATA[cleanarchiver]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[distribution]]></category>
		<category><![CDATA[friendliness]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[macosx]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[planet-wp-en]]></category>
		<category><![CDATA[sharing]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[themes]]></category>
		<category><![CDATA[ux]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[zip]]></category>

		<guid isPermaLink="false">http://op111.net/?p=75</guid>
		<description><![CDATA[CleanArchiver is a free OS X utility for generating clean ZIP, GZIP etc. archives for distribution. Read why and when you should use it. <a href="http://op111.net/75" title="View post Making clean archives for distribution on Mac OS X" rel="bookmark">More...</a>]]></description>
			<content:encoded><![CDATA[<!--nm: Generating clean archives for distribution on Mac OS X-->

<!--sl: osx-cleanarchiver-->

<!--id: 75-->

<p>Looking at <a href="http://core.trac.wordpress.org/ticket/12637" title="OS X-generated theme zips won’t upload properly [core.trac.wordpress.org]">a ticket on the WordPress bug tracker</a> yesterday, I was reminded of a little thing that can be a problem when you use OS X to generate archives for distribution.  <span id="more-75"></span></p>

<h2>The problem</h2>

<p>The built-in archiver of Mac OS X adds metadata directories and files, like <em>&#95;&#95;MACOSX</em> and <em>.DS&#95;Store</em>, to the archives it makes.  On Mac OS X these directories and files are hidden by default.  On other operating systems, however, in addition to being useless, they are also visible, cluttering the view and confusing the users:</p>

<p><a href="http://op111.net/wp-content/uploads/2010/04/osx-zip-linux-gnome-230-384x192.png" rel="lightbox[75]" title="ZIP archive made on Mac OSX and opened in Linux/GNOME"><img src="http://op111.net/wp-content/uploads/2010/04/osx-zip-linux-gnome-230-384x192.png" alt="ZIP archive made on Mac OSX and opened in Linux/GNOME" title="ZIP archive made on Mac OSX and opened in Linux/GNOME" width="384" height="192" class="alignnone size-full wp-image-822" /></a></p>

<p><a href="http://op111.net/wp-content/uploads/2010/04/osx-zip-win7-384x192.png" rel="lightbox[75]" title="ZIP archive made on OS X and opened in Windows 7"><img src="http://op111.net/wp-content/uploads/2010/04/osx-zip-win7-384x192.png" alt="ZIP archive made on OS X and opened in Windows 7" title="ZIP archive made on OS X and opened in Windows 7" width="384" height="192" class="alignnone size-full wp-image-821" /></a></p>

<p>Above are two ZIP archives made on OS X and opened in other operating systems,  Linux/GNOME and Windows&nbsp;7.  Notice the <em>&#95;&#95;MACOSX</em> folders.
What are they?  What are they there for?  Maybe I can ignore them.  But if I can ignore them, why are they there in the first place?
Please, someone explain this to me because I feel stupid right now!</p>

<h2>The solution</h2>

<p><a href="http://op111.net/wp-content/uploads/2010/04/cleanarchiver-320x320.png" rel="lightbox[75]" title="CleanArchiver for Mac OS X, Preferences"><img src="http://op111.net/wp-content/uploads/2010/04/cleanarchiver-320x320.png" alt="CleanArchiver for Mac OS X, Preferences" title="CleanArchiver for Mac OS X, Preferences" width="320" height="320" class="alignnone size-full wp-image-818" /></a></p>

<p>If you use OS X and make ZIP archives that you send to other people or distribute publicly, a simple solution to this problem is <a href="http://www.sopht.jp/cleanarchiver/" title="An OS X archiver to produce clean ZΙP, GZIP etc. archives [sopht.jp]">CleanArchiver</a>, a little free archiver by Anyakichi that, among other things:</p>

<blockquote>
  <p>has the ability not to include system files peculiar to Mac OS X such as <em>.DS&#95;Store</em> and custom icon file (<em>Icon\r</em>) in your archive.
    So your archive is always clean on other operating systems.</p>
</blockquote>

<p>CleanArchiver is simple to use:  Throw it to your Dock and, when you want to package something, drop it on the icon.</p>

<p>It can make archives of other types too, including GZIP and BZIP2, and it also has some more preferences that you can set.  It comes with a short help file that explains all its functionality in English and in Japanese.  Get CleanArchiver from its homepage:</p>

<p><a href="http://www.sopht.jp/cleanarchiver/" title="An OS X archiver to produce clean ZΙP, GZIP etc. archives [sopht.jp]">www.sopht.jp/cleanarchiver</a></p>

<p>And thank you for reading!  —δκ</p>

<!--URIs.....................................................................-->

<p>RELATED</p>

<ul><li><a href="http://op111.net/64" rel="bookmark" title="20 Nov 2008">Fifteen useful shell extensions for Windows</a></li>

<li><a href="http://op111.net/51" rel="bookmark" title="16 Aug 2008">Five clean, minimalist themes for WordPress</a></li>

<li><a href="http://op111.net/76" rel="bookmark" title="7 Jun 2010">WordPress 3.0: What’s new</a></li>

<li><a href="http://op111.net/62" rel="bookmark" title="18 Oct 2008">WordPress: 20 answers</a></li>
</ul>

<!-- Similar Posts took 37.011 ms -->
<!-- PHP 5.x --><hr />
<p>Add to <a title="Bookmark in del.icio.us" href="http://del.icio.us/post?url=http://op111.net/75&title=Making clean archives for distribution on Mac OS X">del.icio.us</a></p>
<hr />
<p>© 2010 <a href="http://op111.net">op111.net</a> | <a href="http://op111.net/75">Permalink</a></p> ]]></content:encoded>
			<wfw:commentRss>http://op111.net/75/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Progressive enhancement of drop-down menus with the :not CSS selector</title>
		<link>http://op111.net/74</link>
		<comments>http://op111.net/74#comments</comments>
		<pubDate>Fri, 08 Jan 2010 16:50:53 +0000</pubDate>
		<dc:creator>demetris</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[drop-down]]></category>
		<category><![CDATA[ie6]]></category>
		<category><![CDATA[ie7]]></category>
		<category><![CDATA[ie8]]></category>
		<category><![CDATA[indicators]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[lang-en]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[navmenu]]></category>
		<category><![CDATA[planet-wp-en]]></category>
		<category><![CDATA[selectors]]></category>
		<category><![CDATA[suckerfish]]></category>
		<category><![CDATA[superfish]]></category>
		<category><![CDATA[webdesign]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://op111.net/?p=74</guid>
		<description><![CDATA[Add indicators to items with subitems on your drop-down menu in three easy steps, using CSS alone.  For all browsers except IE.  <a href="http://op111.net/74" title="View post Progressive enhancement of drop-down menus with the :not CSS selector" rel="bookmark">More...</a>]]></description>
			<content:encoded><![CDATA[<!--nm: Progressive enhancement for drop-down menus with the :not CSS selector-->

<!--sl: -->

<!--id: xx-->

<!--INTRODUCTION -->

<p>You probably have noticed the characters—usually arrows—displayed on some navigation menus to indicate the presence of subitems under an item.  I find them helpful, and I recently looked to see if it was possible to have them displayed on a CSS drop-down menu by using only CSS (that is, without any JavaScript assistance).  In this howto I explain the solution I arrived at:  <span id="more-74"></span></p>

<p>How to display these useful indicators on a CSS drop-down menu by using the selector <code>:not</code>.</p>

<p class="insert">For a simple demo, see the menu of this site, op111.net.</p>

<p>It is a simple solution that works in all browsers except Internet Explorer, where the indicators simply do not appear at all.  Hence, it is a progressive enhancement, or, to put it the other way round, it degrades gracefully in old or wayward browsers.</p>

<p>It is also a solution that suggested to me that the <code>:not</code> selector may offer possibilities that are unexplored.  If you know of other useful applications of the <code>:not</code> selector, be kind enough to enligthen us with your comment!</p>

<h2>    Step 1</h2>

<p>To each anchor in the menu we add an indicator-character wrapped in a <code>span</code> with an appropriate class:</p>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;more&quot;</span>&gt;</span> <span style="color: #666666;">&amp;darr;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span></pre></div></div>


<p>For this howto I use the downward arrow as indicator, and <code>more</code> as the class name.</p>

<p>So, supposing we have a menu with two top-level items, one of which has a subitem:</p>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://x.net/p1&quot;</span>&gt;</span>Page1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://x.net/p2&quot;</span>&gt;</span>Page2<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://x.net/p2/s1&quot;</span>&gt;</span>Subpage1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span></pre></div></div>


<p>... what we aim at is:</p>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://x.net/p1&quot;</span>&gt;</span>Page1<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;more&quot;</span>&gt;</span> <span style="color: #666666;">&amp;darr;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://x.net/p2&quot;</span>&gt;</span>Page2<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;more&quot;</span>&gt;</span> <span style="color: #666666;">&amp;darr;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://x.net/p2/s1&quot;</span>&gt;</span>Subpage1<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;more&quot;</span>&gt;</span> <span style="color: #666666;">&amp;darr;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span></pre></div></div>


<p>The best way to add the indicators will depend, of course, on how the markup is generated.  If you use WordPress, look at the Appendix at the end for some examples.</p>

<p>Let’s see the second step now...</p>

<h2>    Step 2</h2>

<p>We make a CSS rule to hide <strong>all</strong> indicators we added:</p>

<pre lang="">
li a .more { display: none; }
</pre>

<p>Why did we do that?</p>

<p>Because the indicators we added in the first step appear in all items, but not all items have subitems.  So, in the second step we hid the indicators, and in the third step we will instruct the browser to display indicators only in items with subitems:</p>

<h2>    Step 3</h2>

<p>We make a second CSS rule:</p>

<pre lang="">
li a:not(:last-child) .more { display: inline; }
</pre>

<p>Done!</p>

<h2>    How does this work?</h2>

<p>In items with subitems, the <code>a</code> anchor is followed by a <code>ul</code> element (which containts the subitems).  So, in items with subitems the anchor is <em>not</em> the last child of its <code>li</code> parent.  This is the condition that our <code>:not</code> rule specifies, saying, in human language:</p>

<p><em>Select <code>.more</code> within any anchor that is not the last child of its parent, and <code>display</code> it <code>inline</code>.</em></p>

<p>The <code>display:none</code> declaration of the second step is understood by all common browsers.  So, all browsers will hide the indicators from display.  Then, browsers that understand <code>:not</code> and <code>:last-child</code> will show the indicators where appropriate.</p>

<p><em>Simple, perfectly valid CSS 3, and, for this reason, future-proof too!</em></p>

<h2>    Fine... But!...</h2>

<h3>I want the helpful indicators in Internet Explorer too!</h3>

<p>That’s not possible with CSS alone, because IE (even IE8) knows nothing about CSS3 selectors like <code>:not</code> and <code>:last-child</code> (or <code>:only-child</code>, which would have the same effect here).</p>

<p>So, for Internet Explorer you will have to resort to a mixture of CSS and JavaScript.  Either use something like <a href="http://users.tpg.com.au/j_birch/plugins/superfish/" title="Superfish — Suckerfish on ’roids [users.tpg.com.au]">Superfish</a> or write some custom JavaScript.  If the site already uses a JS framework, I imagine the code would be pretty simple.  In jQuery, for example, all it takes is one line:</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'a:not(:last-child) .more'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<p>Then, load the JavaScript snippet conditionally if the user agent is Internet Explorer, so that good browsers don’t have to download unnecessary bytes.</p>

<h3>I want different indicators for parents of different levels!</h3>

<p>I omitted that from the example on purpose, to keep the markup as simple as possible.  It’s easy to do:</p>

<ol>
<li>Add two indicators to each anchor, one for subitems that expand vertically and another for subitems that expand horizontally,
and wrap each indicator in its own span along with an appropriate class.  E.g.:  <code>more-v</code> and <code>more-h</code>.</li>
<li>Hide all indicators.</li>
<li>For top-level parents display the one indicator by making a selector that applies to top-level parents only.
E.g.:

<ul>
<li><code>#menu &gt; ul &gt; a:not(:last-child) .more-v</code></li>
</ul></li>
<li>For lower-level parents display the other indicator by making a selector that targets lower-level parents.
E.g.:

<ul>
<li><code>ul ul a:not(:last-child) .more-h</code></li>
</ul></li>
</ol>

<h2>    Links</h2>

<p>That’s it for now.  Thanks for reading!</p>

<p>Here are a few links to help your work and research on drop-down menu systems:</p>

<ul>
<li><a href="http://www.quirksmode.org/css/contents.html" title="CSS browser compatibility table at QuirksMode [quirksmode.org]">CSS browser compatibility table at QuirksMode</a>.  See which browsers support advanced CSS3 selectors.</li>
<li><a href="http://www.tyssendesign.com.au/articles/css/dropdown-low-down/" title="Comparative review of dropdown menus [tyssendesign.com.au]">Dropdown low down — Tyssen Design</a>.  Extensive comparative review of drop-down menus.</li>
<li><a href="http://lwis.net/free-css-drop-down-menu/" title="A free and open-source drop-down menu framework [lwis.net]">Free CSS Drop-Down Menu Framework</a>.  Popular, actively maintained, relatively easy to set up, and licensed under the GPLv3.</li>
<li><a href="http://adipalaz.awardspace.com/experiments/css/accessible_ddmenu_test.html" title="Experimental keyboard-accessible CSS menu [adipalaz.awardspace.com]">Keyboard accessible dropdown menu</a>.  Full keyboard-accessibility even without JavaScript! </li>
<li><a href="http://users.tpg.com.au/j_birch/plugins/superfish/" title="Superfish — Suckerfish on ’roids [users.tpg.com.au]">Superfish</a>.  A jQuery plugin that adds useful enhancements, including indicators, to Suckerfish-type drop-down menus.</li>
</ul>

<h2>    Appendix</h2>

<p>Here are three bits of code that show how to generate the markup for the indicators in WordPress.</p>

<p>If you are constructing a WordPress theme from scratch, simply use the <code>link_after</code> argument of <code>wp_page_menu()</code>.  If the menu is generated by <code>wp_list_pages()</code>, you can pass the exact same argument to it too.  Here is an example that uses <code>wp_page_menu()</code>:</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">wp_page_menu<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'depth'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'link_after'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'&lt;span class=&quot;more&quot;&gt; &amp;darr;&lt;/span&gt;'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'sort_column'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'menu_order'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'title_li'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<p><code>wp_page_menu()</code> and <code>wp_list_pages()</code> can also be modified by <strong>applying a filter</strong>, which is convenient if you do not want to edit template files directly.</p>

<p>For <code>wp_page_menu()</code> the indicator markup is added by applying a filter to <code>wp_page_menu_args()</code>:</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> my_page_menu<span style="color: #009900;">&#40;</span><span style="color: #000088;">$args</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$args</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'link_after'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;span class=&quot;more&quot;&gt; &amp;darr;&lt;/span&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #7f7f00;">return</span> <span style="color: #000088;">$args</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'wp_page_menu_args'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'my_page_menu'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<p>For <code>wp_list_pages()</code> your filter will have to do a simple string replacement instead:</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> my_list_pages<span style="color: #009900;">&#40;</span><span style="color: #000088;">$html</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #7f7f00;">return</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;/a&gt;'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;span class=&quot;more&quot;&gt; &amp;darr;&lt;/span&gt;'</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;/a&gt;'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$html</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'wp_list_pages'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'my_list_pages'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<!--ABBREVIATIONS............................................................-->

<!--URIs.....................................................................-->

<!--MISC.....................................................................-->

<p>RELATED</p>

<ul><li><a href="http://op111.net/73" rel="bookmark" title="31 Dec 2009">Page Lists Plus: Comprehensive control of your WordPress page menu</a></li>

<li><a href="http://op111.net/57" rel="bookmark" title="23 Sep 2008">Add any link to your WordPress navigation menu with Page Links To</a></li>

<li><a href="http://op111.net/56" rel="bookmark" title="19 Sep 2008">Five good WordPress plugins you may not know about</a></li>

<li><a href="http://op111.net/59" rel="bookmark" title="1 Oct 2008">Add meaningful tooltips to your WordPress menu links with Page Menu Editor</a></li>
</ul>

<!-- Similar Posts took 31.064 ms -->
<!-- PHP 5.x --><hr />
<p>Add to <a title="Bookmark in del.icio.us" href="http://del.icio.us/post?url=http://op111.net/74&title=Progressive enhancement of drop-down menus with the :not CSS selector">del.icio.us</a></p>
<hr />
<p>© 2010 <a href="http://op111.net">op111.net</a> | <a href="http://op111.net/74">Permalink</a></p> ]]></content:encoded>
			<wfw:commentRss>http://op111.net/74/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Page Lists Plus: Comprehensive control of your WordPress page menu</title>
		<link>http://op111.net/73</link>
		<comments>http://op111.net/73#comments</comments>
		<pubDate>Thu, 31 Dec 2009 20:45:24 +0000</pubDate>
		<dc:creator>demetris</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[attribute]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[lang-en]]></category>
		<category><![CDATA[menu]]></category>
		<category><![CDATA[nav-menu]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[page-menu]]></category>
		<category><![CDATA[pages]]></category>
		<category><![CDATA[planet-wp-en]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[title]]></category>

		<guid isPermaLink="false">http://op111.net/?p=73</guid>
		<description><![CDATA[A review of Page Lists Plus, a WordPress plugin that helps you customize your page navigation menu to make it more friendly and more useful to visitors. <a href="http://op111.net/73" title="View post Page Lists Plus: Comprehensive control of your WordPress page menu" rel="bookmark">More...</a>]]></description>
			<content:encoded><![CDATA[<!--nm: Page Lists Plus:  Comprehensive control of your WordPress page menu-->

<!--sl: -->

<!--id: 73-->

<p>Whether you use WordPress for a weblog or as a more traditional CMS, your pages probably have a page navigation menu somewhere near the top.  Sooner or later there comes a time when you need a way to manage this menu better.  In fact, if you use WordPress more as a CMS and your main content is pages arranged hierarchically, this time comes right at the beginning.  <span id="more-73"></span></p>

<p>There are several good plugins that help with that, and op111.net has written about two of them:  <a href="http://op111.net/57" title="Add any link to your WordPress navigation menu with Page Links To [op111.net]">Page Links To</a> and <a href="http://op111.net/59" title="Add meaningful tooltips to your WordPress menu links with Page Menu Editor [op111.net]">Page Menu Editor</a>.  A few months ago I started using another page-menu plugin, which finally replaced for me both Page Links To and Page Menu Editor, as well as a third plugin, Exclude Pages.  It is called Page Lists Plus and this is a small review of it.</p>

<h2>    Page Lists Plus</h2>

<p>Homepage:  <a href="http://www.technokinetics.com/plugins/page-lists-plus/">technokinetics.com/plugins/page-lists-plus</a><br />
WP.org homepage:  <a href="http://wordpress.org/extend/plugins/page-lists-plus/">wordpress.org/extend/plugins/page-lists-plus</a><br />
Author homepage:  <a href="http://www.technokinetics.com/">technokinetics.com</a><br />
Version reviewed:  Page Lists Plus v1.1.5<br />
Compatibility:  Tested and works fine with WordPress v2.8, v2.9 and v3.0-dev.</p>

<p>Page Lists Plus is a plugin that offers options to customize the output of <em>wp_list_pages()</em>.  If that sounded like Greek to you, here is an explanation:  <em>wp_list_pages()</em> is the main WordPress function for generating a list of all pages (as opposed to posts) in a site, and it is what WordPress themes use to create page navigation menus.  What that means is that Page Lists Plus will work with virtually any WordPress theme that has a page menu.</p>

<p>What exactly can Page Lists Plus do then?</p>

<h2>    Page Lists Plus global options</h2>

<p>Page Lists Plus has about twenty options.  They are all presented on one screen, separated in two groups.  The first group is the <em>global</em> options, which you set once and forget about:</p>

<p><!--Page Lists Plus, Global options-->
<a href="http://op111.net/wp-content/uploads/2009/12/wp-plp-options-global.png" rel="lightbox[73]" title="Page Lists Plus 1.1.5 for WordPress, Global Options"><img src="http://op111.net/wp-content/uploads/2009/12/wp-plp-options-global.png" alt="Page Lists Plus 1.1.5 for WordPress, Global Options" title="Page Lists Plus 1.1.5 for WordPress, Global Options" width="384" height="384" class="alignnone size-full wp-image-668" /></a></p>

<p><strong>Add “Home” link</strong> is the first option and, I imagine, it must among the most useful to the users of the plugin:  If your theme does not have a Home link on the page menu (or an option to add one), all it takes to add it with PLP is one click.</p>

<p><strong>Add class="first_item"</strong> and the four options after it make it easy to change the appearance of the page menu via CSS.</p>

<p>The last global option, <strong>Remove title attributes from anchors</strong>, is what intrigued me most the first time I tried PLP, becaused it indicated interest for an area in which WordPress has not always been perfect (and in which WordPress has significantly improved the last few versions) —  <em>accessibility</em>.</p>

<p>As the author of Page Lists Plus <a href="http://www.technokinetics.com/wordpress-and-title-attribute-abuse/" title="Technokinetics &raquo; WordPress and Title Attribute Abuse [technokinetics.com]">explains in his site</a>, what WordPress does with title attributes is wrong and, unless you are manually adding meaningful and informative title attributes to your links, the best thing to do is remove them completely.  Selecting <em>Remove title attributes from anchors</em> will do exactly that.</p>

<p>(Even leaving accessibility aside, a title attribute identical to the anchor text is pointless and annoying.)</p>

<h2>    Page Lists Plus per-page options</h2>

<p>Next is the group of page-specific options.  They are eight in total and, since not all will be of interest to everyone, the plugin lets you select the ones you want to use:</p>

<p><!--Page Lists Plus, Page-specific options-->
<a href="http://op111.net/wp-content/uploads/2009/12/wp-plp-options-page-specific.png" rel="lightbox[73]" title="Page Lists Plus 1.1.5 for WordPress, Page-specific Options"><img src="http://op111.net/wp-content/uploads/2009/12/wp-plp-options-page-specific.png" alt="Page Lists Plus 1.1.5 for WordPress, Page-specific Options" title="Page Lists Plus 1.1.5 for WordPress, Page-specific Options" width="384" height="320" class="alignnone size-full wp-image-669" /></a></p>

<p>The options you select will then appear grouped in a box on the Edit screen of your Pages:</p>

<p><!--Page Lists Plus, Metabox-->
<a href="http://op111.net/wp-content/uploads/2009/12/wp-plp-metabox.png" rel="lightbox[73]" title="Page Lists Plus 1.1.5 for WordPress, metabox on Edit screen"><img src="http://op111.net/wp-content/uploads/2009/12/wp-plp-metabox.png" alt="Page Lists Plus 1.1.5 for WordPress, metabox on Edit screen" title="Page Lists Plus 1.1.5 for WordPress, metabox on Edit screen" width="284" height="284" class="alignnone size-full wp-image-667" /></a></p>

<p>As of version 1.1.5, the page-specific options of PLP are eight — one that I dislike, one that I’m indifferent to, and six I like and use:</p>

<dl>
<dt>Add Custom Classes to Individual List Items</dt>
<dd>Adding custom CSS classes to specific items makes it easy to style them individually via CSS.</dd>

<dt>Alternative Link Text</dt>
<dd>To specify, e.g., a short link text for a page that has a long title.
If I had a page with the title, say, <em>Greek Cuisine Recipes by Demetris</em>, I could use just <em>Greek Recipes</em> for the page menu.</dd>

<dt>Alternative Title Attribute</dt>
<dd>To supply supplementary information that appears when a link is hovered over.  (See screenshot example below.)</dd>

<dt>Include</dt>
<dd>To specify whether a page appears on page lists and page menus.
This option is selected by default for new pages.
(In the Global options you can also specify whether children of excluded pages are excluded too.)</dd>

<dt>Link</dt>
<dd>To unlink a page.  Useful, for example, for empty pages that serve as parents to other pages.</dd>

<dt>Redirect To</dt>
<dd>To make a page that appears on page menus and redirects transparently to a different URL.
For example, you can make a page that redirects to a category archive, by specifying the URL of the category archive.</dd>
</dl>

<p><!--TITLE attribute example-->
<a href="http://op111.net/wp-content/uploads/2009/12/wp-plp-title-attribute.png" rel="lightbox[73]" title="A hyperlink’s TITLE attribute, displayed when hovering on the link"><img src="http://op111.net/wp-content/uploads/2009/12/wp-plp-title-attribute.png" alt="A hyperlink’s TITLE attribute, displayed when hovering on the link" title="A hyperlink’s TITLE attribute, displayed when hovering on the link" width="512" height="256" class="alignnone size-full wp-image-670" /></a></p>

<p class="wp-caption">
In this example from op111.net the link for the Archives page has a TITLE attribute that provides some supplementary information on the target.  Graphical browsers commonly display the TITLE attribute when the link is hovered over.
</p>

<h2>    Suggestions &amp; Feature requests</h2>

<p>All in all, I’m happy with Page Lists Plus.  It’s been a three-in-one plugin for me, and it has been working flawlessly.  The following are just a few small points that I think would help make it even better, at least for what I need:</p>

<ul>
<li>An additional Save button near the top of the Options screen.</li>
<li>An option to use page Excerpts as title attributes of links.</li>
<li>An option to use custom anchor text for the Home link.</li>
</ul>

<h2>    Questions &amp; Answers</h2>

<p>These are a few questions I had when I started using Page Lists Plus, along with the answers I can offer now:</p>

<dl>
<dt>Is PLP a replacement for Page Links To?</dt>
<dd>Page Links To is a specialized plugin that does redirections of all kinds.
In that sense, Page Lists Plus is not a replacement for Page Links to.
However, if all you need is adding links to your page menu,
Page Lists Plus will do that for you just fine.</dd>

<dt>Is PLP a replacement for Page Menu Editor?</dt>
<dd>For me it has been a complete replacement, as it does everything Page Menu Editor does, and more.
Also, PLP is more economical in database queries:
While Page Menu Editor makes one query for every page that exists in a site,
Page Lists Plus only makes one query per active option that needs information from the database.
(Some of its options, like the addition of various CSS classes, do not need database information at all.)</dd>

<dt>Does PLP work with wp_page_menu()?</dt>
<dd>It should in theory, as <em>wp_page_menu()</em> is simply a wrapper for <em>wp_list_pages()</em>, and it seems to work in practice too.
(At this writing, the page menu of op111.net uses <em>wp_page_menu()</em>,
and Page Lists Plus seems to work fine with it.)</dd>
</dl>

<h2>    Behind Page Lists Plus:  Tim Holt</h2>

<p>Page Lists Plus is made by Tim Holt, a web developer in England.  Tim Holt specializes in WordPress customization, and, as his homepage and Page Lists Plus show, has also a special interest in web accessibility.</p>

<p>Tim replied prompty and informatively to two questions I sent his way before I started writing this review.  I want to thank him for his kindness from here too.</p>

<h2>    Links</h2>

<p>All Page Lists Plus links again, for your convenience.</p>

<p><em>Remember that you can install the plugin directly from your WordPress dashboard too:  Go to Plugins › Add New, search for Page Lists Plus and click Install on the first result.</em></p>

<ul>
<li><a href="http://www.technokinetics.com/plugins/page-lists-plus/" title="[technokinetics.com]">Page Lists Plus, homepage</a></li>
<li><a href="http://wordpress.org/extend/plugins/page-lists-plus/" title="[wordpress.org]">Page Lists Plus, WP.org homepage</a></li>
<li><a href="http://www.technokinetics.com/" title="[technokinetics.com]">Page Lists Plus, author homepage</a></li>
</ul>

<hr />

<p>Thank you for reading!  I wish you a happy 2010!</p>

<p>/δκ</p>

<hr />

<p>CHANGES</p>

<ul>
<li>2010-01-02.  Added Questions &amp; Answers part.</li>
</ul>

<!--ABBREVIATIONS............................................................-->

<!--URIs.....................................................................-->

<p>RELATED</p>

<ul><li><a href="http://op111.net/59" rel="bookmark" title="1 Oct 2008">Add meaningful tooltips to your WordPress menu links with Page Menu Editor</a></li>

<li><a href="http://op111.net/57" rel="bookmark" title="23 Sep 2008">Add any link to your WordPress navigation menu with Page Links To</a></li>

<li><a href="http://op111.net/74" rel="bookmark" title="8 Jan 2010">Progressive enhancement of drop-down menus with the :not CSS selector</a></li>

<li><a href="http://op111.net/65" rel="bookmark" title="1 Dec 2008">Tangofy: Better icons for WordPress 2.7 and 2.8</a></li>
</ul>

<!-- Similar Posts took 8.100 ms -->
<!-- PHP 5.x --><hr />
<p>Add to <a title="Bookmark in del.icio.us" href="http://del.icio.us/post?url=http://op111.net/73&title=Page Lists Plus: Comprehensive control of your WordPress page menu">del.icio.us</a></p>
<hr />
<p>© 2009 <a href="http://op111.net">op111.net</a> | <a href="http://op111.net/73">Permalink</a></p> ]]></content:encoded>
			<wfw:commentRss>http://op111.net/73/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>WordPress 2.8: What’s new</title>
		<link>http://op111.net/71</link>
		<comments>http://op111.net/71#comments</comments>
		<pubDate>Sat, 23 May 2009 14:00:03 +0000</pubDate>
		<dc:creator>demetris</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[ellak]]></category>
		<category><![CDATA[features]]></category>
		<category><![CDATA[lang-en]]></category>
		<category><![CDATA[new]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[planet-wp-en]]></category>
		<category><![CDATA[publishing]]></category>
		<category><![CDATA[screenshots]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[webdesign]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[wp2.7]]></category>
		<category><![CDATA[wp2.8]]></category>
		<category><![CDATA[αγγλικά]]></category>

		<guid isPermaLink="false">http://op111.net/?p=71</guid>
		<description><![CDATA[An illustrated tour of the new features and improvements in WordPress 2.8. <a href="http://op111.net/71" title="View post WordPress 2.8: What’s new" rel="bookmark">More...</a>]]></description>
			<content:encoded><![CDATA[<!--nm: WordPress 2.8: What’s new-->

<!--sl: wp-28-new-features-->

<!--id: 71-->

<!--INTRODUCTION -->

<p>After six months in preparation, the first beta version of WordPress 2.8 was released on 16 May 2009.  Following WordPress 2.7, which focused mainly on the UI, WordPress 2.8 brings changes that are more evenly distributed across all areas.  There are big improvements in the user interface, but there is a much larger amount of not immediately obvious improvements in two main areas: <span id="more-71"></span></p>

<ul>
<li>Extensibility</li>
<li>Optimization/Performance</li>
</ul>

<p>Also, many bug fixes and enhancements, big and small:  <a href="http://groups.google.com/group/wp-hackers/browse_thread/thread/73238e6074c60218" title="New milestone: 10000 tickets, by Xavier Borderie at the wp-hackers list [groups.google.com]">This version saw more tickets opened and, most importantly, closed than any other version of WordPress before.</a>  The closed tickets are almost 800 at this moment. — All in all, WordPress 2.8 is a <em>better</em> tool than WordPress 2.7.</p>

<p>A NOTE ON COMPATIBILITY</p>

<p>In general, backward compatibility seems good.  With two exceptions (one theme that broke itself and another that broke WordPress) all themes I’ve tried work well.  Same with plugins:  A few have problems but most work well.  If it is any indication, <a href="http://op111.net/about/plugins-used" title="WordPress plugins used in op111.net [op111.net]">of the plugins used in op111.net</a> only one explicitly supports WP 2.8 at this moment;  yet, all work without problems.  (op111.net has been running on development snapshots of v.&nbsp;2.8 since March.)</p>

<p>On to what’s new, in alphabetical order&hellip;</p>

<h3>Accessibility improvements</h3>

<p>WordPress 2.8 brings several improvements, big and small, to accessibility.  A lot of work went into two areas in particular:</p>

<ol>
<li>Adding labels and alternative text to input elements that did not have them.</li>
<li>Making the functionality of the new Widgets UI (more on that later) fully available without JavaScript.</li>
</ol>

<h3>Authentication: more pluggable</h3>

<p>The authentication mechanism is now improved, so that authentication methods like OpenID and authorization methods like <abbr title="An Open protocol for secure Authorization">OAuth</abbr> can cooperate easier with it (without replacing it and then having to deal with other issues).  Read more:</p>

<ul>
<li><a href="http://willnorris.com/2009/03/authentication-in-wordpress-28" title="What is new in WorPress 2.8 authentication, by Will Norris [willnorris.com]">Authentication in WordPress 2.8 — Will Norris</a></li>
<li><a href="http://core.trac.wordpress.org/ticket/8938" title="[core.trac.wordpress.org]">#8938 (Use new filter for extending WordPress authentication) – WordPress Trac</a></li>
</ul>

<p>Improvements in this area also pave the way for <abbr title="An Open protocol for secure Authorization">OAuth</abbr> support in the core (which will probably come in ver.&nbsp;2.9).</p>

<h3>Columnification and pagination in Screen Options</h3>

<p>Screen Options has two new options, depending on the type of screen:</p>

<ol>
<li>Number of columns</li>
<li>Number of items per page</li>
</ol>

<p><a href="http://op111.net/wp-content/uploads/2009/05/wp28-screen-options-1.png" rel="lightbox[71]" title="WordPress 2.8, Option to select number of columns in Dashboard"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-screen-options-1-160x120.png" alt="WordPress 2.8, Option to select number of columns in Dashboard" title="WordPress 2.8, Option to select number of columns in Dashboard" width="160" height="120" class="alignnone size-medium wp-image-602" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-screen-options-2.png" rel="lightbox[71]" title="WordPress 2.8, Option to select number of columns in the Edit Post screen"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-screen-options-2-160x120.png" alt="WordPress 2.8, Option to select number of columns in the Edit Post screen" title="WordPress 2.8, Option to select number of columns in the Edit Post screen" width="160" height="120" class="alignnone size-medium wp-image-603" /> </a><a href="http://op111.net/wp-content/uploads/2009/05/wp28-screen-options-3.png" rel="lightbox[71]" title="WordPress 2.8, Option to select number of displayed items in Edit Pages"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-screen-options-3-160x120.png" alt="WordPress 2.8, Option to select number of displayed items in Edit Pages" title="WordPress 2.8, Option to select number of displayed items in Edit Pages" width="160" height="120" class="alignnone size-medium wp-image-604" /></a></p>

<p>Items per page is the one I’ve found more useful, but I can imagine columnification would be very useful too in some situations, e.g. on a netbook with an 800×480 display.</p>

<h3>CSS: new dynamic classes with <code>body_class()</code></h3>

<p>Dynamic CSS classes were first brought to WordPress by the innovative <a href="http://www.plaintxt.org/themes/sandbox/" title="Sandbox, a theme for WordPress [plaintxt.org]">Sandbox</a> of Scott Wallick and Andy Skelton, offering a simple way to modify to any extend the appearance of a WordPress site by CSS alone.  They offer possibilities that would otherwise require JavaScript or PHP.</p>

<p>WordPress 2.7 added dynamic CSS classes for the post div(ision).  Version&nbsp;2.8 adds dynamic classes for the body element too.  Both implementations were based on Sandbox.</p>

<p><em>For theme authors</em>.  To add this to a theme, simply open the <code>body</code> element like so:</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;body <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #7f7f00;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'body_class'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> body_class<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&gt;</pre></div></div>


<p>More on the <code>body_class()</code> function:</p>

<ul>
<li><a href="http://www.nathanrice.net/blog/wordpress-2-8-and-the-body_class-function/" title="Nathan Rice on dynamic CCS classes in WordPress 2.8 [nathanrice.net]">WordPress 2.8 and the body_class() function — Nathan Rice</a></li>
</ul>

<h3>Feed links for everything</h3>

<p>WordPress 2.8 automatically adds feed links specific to the page viewed.  For example, when you view the archive of the category Cooking, it adds a feed link for that category.  When you view the archive for author Cyrus, it adds a feed link for that author, etc.:</p>

<p><a href="http://op111.net/wp-content/uploads/2009/05/wp28-feed-links.png" rel="lightbox[71]" title="Automatic autodiscoverable feed links in WordPress 2.8"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-feed-links-160x128.png" alt="Automatic autodiscoverable feed links in WordPress 2.8" title="Automatic autodiscoverable feed links in WordPress 2.8" width="160" height="128" class="alignnone size-medium wp-image-596" /></a></p>

<p><em>For theme authors</em>.  The two main feed links—all posts and all comments—are not added automatically.  To let WP add them too, put the <code>automatic_feed_links()</code> function (defined in <a href="http://core.trac.wordpress.org/browser/trunk/wp-includes/general-template.php" title="wp-includes/general-template.php at the WordPress code repository [core.trac.wordpress.org]">general-template.php</a>) in your functions.php.</p>

<p><em>Note</em>.  <a href="http://scribu.net/wordpress/extra-feed-links/" title="A WordPress plugin for extra autodiscoverable feed links [scribu.net]">Extra Feed Links</a>, a plugin by scribu, adds the same functionality to earlier WP versions.</p>

<h3>JavaScript at the bottom</h3>

<p>JavaScript files properly registered via the appropriate script <abbr title="Application Programming Interface">API</abbr> can now be placed at the bottom of the page.  In most cases this is preferable, because JavaScript blocks parallel downloads (browsers need to evaluate it before proceeding) and can delay the time by which a page is usable and also the time by which the rendering is complete.  So, unless a JavaScript file needs to be at the top, it can be moved to the bottom for better performance.</p>

<p><em>For plugin/theme authors</em>.  This is done with a new optional argument in the <code>wp_enqueue_script()</code> function.  The argument defaults to “false” (<em>not</em> in the footer). To put a script in the footer, set it to “true”.  E.g.:</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">wp_enqueue_script<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'script_handle'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'script/url/file.js'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<p>More:</p>

<ul>
<li><a href="http://wpdevel.wordpress.com/2009/02/06/script-loader-updates/" title="[wpdevel.wordpress.com]">Script loader updates « WordPress Development Updates</a></li>
<li><a href="http://lesterchan.net/wordpress/2009/01/26/loading-javascript-in-footer-in-wordpress-28/" title="[lesterchan.net]">Loading JavaScript In Footer In WordPress 2.8 « Lester Chan’s WordPress Plugins</a></li>
</ul>

<h3>LiveJournal Importer: Redone and improved</h3>

<p>Importing a LiveJournal blog into a WordPress 2.8 blog is easier and more complete thanks to the rewritten LiveJournal Importer, which uses the LiveJournal <abbr title="Application Programming Interface">API</abbr>.  Read more:</p>

<ul>
<li><a href="http://dentedreality.com.au/2009/02/livejournal-importer-for-wordpress/" title="The new LivJournal Importer for WordPress [dentedreality.com.au]">The All-New LiveJournal Importer for WordPress « Dented Reality</a></li>
</ul>

<h3>Minification and concatenation of CSS and JS&hellip;</h3>

<p>&hellip; or, <em>faster admin pages</em>.</p>

<p>Most CSS and JavaScript files in the administration area are now concatenated (chained together into one file) and, depending on the server setup, compressed too.  Javascript files are also minified.  Using minification, concatenation and compression improves performance in two ways:</p>

<ol>
<li>The total size of files to get is reduced.</li>
<li>The browser requests fewer files from the server.</li>
</ol>

<p>This kind of optimization could prove even more beneficial to the frontend (the public part of a website).  Of course, things can become more complex there, but the current impementation could serve as a testing ground for applying something similar to the frontend at a later time.</p>

<p><em>What is minification?</em>  Minification is the practice of removing from a file bits useful to humans but unneeded for machine execution, like comments, spaces, line breaks and indentation.  On the web it is used mainly for CSS and JS files, to reduce the amount of bytes sent from the server to the browser.</p>

<h3>Plugin Installer</h3>

<p>The plugin browser/installer was first introduced in the previous version, six months ago.  I’m including it here for two reasons:</p>

<ol>
<li>It seems it’s not very well known yet&hellip;</li>
<li>It’s been improved in v. 2.8.  In the meantime, the search mechanism of wordpress.org was improved too, and now the whole system works much better.</li>
</ol>

<p>Here is how to install a plugin in the new way:</p>

<p><a href="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-1.png" rel="lightbox[71]" title="Installing a plugin in WordPress 2.8, Step 1"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-1-160x120.png" alt="Installing a plugin in WordPress 2.8, Step 1" title="Installing a plugin in WordPress 2.8, Step 1" width="160" height="120" class="alignnone size-medium wp-image-606" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-2.png" rel="lightbox[71]" title="Installing a plugin in WordPress 2.8, Step 2"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-2-160x120.png" alt="Installing a plugin in WordPress 2.8, Step 2" title="Installing a plugin in WordPress 2.8, Step 2" width="160" height="120" class="alignnone size-medium wp-image-607" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-3.png" rel="lightbox[71]" title="Installing a plugin in WordPress 2.8, Step 3"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-3-160x120.png" alt="Installing a plugin in WordPress 2.8, Step 3" title="Installing a plugin in WordPress 2.8, Step 3" width="160" height="120" class="alignnone size-medium wp-image-608" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-4.png" rel="lightbox[71]" title="Installing a plugin in WordPress 2.8, Step 4"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-4-160x120.png" alt="Installing a plugin in WordPress 2.8, Step 4" title="Installing a plugin in WordPress 2.8, Step 4" width="160" height="120" class="alignnone size-medium wp-image-609" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-5.png" rel="lightbox[71]" title="Installing a plugin in WordPress 2.8, Step 5"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-5-160x120.png" alt="Installing a plugin in WordPress 2.8, Step 5" title="Installing a plugin in WordPress 2.8, Step 5" width="160" height="120" class="alignnone size-medium wp-image-610" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-6.png" rel="lightbox[71]" title="Installing a plugin in WordPress 2.8, Done!"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-plugin-install-6-160x120.png" alt="Installing a plugin in WordPress 2.8, Done!" title="Installing a plugin in WordPress 2.8, Done!" width="160" height="120" class="alignnone size-medium wp-image-605" /></a></p>

<h3>Plugins management</h3>

<p>The plugins manager was retouched, and is still being worked on at this writing.  It now offers views/filters by plugin state, which I’ve found to be very convenient:</p>

<p><a href="http://op111.net/wp-content/uploads/2009/05/wp28-plugins-manage.png" rel="lightbox[71]" title="WordPress 2.8, Plugins management"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-plugins-manage-160x120.png" alt="WordPress 2.8, Plugins management" title="WordPress 2.8, Plugins management" width="160" height="120" class="alignnone size-medium wp-image-611" /></a></p>

<h3>Pretty permalinks for IIS 7</h3>

<p>IIS 7, the current version of the Microsoft web server, recently got an official rewrite module and can now do URL rewriting like Apache does.  WordPress 2.8 detects if the server is IIS 7 <em>with</em> the rewrite module and offers the option to use fully pretty permalinks with IIS 7 too — not just the semi-pretty ones with <em>index.php</em> in the middle.  Read more:</p>

<ul>
<li><a href="http://blogs.iis.net/ruslany/archive/2009/05/16/iis-7-url-rewrite-module-support-in-wordpress-2-8.aspx" title="[blogs.iis.net]">IIS 7 URL Rewrite Module support in WordPress 2.8 : Ruslan’s Blog : The Official Microsoft IIS Site</a></li>
</ul>

<h3>Proxy support</h3>

<p>Easy proxy support (without editing core files) had been missing from WordPress and was a frequent request.  Now it is part of the WordPress HTTP <abbr title="Application Programming Interface">API</abbr>.  You enable it by defining a few constants in wp-config.php.</p>

<p>The documentation for this, along with an example, can for now be found in the file <a href="http://core.trac.wordpress.org/browser/trunk/wp-includes/http.php" title="wp-includes/http.php at the WordPress code repository [core.trac.wordpress.org]">wp-includes/http.php</a> (look for the <code>WP_HTTP_Proxy</code> class).</p>

<h3>Quotation marks locale-aware</h3>

<p>WordPress has a smart typography filter that, among other things, replaces ASCII quotes—&quot;like these&quot;—with proper quotation marks “like these”.  Before v.&nbsp;2.8 this filter only knew about quotation marks as used in American English.</p>

<p>Now translators can specify the appropriate quotation marks for a language, and, if you use a localized version, they will be used instead.  For example, «αβγδ» for Greek, „abcd“ for German, and so on and so forth.</p>

<h3>Relational navigation links</h3>

<p>A relational link in an HTML document points to another document and states its relation with the current document.  Examples of such links that are used for navigation are “prev” (previous in a series) and “index” (index for current).  Browsers can use them to offer an interface for navigation, much like they do when they show an icon/menu in the URL address bar for the feed links in a document.</p>

<p>WordPress 2.8 generates four types of relational navigation links:  home, index, prev, next.  If your browser supports such links (not many do, at least natively), you’ll be seeing them more often as WordPress sites upgrade to v. 2.8:</p>

<p><a href="http://op111.net/wp-content/uploads/2009/05/wp28-nav-links.png" rel="lightbox[71]" title="Relational navigation links in WordPress 2.8"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-nav-links-160x120.png" alt="Relational navigation links in WordPress 2.8" title="Relational navigation links in WordPress 2.8" width="160" height="120" class="alignnone size-medium wp-image-590" /></a></p>

<p>An interesting possibility of relational links is that browsers can also use them as hints to prefetch (predownload) a page, cache it, and then serve it from the cache, for better speed.  Firefox—<a href="http://stevesouders.com/ua/" title="UA Profiler: A community-driven project for gathering browser performance characteristics [stevesouders.com]">the only browser that does link prefetching currently</a>—<a href="https://developer.mozilla.org/en/Link_prefetching_FAQ" title="Link Prefetching FAQ at the Mozilla Developer Documentation [developer.mozilla.org]">does this with relational links of the type <code>next</code></a>. (I have not been able to verify if it works in WordPress sites.)</p>

<h3>Smilies:  Now faster!</h3>

<p>Version 2.8 cuts in half the time needed to convert text smilies to image smilies!&nbsp;:-o  The faster code is also availabe as a plugin for WordPress 2.7:  <a href="http://devel.kostdoktorn.se/faster-smilies/" title="Homepage of Faster Smilies, a plugin for WordPress [devel.kostdoktorn.se]">Faster Smilies</a></p>

<p>(Of course, you can always turn graphical smilies off in Settings › Writing › Formatting, and WordPress will be even faster!)</p>

<h3>Theme Installer</h3>

<p>Installing themes in v.&nbsp;2.8 is as quick and easy as installing plugins is in v.&nbsp;2.7:</p>

<p><a href="http://op111.net/wp-content/uploads/2009/05/wp28-theme-installer-1.png" rel="lightbox[71]" title="Installing themes in WordPress 2.8, Step 1"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-theme-installer-1-160x120.png" alt="Installing themes in WordPress 2.8, Step 1" title="Installing themes in WordPress 2.8, Step 1" width="160" height="120" class="alignnone size-medium" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-theme-installer-2.png" rel="lightbox[71]" title="Installing themes in WordPress 2.8, Step 2"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-theme-installer-2-160x120.png" alt="Installing themes in WordPress 2.8, Step 2" title="Installing themes in WordPress 2.8, Step 2" width="160" height="120" class="alignnone size-medium" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-theme-installer-3.png" rel="lightbox[71]" title="Installing themes in WordPress 2.8, Step 3"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-theme-installer-3-160x120.png" alt="Installing themes in WordPress 2.8, Step 3" title="Installing themes in WordPress 2.8, Step 3" width="160" height="120" class="alignnone size-medium" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-theme-installer-4.png" rel="lightbox[71]" title="Installing themes in WordPress 2.8, Step 4"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-theme-installer-4-160x120.png" alt="Installing themes in WordPress 2.8, Step 4" title="Installing themes in WordPress 2.8, Step 4" width="160" height="120" class="alignnone size-medium" /></a></p>

<h3>Theme/Plugin Editor with highlighting and lookup</h3>

<p>I was never fond of this feature of WP:  I don’t see any need for it and I also think that it encourages bad habits.  But others like it.  They’ll be happy to know that the theme/plugin editor is now improved, with syntax highlighting and function lookup:</p>

<p><a href="http://op111.net/wp-content/uploads/2009/05/wp28-theme-plugin-editor.png" rel="lightbox[71]" title="Theme/Plugin Editor in WordPress 2.8"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-theme-plugin-editor-160x120.png" alt="Theme/Plugin Editor in WordPress 2.8" title="Theme/Plugin Editor in WordPress 2.8" width="160" height="120" class="alignnone size-medium wp-image-589" /></a></p>

<p><em>Note</em>.  In Chrome and Safari you’ll see the plain old text area without fancy colours.  These two browsers (that share the same rendering engine) are not supported at the moment.</p>

<h3>Timezone selection and DST</h3>

<p>Settings › General had been displaying for a long time this apologetic message:</p>

<blockquote>
  <p>Unfortunately, you have to manually update this for Daylight Savings Time.
    Lame, we know, but will be fixed in the future.</p>
</blockquote>

<p>Well, the future is here! :-D  Now you only need to enter your location:</p>

<p><a href="http://op111.net/wp-content/uploads/2009/05/wp28-timezone-dst.png" rel="lightbox[71]" title="WordPress 2.8 adjusts to DST automatically"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-timezone-dst-160x80.png" alt="WordPress 2.8 adjusts to DST automatically" title="WordPress 2.8 adjusts to DST automatically" width="160" height="80" class="alignnone size-medium wp-image-588" /></a></p>

<p><em>Note</em>.  Automatic DST adjustment uses functions that were introduced in version 5.1.0 of PHP.  So, you won’t see it if your server has an older version.  (The minimum requirement to use WordPress remains PHP 4.3.)</p>

<ul>
<li><a href="http://ottodestruct.com/blog/wordpress-plugins/automatic-timezone/" title="Automatic timezone and DST adjustment for WordPress 2.5, 2.6 and 2.7 [ottodestruct.com]">Automatic Timezone</a> is the plugin on which this enchancement was based.  It adds the same functionality to WordPress 2.5, 2.6 and 2.7.</li>
</ul>

<h3>Widgets <abbr title="Application Programming Interface">API</abbr>: new and multiple-instance</h3>

<p>Another part rewritten in v. 2.8 is the Widgets <abbr title="Application Programming Interface">API</abbr>.  Writing widgets is now simpler and, importantly, widgets based on the new <abbr title="Application Programming Interface">API</abbr> are multiple-instance by default, like the Text/HTML widget in previous versions.  (Writing multiple-instance widgets was already possible but convoluted.)  Read more in this announcement by Ryan Boren:</p>

<ul>
<li><a href="http://groups.google.com/group/wp-hackers/browse_thread/thread/25dd6a6424b71fcb" title="New Widgets API on the wp-hackers list, by Ryan Boren [groups.google.com]">New Widgets <abbr title="Application Programming Interface">API</abbr> - wp-hackers | Google Groups</a></li>
</ul>

<p>As a bonus, the new function <code>the_widget()</code> lets you display the output of a widget anywhere in a template.</p>

<h3>Widgets management UI: Redone, much improved</h3>

<p>This took a lot of work and is, in my estimation, the most important improvement in the user interface of WordPress 2.8.</p>

<p>The new Widgets manager:</p>

<ol>
<li>Does everything by simple drag ’n’ drop (and is fully functional without JavaScript too).</li>
<li>Has better memory/storage:  You can deactivate a widget without losing its configuration, and widgets that are deactivated automatically retain their configurations too.</li>
</ol>

<p>Also, thanks to the new Widgets <abbr title="Application Programming Interface">API</abbr>, widgets can now have multiple instances.  You can add a widget as many times as you wish.</p>

<p>See the screenshots:</p>

<p><a href="http://op111.net/wp-content/uploads/2009/05/wp28-widgets-1-overview.png" rel="lightbox[71]" title="Widgets management in WordPress 2.8, Overview"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-widgets-1-overview-160x120.png" alt="Widgets management in WordPress 2.8, Overview" title="Widgets management in WordPress 2.8, Overview" width="160" height="120" class="alignnone size-medium wp-image-598" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-widgets-2-help.png" rel="lightbox[71]" title="Widgets management in WordPress 2.8, Contextual help"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-widgets-2-help-160x120.png" alt="Widgets management in WordPress 2.8, Contextual help" title="Widgets management in WordPress 2.8, Contextual help" width="160" height="120" class="alignnone size-medium wp-image-599" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-widgets-3-drag.png" rel="lightbox[71]" title="Widgets management in WordPress 2.8, Drag ’n’ Drop"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-widgets-3-drag-160x120.png" alt="Widgets management in WordPress 2.8, Drag ’n’ Drop" title="Widgets management in WordPress 2.8, Drag ’n’ Drop" width="160" height="120" class="alignnone size-medium wp-image-600" /></a> <a href="http://op111.net/wp-content/uploads/2009/05/wp28-widgets-4-inactive.png" rel="lightbox[71]" title="Widgets management in WordPress 2.8, Inactive Widgets area"><img src="http://op111.net/wp-content/uploads/2009/05/wp28-widgets-4-inactive-160x120.png" alt="Widgets management in WordPress 2.8, Inactive Widgets area" title="Widgets management in WordPress 2.8, Inactive Widgets area" width="160" height="120" class="alignnone size-medium wp-image-601" /></a></p>

<h3>That was it!</h3>

<p>If you think I left out some important feature, please leave a comment to say so.  If you want to try test versions of WordPress 2.8 as they come out, watch the official blog:  <a href="http://wordpress.org/development/" title="The official WordPress blog [wordpress.org]">wordpress.org/development</a> — Usual warnings apply, of course:  This is not a final product!  Do <strong>not</strong> install on a live website unless you are prepared to spend time investigating and reporting bugs!</p>

<p><em>Note</em>.  The menu icons on the screenshots are not the default ones.  <a href="http://op111.net/65" title="Tangofy: Better admin menu icons for WordPress 2.7 and 2.8 [op111.net]">If you like them, you can have them too!</a></p>

<p>Thanks for reading!</p>

<p>/δκ</p>

<h3>Changes</h3>

<ul>
<li>2009-06-18.  Added <code>function_exists</code> condition to <code>body_class</code> example.</li>
<li>2009-06-11.  Locale-aware quotation marks by <code>wptexturize</code>.</li>
<li>2009-06-02.  Link to <a href="http://groups.google.com/group/wp-hackers/browse_thread/thread/73238e6074c60218" title="New milestone: 10000 tickets, by Xavier Borderie at the wp-hackers list [groups.google.com]">X. Borderie on 10.000 tickets and 2.8 dev stats</a>.  Link to <a href="http://ottodestruct.com/blog/wordpress-plugins/automatic-timezone/" title="Automatic timezone and DST adjustment for WordPress 2.5, 2.6 and 2.7 [ottodestruct.com]">Automatic Timezone</a>.</li>
<li>2009-06-01.  Link to <a href="http://www.nathanrice.net/blog/wordpress-2-8-and-the-body_class-function/" title="Nathan Rice on dynamic CCS classes in WordPress 2.8 [nathanrice.net]">N. Rice on the <code>body_class()</code> function</a>.</li>
</ul>

<!--ABBREVIATIONS............................................................-->

<!--URIs.....................................................................-->

<!--

*   Latitude and longitude

*   LINKS TO ADD
    *   http://justintadlock.com/archives/2009/05/26/the-complete-guide-to-creating-widgets-in-wordpress-28
    *   http://perishablepress.com/press/2009/05/26/dynamic-body-class-id-php-wordpress/
    *   http://pressedwords.com/stuff-new-in-wp-2-8-for-coders/

*   Tags
*   Taxonomies : Custom
    *   http://justintadlock.com/archives/2009/05/06/custom-taxonomies-in-wordpress-28
    *   http://core.trac.wordpress.org/changeset/10557
*   wptexturize.  Quotation marks per locale.
*   Escaping API.  http://markjaquith.wordpress.com/2009/06/12/escaping-api-updates-for-wordpress-2-8/
*   jQuery

..-->

<p>RELATED</p>

<ul><li><a href="http://op111.net/63" rel="bookmark" title="3 Nov 2008">WordPress 2.7: Ten useful new features</a></li>

<li><a href="http://op111.net/76" rel="bookmark" title="7 Jun 2010">WordPress 3.0: What’s new</a></li>

<li><a href="http://op111.net/74" rel="bookmark" title="8 Jan 2010">Progressive enhancement of drop-down menus with the :not CSS selector</a></li>

<li><a href="http://op111.net/73" rel="bookmark" title="31 Dec 2009">Page Lists Plus: Comprehensive control of your WordPress page menu</a></li>
</ul>

<!-- Similar Posts took 15.117 ms -->
<!-- PHP 5.x --><hr />
<p>Add to <a title="Bookmark in del.icio.us" href="http://del.icio.us/post?url=http://op111.net/71&title=WordPress 2.8: What’s new">del.icio.us</a></p>
<hr />
<p>© 2009 <a href="http://op111.net">op111.net</a> | <a href="http://op111.net/71">Permalink</a></p> ]]></content:encoded>
			<wfw:commentRss>http://op111.net/71/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>
