<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[33366] trunk: Customizer: Introduce `customize_nav_menu_available_item_types` and `customize_nav_menu_available_items` filters.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/33366">33366</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/33366","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>westonruter</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2015-07-22 20:28:03 +0000 (Wed, 22 Jul 2015)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Customizer: Introduce `customize_nav_menu_available_item_types` and `customize_nav_menu_available_items` filters.

Allows for new available menu item types/objects to be registered in addition to filtering the available items that are returned for each menu item type/object.

Props valendesigns, imath, westonruter.
See <a href="https://core.trac.wordpress.org/ticket/32832">#32832</a>.
Fixes <a href="https://core.trac.wordpress.org/ticket/32708">#32708</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminjscustomizenavmenusjs">trunk/src/wp-admin/js/customize-nav-menus.js</a></li>
<li><a href="#trunksrcwpincludesclasswpcustomizecontrolphp">trunk/src/wp-includes/class-wp-customize-control.php</a></li>
<li><a href="#trunksrcwpincludesclasswpcustomizenavmenusphp">trunk/src/wp-includes/class-wp-customize-nav-menus.php</a></li>
<li><a href="#trunksrcwpincludesclasswpcustomizesettingphp">trunk/src/wp-includes/class-wp-customize-setting.php</a></li>
<li><a href="#trunktestsphpunittestsajaxCustomizeMenusphp">trunk/tests/phpunit/tests/ajax/CustomizeMenus.php</a></li>
<li><a href="#trunktestsphpunittestscustomizenavmenuitemsettingphp">trunk/tests/phpunit/tests/customize/nav-menu-item-setting.php</a></li>
<li><a href="#trunktestsphpunittestscustomizenavmenusphp">trunk/tests/phpunit/tests/customize/nav-menus.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminjscustomizenavmenusjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/js/customize-nav-menus.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/js/customize-nav-menus.js      2015-07-22 18:55:27 UTC (rev 33365)
+++ trunk/src/wp-admin/js/customize-nav-menus.js        2015-07-22 20:28:03 UTC (rev 33366)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -18,10 +18,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        // Link settings.
</span><span class="cx" style="display: block; padding: 0 10px">        api.Menus.data = {
</span><span class="cx" style="display: block; padding: 0 10px">                nonce: '',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                itemTypes: {
-                       taxonomies: {},
-                       postTypes: {}
-               },
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         itemTypes: [],
</ins><span class="cx" style="display: block; padding: 0 10px">                 l10n: {},
</span><span class="cx" style="display: block; padding: 0 10px">                menuItemTransport: 'postMessage',
</span><span class="cx" style="display: block; padding: 0 10px">                phpIntMax: 0,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -280,35 +277,29 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        var self = this;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        // Render the template for each item by type.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        _.each( api.Menus.data.itemTypes, function( typeObjects, type ) {
-                               _.each( typeObjects, function( typeObject, slug ) {
-                                       if ( 'postTypes' === type ) {
-                                               type = 'post_type';
-                                       } else if ( 'taxonomies' === type ) {
-                                               type = 'taxonomy';
-                                       }
-                                       self.pages[ slug ] = 0; // @todo should prefix with type
-                                       self.loadItems( slug, type );
-                               } );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 _.each( api.Menus.data.itemTypes, function( itemType ) {
+                               self.pages[ itemType.type + ':' + itemType.object ] = 0;
+                               self.loadItems( itemType.type, itemType.object ); // @todo we need to combine these Ajax requests.
</ins><span class="cx" style="display: block; padding: 0 10px">                         } );
</span><span class="cx" style="display: block; padding: 0 10px">                },
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Load available menu items.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                loadItems: function( type, obj_type ) {
-                       var self = this, params, request, itemTemplate;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         loadItems: function( type, object ) {
+                       var self = this, params, request, itemTemplate, availableMenuItemContainer;
</ins><span class="cx" style="display: block; padding: 0 10px">                         itemTemplate = wp.template( 'available-menu-item' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( 0 > self.pages[ type ] ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( -1 === self.pages[ type + ':' + object ] ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 return;
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $( '#available-menu-items-' + type + ' .accordion-section-title' ).addClass( 'loading' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 availableMenuItemContainer = $( '#available-menu-items-' + type + '-' + object );
+                       availableMenuItemContainer.find( '.accordion-section-title' ).addClass( 'loading' );
</ins><span class="cx" style="display: block; padding: 0 10px">                         self.loading = true;
</span><span class="cx" style="display: block; padding: 0 10px">                        params = {
</span><span class="cx" style="display: block; padding: 0 10px">                                'customize-menus-nonce': api.Menus.data.nonce,
</span><span class="cx" style="display: block; padding: 0 10px">                                'wp_customize': 'on',
</span><span class="cx" style="display: block; padding: 0 10px">                                'type': type,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'obj_type': obj_type,
-                               'page': self.pages[ type ]
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'object': object,
+                               'page': self.pages[ type + ':' + object ]
</ins><span class="cx" style="display: block; padding: 0 10px">                         };
</span><span class="cx" style="display: block; padding: 0 10px">                        request = wp.ajax.post( 'load-available-menu-items-customizer', params );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -316,23 +307,23 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                var items, typeInner;
</span><span class="cx" style="display: block; padding: 0 10px">                                items = data.items;
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( 0 === items.length ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        if ( 0 === self.pages[ type ] ) {
-                                               $( '#available-menu-items-' + type )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 if ( 0 === self.pages[ type + ':' + object ] ) {
+                                               availableMenuItemContainer
</ins><span class="cx" style="display: block; padding: 0 10px">                                                         .addClass( 'cannot-expand' )
</span><span class="cx" style="display: block; padding: 0 10px">                                                        .removeClass( 'loading' )
</span><span class="cx" style="display: block; padding: 0 10px">                                                        .find( '.accordion-section-title > button' )
</span><span class="cx" style="display: block; padding: 0 10px">                                                        .prop( 'tabIndex', -1 );
</span><span class="cx" style="display: block; padding: 0 10px">                                        }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        self.pages[ type ] = -1;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 self.pages[ type + ':' + object ] = -1;
</ins><span class="cx" style="display: block; padding: 0 10px">                                         return;
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px">                                items = new api.Menus.AvailableItemCollection( items ); // @todo Why is this collection created and then thrown away?
</span><span class="cx" style="display: block; padding: 0 10px">                                self.collection.add( items.models );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                typeInner = $( '#available-menu-items-' + type + ' .accordion-section-content' );
-                               items.each(function( menu_item ) {
-                                       typeInner.append( itemTemplate( menu_item.attributes ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         typeInner = availableMenuItemContainer.find( '.accordion-section-content' );
+                               items.each(function( menuItem ) {
+                                       typeInner.append( itemTemplate( menuItem.attributes ) );
</ins><span class="cx" style="display: block; padding: 0 10px">                                 });
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                self.pages[ type ] = self.pages[ type ] + 1;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         self.pages[ type + ':' + object ] += 1;
</ins><span class="cx" style="display: block; padding: 0 10px">                         });
</span><span class="cx" style="display: block; padding: 0 10px">                        request.fail(function( data ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                if ( typeof console !== 'undefined' && console.error ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -340,7 +331,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px">                        });
</span><span class="cx" style="display: block; padding: 0 10px">                        request.always(function() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $( '#available-menu-items-' + type + ' .accordion-section-title' ).removeClass( 'loading' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         availableMenuItemContainer.find( '.accordion-section-title' ).removeClass( 'loading' );
</ins><span class="cx" style="display: block; padding: 0 10px">                                 self.loading = false;
</span><span class="cx" style="display: block; padding: 0 10px">                        });
</span><span class="cx" style="display: block; padding: 0 10px">                },
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1275,7 +1266,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        control.params.el_classes = containerClasses.join( ' ' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        control.params.item_type_label = api.Menus.getTypeLabel( settingValue.type, settingValue.object );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 control.params.item_type_label = settingValue.type_label;
</ins><span class="cx" style="display: block; padding: 0 10px">                         control.params.item_type = settingValue.type;
</span><span class="cx" style="display: block; padding: 0 10px">                        control.params.url = settingValue.url;
</span><span class="cx" style="display: block; padding: 0 10px">                        control.params.target = settingValue.target;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2552,36 +2543,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">        };
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * Given a menu item type & object, get the label associated with it.
-        *
-        * @param {string} type
-        * @param {string} object
-        * @return {string}
-        */
-       api.Menus.getTypeLabel = function( type, object ) {
-               var label,
-                       data = api.Menus.data;
-
-               if ( 'post_type' === type ) {
-                       if ( data.itemTypes.postTypes[ object ] ) {
-                               label = data.itemTypes.postTypes[ object ].label;
-                       } else {
-                               label = data.l10n.postTypeLabel;
-                       }
-               } else if ( 'taxonomy' === type ) {
-                       if ( data.itemTypes.taxonomies[ object ] ) {
-                               label = data.itemTypes.taxonomies[ object ].label;
-                       } else {
-                               label = data.l10n.taxonomyTermLabel;
-                       }
-               } else {
-                       label = data.l10n.custom_label;
-               }
-
-               return label;
-       };
-
-       /**
</del><span class="cx" style="display: block; padding: 0 10px">          * Given a menu item ID, get the control associated with it.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @param {string} menuItemId
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpcustomizecontrolphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-customize-control.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-customize-control.php      2015-07-22 18:55:27 UTC (rev 33365)
+++ trunk/src/wp-includes/class-wp-customize-control.php        2015-07-22 20:28:03 UTC (rev 33366)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1739,7 +1739,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        </p>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        <div class="menu-item-actions description-thin submitbox">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                <# if ( 'custom' != data.item_type && '' != data.original_title ) { #>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         <# if ( ( 'post_type' === data.item_type || 'taxonomy' === data.item_type ) && '' !== data.original_title ) { #>
</ins><span class="cx" style="display: block; padding: 0 10px">                                 <p class="link-to-original">
</span><span class="cx" style="display: block; padding: 0 10px">                                        <?php printf( __( 'Original: %s' ), '<a class="original-link" href="{{ data.url }}">{{ data.original_title }}</a>' ); ?>
</span><span class="cx" style="display: block; padding: 0 10px">                                </p>
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpcustomizenavmenusphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-customize-nav-menus.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-customize-nav-menus.php    2015-07-22 18:55:27 UTC (rev 33365)
+++ trunk/src/wp-includes/class-wp-customize-nav-menus.php      2015-07-22 20:28:03 UTC (rev 33366)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -75,14 +75,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        wp_die( -1 );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( empty( $_POST['obj_type'] ) || empty( $_POST['type'] ) ) {
-                       wp_send_json_error( 'nav_menus_missing_obj_type_or_type_parameter' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( empty( $_POST['type'] ) || empty( $_POST['object'] ) ) {
+                       wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $obj_type = sanitize_key( $_POST['obj_type'] );
-               $obj_name = sanitize_key( $_POST['type'] );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $type = sanitize_key( $_POST['type'] );
+               $object = sanitize_key( $_POST['object'] );
</ins><span class="cx" style="display: block; padding: 0 10px">                 $page = empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $items = $this->load_available_items_query( $obj_type, $obj_name, $page );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $items = $this->load_available_items_query( $type, $object, $page );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( is_wp_error( $items ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        wp_send_json_error( $items->get_error_code() );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -97,21 +97,21 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 4.3.0
</span><span class="cx" style="display: block; padding: 0 10px">         * @access public
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param string $obj_type Optional. Accepts any custom object type and has built-in support for
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param string $type   Optional. Accepts any custom object type and has built-in support for
</ins><span class="cx" style="display: block; padding: 0 10px">          *                         'post_type' and 'taxonomy'. Default is 'post_type'.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * @param string $obj_name Optional. Accepts any registered taxonomy or post type name. Default is 'page'.
-        * @param int    $page     Optional. The page number used to generate the query offset. Default is '0'.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+  * @param string $object Optional. Accepts any registered taxonomy or post type name. Default is 'page'.
+        * @param int    $page   Optional. The page number used to generate the query offset. Default is '0'.
</ins><span class="cx" style="display: block; padding: 0 10px">          * @return WP_Error|array Returns either a WP_Error object or an array of menu items.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        public function load_available_items_query( $obj_type = 'post_type', $obj_name = 'page', $page = 0 ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ public function load_available_items_query( $type = 'post_type', $object = 'page', $page = 0 ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 $items = array();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( 'post_type' === $obj_type ) {
-                       if ( ! get_post_type_object( $obj_name ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( 'post_type' === $type ) {
+                       if ( ! get_post_type_object( $object ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 return new WP_Error( 'nav_menus_invalid_post_type' );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( 0 === $page && 'page' === $obj_name ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( 0 === $page && 'page' === $object ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                 // Add "Home" link. Treat as a page, but switch to custom on add.
</span><span class="cx" style="display: block; padding: 0 10px">                                $items[] = array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'id'         => 'home',
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -128,7 +128,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                'offset'      => 10 * $page,
</span><span class="cx" style="display: block; padding: 0 10px">                                'orderby'     => 'date',
</span><span class="cx" style="display: block; padding: 0 10px">                                'order'       => 'DESC',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                'post_type'   => $obj_name,
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         'post_type'   => $object,
</ins><span class="cx" style="display: block; padding: 0 10px">                         ) );
</span><span class="cx" style="display: block; padding: 0 10px">                        foreach ( $posts as $post ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $post_title = $post->post_title;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -146,8 +146,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                        'url'        => get_permalink( intval( $post->ID ) ),
</span><span class="cx" style="display: block; padding: 0 10px">                                );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                } elseif ( 'taxonomy' === $obj_type ) {
-                       $terms = get_terms( $obj_name, array(
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         } elseif ( 'taxonomy' === $type ) {
+                       $terms = get_terms( $object, array(
</ins><span class="cx" style="display: block; padding: 0 10px">                                 'child_of'     => 0,
</span><span class="cx" style="display: block; padding: 0 10px">                                'exclude'      => '',
</span><span class="cx" style="display: block; padding: 0 10px">                                'hide_empty'   => false,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -176,6 +176,18 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                /**
+                * Filter the available menu items.
+                *
+                * @since 4.3.0
+                *
+                * @param array  $items  The array of menu items.
+                * @param string $type   The object type.
+                * @param string $object The object name.
+                * @param int    $page   The current page number.
+                */
+               $items = apply_filters( 'customize_nav_menu_available_items', $items, $type, $object, $page );
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 return $items;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -588,30 +600,47 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 4.3.0
</span><span class="cx" style="display: block; padding: 0 10px">         * @access public
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *
+        * @return array The available menu item types.
</ins><span class="cx" style="display: block; padding: 0 10px">          */
</span><span class="cx" style="display: block; padding: 0 10px">        public function available_item_types() {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $items = array(
-                       'postTypes'  => array(),
-                       'taxonomies' => array(),
-               );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $item_types = array();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                foreach ( $post_types as $slug => $post_type ) {
-                       $items['postTypes'][ $slug ] = array(
-                               'label' => $post_type->labels->singular_name,
-                       );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( $post_types ) {
+                       foreach ( $post_types as $slug => $post_type ) {
+                               $item_types[] = array(
+                                       'title'  => $post_type->labels->singular_name,
+                                       'type'   => 'post_type',
+                                       'object' => $post_type->name,
+                               );
+                       }
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                foreach ( $taxonomies as $slug => $taxonomy ) {
-                       if ( 'post_format' === $taxonomy && ! current_theme_supports( 'post-formats' ) ) {
-                               continue;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( $taxonomies ) {
+                       foreach ( $taxonomies as $slug => $taxonomy ) {
+                               if ( 'post_format' === $taxonomy && ! current_theme_supports( 'post-formats' ) ) {
+                                       continue;
+                               }
+                               $item_types[] = array(
+                                       'title'  => $taxonomy->labels->singular_name,
+                                       'type'   => 'taxonomy',
+                                       'object' => $taxonomy->name,
+                               );
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $items['taxonomies'][ $slug ] = array(
-                               'label' => $taxonomy->labels->singular_name,
-                       );
</del><span class="cx" style="display: block; padding: 0 10px">                 }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                return $items;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+               /**
+                * Filter the available menu item types.
+                *
+                * @since 4.3.0
+                *
+                * @param array $item_types Custom menu item types.
+                */
+               $item_types = apply_filters( 'customize_nav_menu_available_item_types', $item_types );
+
+               return $item_types;
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -716,32 +745,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                </div>
</span><span class="cx" style="display: block; padding: 0 10px">                        </div>
</span><span class="cx" style="display: block; padding: 0 10px">                        <?php
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
-                       // @todo: consider using add_meta_box/do_accordion_section and making screen-optional?
</del><span class="cx" style="display: block; padding: 0 10px">                         // Containers for per-post-type item browsing; items added with JS.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'object' );
-                       if ( $post_types ) :
-                               foreach ( $post_types as $type ) :
-                                       ?>
-                                       <div id="available-menu-items-<?php echo esc_attr( $type->name ); ?>" class="accordion-section">
-                                               <h4 class="accordion-section-title"><?php echo esc_html( $type->label ); ?> <span class="spinner"></span> <span class="no-items"><?php _e( 'No items' ); ?></span> <button type="button" class="not-a-button"><span class="screen-reader-text"><?php _e( 'Toggle' ); ?></span></button></h4>
-                                               <ul class="accordion-section-content" data-type="<?php echo esc_attr( $type->name ); ?>" data-obj_type="post_type"></ul>
-                                       </div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 foreach ( $this->available_item_types() as $available_item_type ) {
+                               $id = sprintf( 'available-menu-items-%s-%s', $available_item_type['type'], $available_item_type['object'] );
+                               ?>
+                               <div id="<?php echo esc_attr( $id ); ?>" class="accordion-section">
+                                       <h4 class="accordion-section-title"><?php echo esc_html( $available_item_type['title'] ); ?> <span class="no-items"><?php _e( 'No items' ); ?></span><span class="spinner"></span> <button type="button" class="not-a-button"><span class="screen-reader-text"><?php _e( 'Toggle' ); ?></span></button></h4>
+                                       <ul class="accordion-section-content" data-type="<?php echo esc_attr( $available_item_type['type'] ); ?>" data-object="<?php echo esc_attr( $available_item_type['object'] ); ?>"></ul>
+                               </div>
</ins><span class="cx" style="display: block; padding: 0 10px">                                 <?php
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                endforeach;
-                       endif;
-
-                       $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'object' );
-                       if ( $taxonomies ) :
-                               foreach ( $taxonomies as $tax ) :
-                                       ?>
-                                       <div id="available-menu-items-<?php echo esc_attr( $tax->name ); ?>" class="accordion-section">
-                                               <h4 class="accordion-section-title"><?php echo esc_html( $tax->label ); ?> <span class="spinner"></span> <span class="no-items"><?php _e( 'No items' ); ?></span> <button type="button" class="not-a-button"><span class="screen-reader-text"><?php _e( 'Toggle' ); ?></span></button></h4>
-                                               <ul class="accordion-section-content" data-type="<?php echo esc_attr( $tax->name ); ?>" data-obj_type="taxonomy"></ul>
-                                       </div>
-                               <?php
-                               endforeach;
-                       endif;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 }
</ins><span class="cx" style="display: block; padding: 0 10px">                         ?>
</span><span class="cx" style="display: block; padding: 0 10px">                </div><!-- #available-menu-items -->
</span><span class="cx" style="display: block; padding: 0 10px">        <?php
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpcustomizesettingphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-customize-setting.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-customize-setting.php      2015-07-22 18:55:27 UTC (rev 33365)
+++ trunk/src/wp-includes/class-wp-customize-setting.php        2015-07-22 20:28:03 UTC (rev 33366)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -968,7 +968,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        'post_title',
</span><span class="cx" style="display: block; padding: 0 10px">                        'post_type',
</span><span class="cx" style="display: block; padding: 0 10px">                        'to_ping',
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'type_label',
</del><span class="cx" style="display: block; padding: 0 10px">                 );
</span><span class="cx" style="display: block; padding: 0 10px">                foreach ( $irrelevant_properties as $property ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        unset( $this->value[ $property ] );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1143,8 +1142,25 @@
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                if ( ! isset( $post->type_label ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $post->type_label = null;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( 'post_type' === $post->type ) {
+                               $object = get_post_type_object( $post->object );
+                               if ( $object ) {
+                                       $post->type_label = $object->labels->singular_name;
+                               } else {
+                                       $post->type_label = $post->object;
+                               }
+                       } elseif ( 'taxonomy' == $post->type ) {
+                               $object = get_taxonomy( $post->object );
+                               if ( $object ) {
+                                       $post->type_label = $object->labels->singular_name;
+                               } else {
+                                       $post->type_label = $post->object;
+                               }
+                       } else {
+                               $post->type_label = __( 'Custom Link' );
+                       }
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 return $post;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunktestsphpunittestsajaxCustomizeMenusphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/ajax/CustomizeMenus.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/ajax/CustomizeMenus.php 2015-07-22 18:55:27 UTC (rev 33365)
+++ trunk/tests/phpunit/tests/ajax/CustomizeMenus.php   2015-07-22 20:28:03 UTC (rev 33366)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -122,7 +122,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                'administrator',
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'success' => false,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'data'    => 'nav_menus_missing_obj_type_or_type_parameter',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'data'    => 'nav_menus_missing_type_or_object_parameter',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -172,41 +172,41 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        // Testing empty obj_type and type.
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => '',
</del><span class="cx" style="display: block; padding: 0 10px">                                         'type'     => '',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                        'object'   => '',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'success'  => false,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'data'     => 'nav_menus_missing_obj_type_or_type_parameter',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'data'     => 'nav_menus_missing_type_or_object_parameter',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        // Testing empty obj_type.
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => '',
-                                       'type'     => 'post',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'type'     => '',
+                                       'object'   => 'post',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'success'  => false,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'data'     => 'nav_menus_missing_obj_type_or_type_parameter',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'data'     => 'nav_menus_missing_type_or_object_parameter',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        // Testing empty type.
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => '',
-                                       'type'     => 'post',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'type'     => '',
+                                       'object'   => 'post',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'success'  => false,
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'data'     => 'nav_menus_missing_obj_type_or_type_parameter',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'data'     => 'nav_menus_missing_type_or_object_parameter',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        // Testing incorrect type option.
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => 'post_type',
-                                       'type'     => 'invalid',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'type'     => 'post_type',
+                                       'object'   => 'invalid',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><span class="cx" style="display: block; padding: 0 10px">                                        'success'  => false,
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -259,29 +259,29 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return array(
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => 'post_type',
-                                       'type'     => 'post',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'type'     => 'post_type',
+                                       'object'   => 'post',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                                true,
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => 'post_type',
-                                       'type'     => 'page',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'type'     => 'post_type',
+                                       'object'   => 'page',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                                true,
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => 'post_type',
-                                       'type'     => 'custom',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'type'     => 'post_type',
+                                       'object'   => 'custom',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                                false,
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => 'taxonomy',
-                                       'type'     => 'post_tag',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'type'     => 'taxonomy',
+                                       'object'   => 'post_tag',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                                true,
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -363,20 +363,20 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return array(
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => 'post_type',
-                                       'type'     => 'post',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'type'     => 'post_type',
+                                       'object'   => 'post',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => 'post_type',
-                                       'type'     => 'page',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'type'     => 'post_type',
+                                       'object'   => 'page',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        array(
</span><span class="cx" style="display: block; padding: 0 10px">                                array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        'obj_type' => 'taxonomy',
-                                       'type'     => 'post_tag',
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                 'type'     => 'taxonomy',
+                                       'object'   => 'post_tag',
</ins><span class="cx" style="display: block; padding: 0 10px">                                 ),
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span></span></pre></div>
<a id="trunktestsphpunittestscustomizenavmenuitemsettingphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/customize/nav-menu-item-setting.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/customize/nav-menu-item-setting.php     2015-07-22 18:55:27 UTC (rev 33365)
+++ trunk/tests/phpunit/tests/customize/nav-menu-item-setting.php       2015-07-22 20:28:03 UTC (rev 33366)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -38,6 +38,20 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * Filter to add a custom menu item type label.
+        *
+        * @param object $menu_item Menu item.
+        * @return object
+        */
+       function filter_type_label( $menu_item ) {
+               if ( 'custom_type' === $menu_item->type ) {
+                       $menu_item->type_label = 'Custom Label';
+               }
+
+               return $menu_item;
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Test constants and statics.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        function test_constants() {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -206,6 +220,34 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * Test value method with a custom object.
+        *
+        * @see WP_Customize_Nav_Menu_Item_Setting::value()
+        */
+       function test_custom_type_label() {
+               do_action( 'customize_register', $this->wp_customize );
+               add_filter( 'wp_setup_nav_menu_item', array( $this, 'filter_type_label' ) );
+
+               $menu_id = wp_create_nav_menu( 'Menu' );
+               $item_id = wp_update_nav_menu_item( $menu_id, 0, array(
+                       'menu-item-type'   => 'custom_type',
+                       'menu-item-object' => 'custom_object',
+                       'menu-item-title'  => 'Cool beans',
+                       'menu-item-status' => 'publish',
+               ) );
+
+               $post = get_post( $item_id );
+               $menu_item = wp_setup_nav_menu_item( $post );
+
+               $setting_id = "nav_menu_item[$item_id]";
+               $setting = new WP_Customize_Nav_Menu_Item_Setting( $this->wp_customize, $setting_id );
+
+               $value = $setting->value();
+               $this->assertEquals( $menu_item->type_label, 'Custom Label' );
+               $this->assertEquals( $menu_item->type_label, $value['type_label'] );
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Test value method returns zero for nav_menu_term_id when previewing a new menu.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @see WP_Customize_Nav_Menu_Item_Setting::value()
</span></span></pre></div>
<a id="trunktestsphpunittestscustomizenavmenusphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/customize/nav-menus.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/customize/nav-menus.php 2015-07-22 18:55:27 UTC (rev 33365)
+++ trunk/tests/phpunit/tests/customize/nav-menus.php   2015-07-22 20:28:03 UTC (rev 33366)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -38,6 +38,44 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * Filter to add custom menu item types.
+        *
+        * @param array $items Menu item types.
+        * @return array Menu item types.
+        */
+       function filter_item_types( $items ) {
+               $items[] = array(
+                       'title'  => 'Custom',
+                       'type'   => 'custom_type',
+                       'object' => 'custom_object',
+               );
+
+               return $items;
+       }
+
+       /**
+        * Filter to add custom menu items.
+        *
+        * @param array  $items  The menu items.
+        * @param string $type   The object type (e.g. taxonomy).
+        * @param string $object The object name (e.g. category).
+        * @return array Menu items.
+        */
+       function filter_items( $items, $type, $object ) {
+               $items[] = array(
+                       'id'         => 'custom-1',
+                       'title'      => 'Cool beans',
+                       'type'       => $type,
+                       'type_label' => 'Custom Label',
+                       'object'     => $object,
+                       'url'        => home_url( '/cool-beans/' ),
+                       'classes'    => 'custom-menu-item cool-beans',
+               );
+
+               return $items;
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Test constructor.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @see WP_Customize_Nav_Menus::__construct()
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -207,6 +245,31 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         * Test the load_available_items_query method returns custom item.
+        *
+        * @see WP_Customize_Nav_Menus::load_available_items_query()
+        */
+       function test_load_available_items_query_returns_custom_item() {
+               add_filter( 'customize_nav_menu_available_item_types', array( $this, 'filter_item_types' ) );
+               add_filter( 'customize_nav_menu_available_items', array( $this, 'filter_items' ), 10, 4 );
+               $menus = new WP_Customize_Nav_Menus( $this->wp_customize );
+
+               // Expected menu item array.
+               $expected = array(
+                       'id'         => 'custom-1',
+                       'title'      => 'Cool beans',
+                       'type'       => 'custom_type',
+                       'type_label' => 'Custom Label',
+                       'object'     => 'custom_object',
+                       'url'        => home_url( '/cool-beans/' ),
+                       'classes'    => 'custom-menu-item cool-beans',
+               );
+
+               $items = $menus->load_available_items_query( 'custom_type', 'custom_object', 0 );
+               $this->assertContains( $expected, $items );
+       }
+
+       /**
</ins><span class="cx" style="display: block; padding: 0 10px">          * Test the search_available_items_query method.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @see WP_Customize_Nav_Menus::search_available_items_query()
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -361,40 +424,31 @@
</span><span class="cx" style="display: block; padding: 0 10px">        function test_available_item_types() {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $menus = new WP_Customize_Nav_Menus( $this->wp_customize );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 $expected = array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'postTypes' => array(
-                               'post' => array( 'label' => 'Post' ),
-                               'page' => array( 'label' => 'Page' ),
-                       ),
-                       'taxonomies' => array(
-                               'category' => array( 'label' => 'Category' ),
-                               'post_tag' => array( 'label' => 'Tag' ),
-                       ),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 array( 'title' => 'Post', 'type' => 'post_type', 'object' => 'post' ),
+                       array( 'title' => 'Page', 'type' => 'post_type', 'object' => 'page' ),
+                       array( 'title' => 'Category', 'type' => 'taxonomy', 'object' => 'category' ),
+                       array( 'title' => 'Tag', 'type' => 'taxonomy', 'object' => 'post_tag' ),
</ins><span class="cx" style="display: block; padding: 0 10px">                 );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( current_theme_supports( 'post-formats' ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $expected['taxonomies']['post_format'] = array( 'label' => 'Format' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $expected[] = array( 'title' => 'Format', 'type' => 'taxonomy', 'object' => 'post_format' );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->assertEquals( $expected, $menus->available_item_types() );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                register_taxonomy( 'wptests_tax', array( 'post' ), array( 'labels' => array( 'name' => 'Foo' ) ) );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $expected = array(
-                       'postTypes' => array(
-                               'post' => array( 'label' => 'Post' ),
-                               'page' => array( 'label' => 'Page' ),
-                       ),
-                       'taxonomies' => array(
-                               'category'    => array( 'label' => 'Category' ),
-                               'post_tag'    => array( 'label' => 'Tag' ),
-                               'wptests_tax' => array( 'label' => 'Foo' ),
-                       ),
-               );
-               if ( current_theme_supports( 'post-formats' ) ) {
-                       $wptests_tax = array_pop( $expected['taxonomies'] );
-                       $expected['taxonomies']['post_format'] = array( 'label' => 'Format' );
-                       $expected['taxonomies']['wptests_tax'] = $wptests_tax;
-               }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $expected[] = array( 'title' => 'Foo', 'type' => 'taxonomy', 'object' => 'wptests_tax' );
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 $this->assertEquals( $expected, $menus->available_item_types() );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $expected[] = array( 'title' => 'Custom', 'type' => 'custom_type', 'object' => 'custom_object' );
+
+               add_filter( 'customize_nav_menu_available_item_types', array( $this, 'filter_item_types' ) );
+               $this->assertEquals( $expected, $menus->available_item_types() );
+               remove_filter( 'customize_nav_menu_available_item_types', array( $this, 'filter_item_types' ) );
+
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -427,6 +481,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @see WP_Customize_Nav_Menus::available_items_template()
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        function test_available_items_template() {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                add_filter( 'customize_nav_menu_available_item_types', array( $this, 'filter_item_types' ) );
</ins><span class="cx" style="display: block; padding: 0 10px">                 do_action( 'customize_register', $this->wp_customize );
</span><span class="cx" style="display: block; padding: 0 10px">                $menus = new WP_Customize_Nav_Menus( $this->wp_customize );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -441,20 +496,27 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'object' );
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $post_types ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        foreach ( $post_types as $type ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $this->assertContains( 'available-menu-items-' . esc_attr( $type->name ), $template );
-                               $this->assertContains( '<h4 class="accordion-section-title">' . esc_html( $type->label ), $template );
-                               $this->assertContains( 'data-type="' . esc_attr( $type->name ) . '" data-obj_type="post_type"', $template );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $this->assertContains( 'available-menu-items-post_type-' . esc_attr( $type->name ), $template );
+                               $this->assertContains( '<h4 class="accordion-section-title">' . esc_html( $type->labels->singular_name ), $template );
+                               $this->assertContains( 'data-type="post_type"', $template );
+                               $this->assertContains( 'data-object="' . esc_attr( $type->name ) . '"', $template );
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'object' );
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $taxonomies ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        foreach ( $taxonomies as $tax ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $this->assertContains( 'available-menu-items-' . esc_attr( $tax->name ), $template );
-                               $this->assertContains( '<h4 class="accordion-section-title">' . esc_html( $tax->label ), $template );
-                               $this->assertContains( 'data-type="' . esc_attr( $tax->name ) . '" data-obj_type="taxonomy"', $template );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $this->assertContains( 'available-menu-items-taxonomy-' . esc_attr( $tax->name ), $template );
+                               $this->assertContains( '<h4 class="accordion-section-title">' . esc_html( $tax->labels->singular_name ), $template );
+                               $this->assertContains( 'data-type="taxonomy"', $template );
+                               $this->assertContains( 'data-object="' . esc_attr( $tax->name ) . '"', $template );
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+               $this->assertContains( 'available-menu-items-custom_type', $template );
+               $this->assertContains( '<h4 class="accordion-section-title">Custom', $template );
+               $this->assertContains( 'data-type="custom_type"', $template );
+               $this->assertContains( 'data-object="custom_object"', $template );
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span></span></pre>
</div>
</div>

</body>
</html>