Ticket #11420: internal-linking.third-pass.diff

File internal-linking.third-pass.diff, 26.6 KB (added by koopersmith, 3 years ago)
  • wp-includes/js/tinymce/plugins/wplink/editor_plugin.js

     
     1(function(){tinymce.create("tinymce.plugins.wpLink",{init:function(a,b){a.addCommand("WP_Link",function(){a.windowManager.open({file:tinymce.baseURL+"/wp-mce-link.php",width:320,height:340,inline:1},{plugin_url:b})});a.addButton("link",{title:a.getLang("advanced.link_desc"),cmd:"WP_Link"});a.addShortcut("alt+shift+a",a.getLang("advanced.link_desc"),"WP_Link");a.onNodeChange.add(function(d,c,e){c.setActive("wplink",e.nodeName=="A")})},getInfo:function(){return{longname:"WordPress Link Dialog",author:"WordPress",authorurl:"http://wordpress.org",infourl:"",version:"1.0"}}});tinymce.PluginManager.add("wplink",tinymce.plugins.wpLink)})(); 
     2 No newline at end of file 
  • wp-includes/js/tinymce/plugins/wplink/js/wplink.js

     
     1(function($){ 
     2        $.widget('wp.wpTabs', { 
     3                options: {}, 
     4                _create: function() { 
     5                        var self = this, 
     6                                ul = this.element, 
     7                                lis = ul.children(); 
     8                         
     9                        this.active = lis.filter('.wp-tab-active'); 
     10                        // Calculate panel IDs 
     11                        lis.each(function() { 
     12                                var panel = self._getPanel( $(this) ); 
     13                                if ( self.active[0] == this ) 
     14                                        panel.show(); 
     15                                else 
     16                                        panel.hide(); 
     17                        }); 
     18                         
     19                        ul.delegate('li', 'click.wpTabs', function(e) { 
     20                                var li = $(this); 
     21                                 
     22                                // Prevent any child link from redirecting the page. 
     23                                e.preventDefault(); 
     24                                // Deactivate previous tab. 
     25                                self._getPanel( self.active ).hide(); 
     26                                self.active.removeClass('wp-tab-active'); 
     27                                self._trigger("hide", e, self.widget() ); 
     28                                 
     29                                // Activate current tab. 
     30                                self.active = li.addClass('wp-tab-active'); 
     31                                self._getPanel( self.active ).show(); 
     32                                self._trigger("show", e, self.widget() ); 
     33                        }); 
     34                }, 
     35                widget: function() { 
     36                        return { 
     37                                ul: this.element, 
     38                                tab: this.active, 
     39                                panel: this._getPanel( this.active ) 
     40                        }; 
     41                }, 
     42                _setPanel: function( $el ) { 
     43                        var panel = $( '#' + $el.children('.wp-tab-for-id').val() ); 
     44                        $el.data( 'wp-tab-panel', panel ); 
     45                        return panel; 
     46                }, 
     47                _getPanel: function( $el ) { 
     48                        var panel = $el.data('wp-tab-panel'); 
     49                        return ( !panel || !panel.length ) ? this._setPanel( $el ) : panel; 
     50                } 
     51        }); 
     52        // Create tab bars by default. 
     53        $(function(){ 
     54                $('.wp-tab-bar').wpTabs(); 
     55        }); 
     56})(jQuery); 
     57 
     58(function($){    
     59        var inputs = {}, panels, active, ed, 
     60        wpLink = { 
     61                init : function() { 
     62                        var e, etarget, eclass; 
     63                        // Init shared vars 
     64                        ed = tinyMCEPopup.editor; 
     65                        // Secondary options 
     66                        inputs.title = $('#link-title-field'); 
     67                        // Advanced Options 
     68                        inputs.openInNewTab = $('#link-target-checkbox'); 
     69                        // Types 
     70                        inputs.typeDropdown = $('#link-type'); 
     71                        inputs.typeOptions = inputs.typeDropdown.find('option'); 
     72                         
     73                        panels = $('.link-panel'); 
     74                        active = $('.link-panel-active'); 
     75                         
     76                        // Extract type names 
     77                        inputs.typeOptions.each( function(){ 
     78                                var linkType = this.id.replace(/^link-option-id-/,''), 
     79                                        parts = linkType.split('-'); 
     80                                $(this).data( 'link-type', { 
     81                                        full : linkType, 
     82                                        type : parts[0], 
     83                                        name : parts[1] || '' 
     84                                }); 
     85                        }); 
     86                        panels.each( function(){ 
     87                                var linkType = this.id.replace(/^link-panel-id-/,''), 
     88                                        parts = linkType.split('-'); 
     89                                $(this).data( 'link-type', { 
     90                                        full : linkType, 
     91                                        type : parts[0], 
     92                                        name : parts[1] || '' 
     93                                }); 
     94                        }); 
     95                         
     96                        // Bind event handlers 
     97                        inputs.typeDropdown.change( wpLink.selectPanel ); 
     98                        $('#wp-update').click( wpLink.update ); 
     99                        $('#wp-cancel').click( function() { tinyMCEPopup.close(); } ); 
     100                        $('.link-panel .wp-tab-bar').wpTabs('option', 'show', wpLink.maybeLoadPanel ); 
     101                        $('.link-panel .wp-tab-panel').delegate('li', 'click', wpLink.selectInternalLink ); 
     102                        $('.wp-tab-panel-pagelinks').delegate('a', 'click', wpLink.selectPageLink ); 
     103                        $('.link-panel .link-search-field').keyup( wpLink.searchInternalLinks ); 
     104                         
     105                        // If link exists, select proper values. 
     106                        e = ed.dom.getParent(ed.selection.getNode(), 'A'); 
     107                        if ( ! e ) 
     108                                return; 
     109                         
     110                        // @TODO: select proper panel/fill values when a link is edited 
     111                        active.find('input.url-field').val( e.href ); 
     112                        inputs.title.val( ed.dom.getAttrib(e, 'title') ); 
     113                        // Advanced Options 
     114                         
     115                        if ( "_blank" == ed.dom.getAttrib(e, 'target') ) 
     116                                inputs.openInNewTab.attr('checked','checked'); 
     117                }, 
     118                 
     119                update : function() { 
     120                        var el, 
     121                                ed = tinyMCEPopup.editor, 
     122                                attrs = { 
     123                                        title : inputs.title.val(), 
     124                                        target : inputs.openInNewTab.attr('checked') ? '_blank' : '' 
     125                                }, defaultContent, e, b; 
     126                         
     127                        if ( active.hasClass('link-panel-custom') ) { 
     128                                attrs.href = active.find('input.url-field').val(); 
     129                                defaultContent = attrs.href; 
     130                        } else { 
     131                                el = active.find('li.selected:visible'); 
     132                                if ( !el.length ) 
     133                                        return; 
     134                                 
     135                                attrs.href = el.children('input').val(); 
     136                                defaultContent = el.text(); 
     137                        } 
     138                         
     139                        tinyMCEPopup.restoreSelection(); 
     140                        e = ed.dom.getParent(ed.selection.getNode(), 'A'); 
     141                         
     142                        // If the values are empty... 
     143                        if ( ! attrs.href ) { 
     144                                // ...and nothing is selected, we should return 
     145                                if ( ed.selection.isCollapsed() ) { 
     146                                        tinyMCEPopup.close(); 
     147                                        return; 
     148                                // ...and a link exists, we should unlink and return 
     149                                } else if ( e ) { 
     150                                        tinyMCEPopup.execCommand("mceBeginUndoLevel"); 
     151                                        b = ed.selection.getBookmark(); 
     152                                        ed.dom.remove(e, 1); 
     153                                        ed.selection.moveToBookmark(b); 
     154                                        tinyMCEPopup.execCommand("mceEndUndoLevel"); 
     155                                        tinyMCEPopup.close(); 
     156                                        return; 
     157                                } 
     158                        } 
     159                         
     160                        tinyMCEPopup.execCommand("mceBeginUndoLevel"); 
     161 
     162                        if (e == null) { 
     163                                ed.getDoc().execCommand("unlink", false, null); 
     164                                 
     165                                // If no selection exists, create a new link from scratch. 
     166                                if ( ed.selection.isCollapsed() ) { 
     167                                        var el = ed.dom.create('a', { href: "#mce_temp_url#" }, defaultContent); 
     168                                        ed.selection.setNode(el); 
     169                                // If a selection exists, wrap it in a link. 
     170                                } else { 
     171                                        tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1}); 
     172                                } 
     173 
     174                                tinymce.each(ed.dom.select("a"), function(n) { 
     175                                        if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { 
     176                                                e = n; 
     177                                                ed.dom.setAttribs(e, attrs); 
     178                                        } 
     179                                }); 
     180                        } else { 
     181                                ed.dom.setAttribs(e, attrs); 
     182                        } 
     183 
     184                        // Don't move caret if selection was image 
     185                        if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') { 
     186                                ed.focus(); 
     187                                ed.selection.select(e); 
     188                                ed.selection.collapse(0); 
     189                                tinyMCEPopup.storeSelection(); 
     190                        } 
     191 
     192                        tinyMCEPopup.execCommand("mceEndUndoLevel"); 
     193                        tinyMCEPopup.close(); 
     194                }, 
     195                 
     196                selectPanel : function( option ) { 
     197                        var sel = inputs.typeOptions.filter(':selected'); 
     198                         
     199                        if ( option.jquery ) { 
     200                                sel.removeAttr('selected'); 
     201                                sel = option.attr('selected', 'selected'); 
     202                        } 
     203                         
     204                        active.removeClass('link-panel-active'); 
     205                        active = $('#link-panel-id-' + sel.data('link-type').full ).addClass('link-panel-active'); 
     206                        wpLink.maybeLoadPanel(); 
     207                }, 
     208                 
     209                maybeLoadPanel : function() { 
     210                        var panel = active.find('.wp-tab-panel:visible'); 
     211                        if ( panel.length && panel.find('.wp-tab-panel-loading').length ) 
     212                                wpLink.linkPanelAJAX( panel ); 
     213                }, 
     214                 
     215                linkPanelAJAX : function( $panel, params, callback ) { 
     216                        if ( ! $panel.hasClass('wp-tab-panel') ) 
     217                                $panel = $panel.parents('.wp-tab-panel'); 
     218                         
     219                        if ( ! $panel.length ) 
     220                                return; 
     221                                 
     222                        var query = $panel.children('.wp-tab-panel-query').val(); 
     223                         
     224                        wpLink.linkAJAX( $panel, $.extend({ 
     225                                preset : query, 
     226                                page : 'all' == query ? 1 : 0 
     227                        }, params), function(r, lt) { 
     228                                var pagelinks = $panel.children('.wp-tab-panel-pagelinks'); 
     229                                 
     230                                // Set results 
     231                                $panel.children('ul').html( wpLink.generateListMarkup( r['results'], lt ) ); 
     232                                 
     233                                // Handle page links 
     234                                if ( r['page_links'] ) 
     235                                        pagelinks.html( r['page_links'] ).show(); 
     236                                else 
     237                                        pagelinks.hide(); 
     238                                // Run callback 
     239                                if ( callback ) 
     240                                        callback(r, lt); 
     241                        }) 
     242                }, 
     243                 
     244                selectInternalLink : function() { 
     245                        var t = $(this); 
     246                        if ( t.hasClass('unselectable') ) 
     247                                return; 
     248                        t.siblings('.selected').removeClass('selected'); 
     249                        t.addClass('selected'); 
     250                }, 
     251                 
     252                selectPageLink : function(e) { 
     253                        var page = e.target.href.match(/page=(\d+)/); 
     254                         
     255                        page = page ? page[1] : 1; // If there's no match, it's the first page. 
     256                        e.preventDefault(); // Prevent the link from redirecting. 
     257                         
     258                        wpLink.linkPanelAJAX( $(this), { page : page }); 
     259                }, 
     260                 
     261                searchInternalLinks : function() { 
     262                        var t = $(this), 
     263                                waiting = t.siblings('img.waiting').show(); 
     264                                 
     265                        wpLink.linkPanelAJAX( t, { title : t.val() }, function(){ waiting.hide(); }); 
     266                }, 
     267                 
     268                linkAJAX : function( el, params, callback ) { 
     269                        var linkType = el.parents('.link-panel').data('link-type'); 
     270                        $.post( ajaxurl, $.extend({ 
     271                                action : 'wp-link-ajax', 
     272                                type : linkType.type, 
     273                                name : linkType.name 
     274                        }, params ), function(r) { 
     275                                return callback(r, linkType);  
     276                        }, "json" ); 
     277                }, 
     278                 
     279                generateListMarkup : function( results, linkType ) { 
     280                        var s = ''; 
     281                         
     282                        if ( ! results ) 
     283                                return '<li class="no-matches-found unselectable"><em>' + wpLinkL10n.noMatchesFound + '</em></li>'; 
     284                         
     285                        $.each( results, function() { 
     286                                s+= '<li id="link-to-' + linkType.full + '-' + this['ID'] + '">'; 
     287                                s+= '<input type="hidden" value="' + this['permalink'] + '" />'; 
     288                                s+= this['title'] ? this['title'] : '<em>'+ wpLinkL10n.untitled + '</em>'; 
     289                                s+= '</li>'; 
     290                        }); 
     291                        return s; 
     292                } 
     293        } 
     294         
     295        $(document).ready( wpLink.init ); 
     296})(jQuery); 
     297 No newline at end of file 
  • wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js

     
     1(function() { 
     2        tinymce.create('tinymce.plugins.wpLink', { 
     3                /** 
     4                 * Initializes the plugin, this will be executed after the plugin has been created. 
     5                 * This call is done before the editor instance has finished it's initialization so use the onInit event 
     6                 * of the editor instance to intercept that event. 
     7                 * 
     8                 * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. 
     9                 * @param {string} url Absolute URL to where the plugin is located. 
     10                 */ 
     11                init : function(ed, url) { 
     12                        // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); 
     13                        ed.addCommand('WP_Link', function() { 
     14                                ed.windowManager.open({ 
     15                                        file : tinymce.baseURL + '/wp-mce-link.php', 
     16                                        width : 320, 
     17                                        height : 340, 
     18                                        inline : 1 
     19                                }, { 
     20                                        plugin_url : url // Plugin absolute URL 
     21                                }); 
     22                        }); 
     23 
     24                        // Register example button 
     25                        ed.addButton('link', { 
     26                                title : ed.getLang('advanced.link_desc'), 
     27                                cmd : 'WP_Link' 
     28                        }); 
     29                         
     30                        ed.addShortcut('alt+shift+a', ed.getLang('advanced.link_desc'), 'WP_Link'); 
     31 
     32                        // Add a node change handler, selects the button in the UI when a link is selected 
     33                        ed.onNodeChange.add(function(ed, cm, n) { 
     34                                cm.setActive('wplink', n.nodeName == 'A'); 
     35                        }); 
     36                }, 
     37                /** 
     38                 * Returns information about the plugin as a name/value array. 
     39                 * The current keys are longname, author, authorurl, infourl and version. 
     40                 * 
     41                 * @return {Object} Name/value array containing information about the plugin. 
     42                 */ 
     43                getInfo : function() { 
     44                        return { 
     45                                longname : 'WordPress Link Dialog', 
     46                                author : 'WordPress', 
     47                                authorurl : 'http://wordpress.org', 
     48                                infourl : '', 
     49                                version : "1.0" 
     50                        }; 
     51                } 
     52        }); 
     53 
     54        // Register plugin 
     55        tinymce.PluginManager.add('wplink', tinymce.plugins.wpLink); 
     56})(); 
     57 No newline at end of file 
  • wp-includes/js/tinymce/wp-mce-link.php

     
     1<?php 
     2include 'wp-mce-link-includes.php'; 
     3header('Content-Type: text/html; charset=' . get_bloginfo('charset')); 
     4?> 
     5<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
     6<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>> 
     7<head> 
     8<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" /> 
     9<title><?php _e('Insert/edit link') ?></title> 
     10<script type="text/javascript"> 
     11//<![CDATA[ 
     12var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>', 
     13        wpLinkL10n = { 
     14                untitled : '<?php _e('Untitled'); ?>', 
     15                noMatchesFound : '<?php _e('No matches found.'); ?>' 
     16        }; 
     17//]]> 
     18</script> 
     19<script type="text/javascript" src="tiny_mce_popup.js?ver=3223"></script> 
     20<?php 
     21wp_print_scripts( array('jquery', 'jquery-ui-widget') ); 
     22?> 
     23<script type="text/javascript" src="plugins/wplink/js/wplink.js?ver=1.0"></script> 
     24<?php 
     25wp_admin_css( 'global', true ); 
     26wp_admin_css( 'wp-admin', true ); 
     27wp_admin_css( 'colors-fresh', true ); 
     28?> 
     29<style> 
     30html, body { 
     31        background: #f1f1f1; 
     32} 
     33 
     34a:link, a:visited { 
     35        color: #21759B; 
     36} 
     37 
     38select { 
     39        height: 2em; 
     40} 
     41 
     42#link-header, 
     43#link-options, 
     44#link-advanced-options { 
     45        padding: 5px; 
     46        border-bottom: 1px solid #dfdfdf; 
     47} 
     48#link-type { 
     49        width: 140px; 
     50} 
     51 
     52.link-panel { 
     53        padding: 5px 5px 0; 
     54        display: none; 
     55} 
     56        .link-panel-active { 
     57                display: block; 
     58        } 
     59 
     60label input[type="text"] { 
     61        width: 220px; 
     62} 
     63        .wp-tab-panel label input[type="text"] { 
     64                float: left; 
     65                width: 200px; 
     66        } 
     67 
     68label span { 
     69        display: inline-block; 
     70        width: 80px; 
     71        text-align: right; 
     72        padding-right: 5px; 
     73} 
     74        .wp-tab-panel label span { 
     75                width: auto; 
     76                text-align: left; 
     77                float: left; 
     78                margin-top: 3px; 
     79        } 
     80        .link-search-wrapper { 
     81                padding: 5px; 
     82                border-bottom: solid 1px #dfdfdf; 
     83                display: block; 
     84                overflow: hidden; 
     85        } 
     86                .link-search-wrapper img.waiting { 
     87                        margin: 4px 1px 0 4px; 
     88                        float: left; 
     89                        display: none; 
     90                } 
     91 
     92#open-in-new-tab { 
     93        padding-left: 87px; 
     94} 
     95        #open-in-new-tab span { 
     96                width: auto; 
     97                margin-left: 10px; 
     98                font-size: 11px; 
     99        } 
     100 
     101.submitbox { 
     102        padding: 5px; 
     103        font-size: 11px; 
     104        overflow: auto; 
     105        height: 29px; 
     106} 
     107#wp-cancel { 
     108        line-height: 25px; 
     109        float: left; 
     110} 
     111#wp-update { 
     112        line-height: 23px; 
     113        float: right; 
     114} 
     115#wp-update a { 
     116        display: inline-block; 
     117} 
     118.wp-tab-active, 
     119.wp-tab-panel { 
     120        background: #fff; 
     121} 
     122        .wp-tab-panel { 
     123                height: 160px; 
     124                padding: 0; 
     125        } 
     126.wp-tab-panel li { 
     127        margin-bottom: 0; 
     128        border-bottom: 1px solid #dfdfdf; 
     129        color: #555; 
     130        padding: 4px 6px; 
     131        cursor: pointer; 
     132} 
     133        .wp-tab-panel li:hover { 
     134                background: #EAF2FA; 
     135                color: #333; 
     136        } 
     137        .wp-tab-panel li.selected { 
     138                background: #f1f1f1; 
     139                font-weight: bold; 
     140                color: #333; 
     141        } 
     142.wp-tab-panel-pagelinks { 
     143        display: none; 
     144        padding:4px 0; 
     145        margin:0 auto; 
     146        text-align:center; 
     147} 
     148        .wp-tab-panel-pagelinks-top { 
     149                border-bottom: 1px solid #dfdfdf; 
     150        } 
     151</style> 
     152</head> 
     153<?php 
     154 
     155$pts = get_post_types( array( 'public' => true ), 'objects' ); 
     156$queries = array( 
     157        array( 'preset' => 'all', 'label' => __('View All') ), 
     158        array( 'preset' => 'recent', 'label' => __('Most Recent') ), 
     159        array( 'preset' => 'search', 'label' => __('Search') ) 
     160); 
     161 
     162?> 
     163<body id="post-body"> 
     164<div id="link-header"> 
     165        <label for="link-type"> 
     166                <span><strong><?php _e('Link Type:'); ?></strong> 
     167                </span><select id="link-type"> 
     168                        <option id="link-option-id-custom" class="link-custom"><?php _e('External Link'); ?></option> 
     169                <?php 
     170                foreach ( $pts as $pt ) { 
     171                        echo "<option id='link-option-id-pt-$pt->name' class='link-option-pt'>"; 
     172                        echo $pt->labels->singular_name . '</option>'; 
     173                } ?> 
     174                </select> 
     175        </label> 
     176</div> 
     177<div id="link-selector"> 
     178        <?php 
     179        wp_link_panel_custom(); 
     180        foreach( $pts as $pt ) 
     181                wp_link_panel_structure('pt', $pt->name, $queries); 
     182        ?> 
     183        <div id="link-options"> 
     184                <label for="link-title-field"> 
     185                        <span><?php _e('Description:'); ?></span><input id="link-title-field" type="text" /> 
     186                </label> 
     187                <label for="link-target-checkbox" id="open-in-new-tab"> 
     188                        <input type="checkbox" id="link-target-checkbox" /><span><?php _e('Open in new tab'); ?></span> 
     189                </label> 
     190        </div> 
     191</div> 
     192<div class="submitbox"> 
     193        <div id="wp-cancel"> 
     194                <a class="submitdelete deletion"><?php _e('Cancel'); ?></a> 
     195        </div> 
     196        <div id="wp-update"> 
     197                <a class="button-primary"><?php _e('Update'); ?></a> 
     198        </div> 
     199</div> 
     200</body> 
     201</html> 
  • wp-includes/js/tinymce/wp-mce-link-includes.php

     
     1<?php 
     2/** @ignore */ 
     3if ( ! defined('ABSPATH') ) 
     4        require_once('../../../wp-load.php'); 
     5         
     6 
     7class WP_Tab_Bar { 
     8        var $tabs = array(); 
     9         
     10        var $selected = ''; 
     11         
     12        function add( $id, $label, $url='' ) { 
     13                array_push( $this->tabs, array( 
     14                        'label' => $label, 
     15                        'for' => $id, 
     16                        'url' => $url 
     17                )); 
     18        } 
     19         
     20        function select( $id ) { 
     21                $this->selected = $id; 
     22        } 
     23         
     24        function render( $echo=true ) { 
     25                if ( empty( $this->selected ) ) 
     26                        $this->selected = $this->tabs[0]['for']; 
     27 
     28                $out = "<ul class='wp-tab-bar'>"; 
     29                foreach( $this->tabs as $tab ) { 
     30                        if ( !isset($tab['url']) ) 
     31                                $tab['url'] = ''; 
     32 
     33                        $out.= "<li class='"; 
     34                        $out.= $this->selected == $tab['for'] ? 'wp-tab-active' : ''; 
     35                        $out.= "'><input type='hidden' class='wp-tab-for-id' value='{$tab['for']}' />"; 
     36                        $out.= "<a href='{$tab['url']}#{$tab['for']}'>"; 
     37                        $out.= "{$tab['label']}</a></li>"; 
     38                } 
     39                $out.= "</ul>"; 
     40 
     41                if ( $echo ) 
     42                        echo $out; 
     43 
     44                return $out; 
     45        } 
     46} 
     47 
     48function wp_link_panel_custom() { ?> 
     49        <div id="link-panel-id-custom" class="link-panel link-panel-custom link-panel-active"> 
     50                <input type="hidden" class="link-panel-type" value="custom" /> 
     51                <label> 
     52                        <span><?php _e('URL:'); ?></span><input class="url-field" type="text" /> 
     53                </label> 
     54        </div> 
     55<?php } 
     56 
     57function wp_link_panel_structure( $panel_type, $name, $queries ) { 
     58        $id = $panel_type . '-' . $name; 
     59         
     60        ?> 
     61        <div id="link-panel-id-<?php echo $id; ?>" class="link-panel link-panel-<?php echo $panel_type; ?>"> 
     62                <!-- <input type="hidden" class="link-panel-type" value="<?php echo $panel_type; ?>" /> --> 
     63                <!-- <input type="hidden" class="link-panel-id" value="" /> --> 
     64                <?php 
     65                 
     66                $tb = new WP_Tab_Bar(); 
     67                foreach( $queries as $i => $query ) { 
     68                        $queries[$i]['id'] = "$id-{$query['preset']}"; 
     69                        $tb->add( $queries[$i]['id'], $query['label'] ); 
     70                } 
     71                $tb->render(); 
     72 
     73                foreach( $queries as $query ): ?> 
     74                        <div id="<?php echo $query['id']; ?>" class="wp-tab-panel"> 
     75                                <input type="hidden" class="wp-tab-panel-query" value="<?php echo $query['preset']; ?>" /> 
     76                                 
     77                        <?php if ( 'search' == $query['preset'] ): ?> 
     78                                <label for="<?php echo $id; ?>-search-field" class="link-search-wrapper"> 
     79                                        <span><?php _e('Search:'); ?></span> 
     80                                        <input type="text" id="<?php echo $id; ?>-search-field" class="link-search-field" /> 
     81                                        <img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" /> 
     82                                </label> 
     83                                <ul id="<?php echo $id; ?>-search-results" class="link-search-results"></ul> 
     84                                 
     85                        <?php else: ?> 
     86                                <div class="wp-tab-panel-pagelinks wp-tab-panel-pagelinks-top"></div> 
     87                                <ul> 
     88                                        <li class="wp-tab-panel-loading unselectable"><em><?php _e('Loading...'); ?></em></li> 
     89                                </ul> 
     90                                <div class="wp-tab-panel-pagelinks wp-tab-panel-pagelinks-bottom"></div> 
     91                        <?php endif; ?> 
     92                        </div> 
     93                <?php endforeach; ?> 
     94        </div> 
     95<?php } 
     96 
     97function wp_link_query_post_type( $pt_obj, $preset='all', $opts=array() ) { 
     98        $args_base = array( 
     99                'post_type' => $pt_obj->name, 
     100                'suppress_filters' => true, 
     101                'update_post_term_cache' => false, 
     102                'update_post_meta_cache' => false, 
     103                'post_status' => 'publish', 
     104        ); 
     105         
     106        switch( $preset ) { 
     107        case 'all': 
     108                $args = array_merge( $args_base, array( 
     109                        'order' => 'ASC', 
     110                        'orderby' => 'title', 
     111                        'posts_per_page' => 20, 
     112                )); 
     113                break; 
     114        case 'recent': 
     115                $args = array_merge( $args_base, array( 
     116                        'order' => 'DESC', 
     117                        'orderby' => 'post_date', 
     118                        'posts_per_page' => 15, 
     119                )); 
     120                break; 
     121        case 'search': 
     122                $args = array_merge( $args_base, array( 
     123                        's' => isset($opts['search']) ? $opts['search'] : '', 
     124                        'posts_per_page' => 10 
     125                )); 
     126                break; 
     127        } 
     128         
     129        // Handle pages if a page number is specified. 
     130        if ( isset( $opts['pagenum'] ) && isset( $args['posts_per_page'] ) ) { 
     131                $pages = array( 
     132                        'current' => $opts['pagenum'], 
     133                        'per_page' => $args['posts_per_page'] 
     134                ); 
     135                 
     136                if ( ! isset( $args['offset'] ) ) 
     137                        $args['offset'] = 0 < $opts['pagenum'] ? $args['posts_per_page'] * ( $opts['pagenum'] - 1 ) : 0; 
     138                $pages['offset'] = $args['offset']; 
     139        } 
     140         
     141        // Allow args to be extended. 
     142        if ( isset( $opts['args'] ) ) 
     143                $args = array_merge( $args, $opts['args'] ); 
     144         
     145        // Do main query. 
     146        $get_posts = new WP_Query; 
     147        $posts = $get_posts->query( $args ); 
     148        // Check if any posts were found. 
     149        if ( ! $get_posts->post_count ) 
     150                return false; 
     151         
     152        // Build results. 
     153        $results = array(); 
     154        foreach ( $posts as $post ) { 
     155                $results[] = array( 
     156                        'ID' => $post->ID, 
     157                        'title' => $post->post_title, 
     158                        'permalink' => get_permalink( $post->ID ) 
     159                ); 
     160        } 
     161        // Build response. 
     162        $resp = array( 
     163                'query' => $get_posts, 
     164                'objects' => $posts, 
     165                'results' => $results 
     166        ); 
     167         
     168        // Set remaining pages values. 
     169        if ( isset( $pages ) ) { 
     170                $pages['max'] = $resp['query']->max_num_pages; 
     171                $pages['page_links'] = paginate_links( array( 
     172                        'prev_text' => __('&laquo;'), 
     173                        'next_text' => __('&raquo;'), 
     174                        'total' => $pages['max'], 
     175                        'current' => $pages['current'] 
     176                )); 
     177                $resp['pages'] = $pages; 
     178        } 
     179         
     180        return $resp; 
     181} 
     182 
     183function wp_link_ajax( $request ) { 
     184        if ( !isset($request['type']) || !isset($request['name']) || !isset($request['preset']) ) 
     185                die('-1'); 
     186 
     187        // Run only presets we recognize. 
     188        if ( 'pt' != $request['type'] || ! in_array( $request['preset'], array('all','search','recent') ) ) 
     189                die('-1'); 
     190        // Searches must have a search term. 
     191        else if ( 'search' == $request['preset'] && !isset($request['title']) ) 
     192                die('-1'); 
     193 
     194        $opts = array(); 
     195        if ( 'search' == $request['preset'] ) { 
     196                $opts['search'] = $request['title']; 
     197        } else if ( ! empty( $request['page'] ) ) { 
     198                $opts['pagenum'] = $request['page']; 
     199        } 
     200                 
     201        if ( 'pt' == $request['type'] && $obj = get_post_type_object($request['name']) ) 
     202                $resp = wp_link_query_post_type( $obj, $request['preset'], $opts ); 
     203 
     204        if ( ! isset( $resp ) ) 
     205                die('0'); 
     206 
     207        $json = array( 'results' => $resp['results'] ); 
     208        if ( isset( $resp['pages'] ) && !empty( $resp['pages']['page_links'] ) ) 
     209                $json['page_links'] = $resp['pages']['page_links']; 
     210         
     211        echo json_encode( $json ); 
     212        echo "\n"; 
     213} 
     214?> 
     215 No newline at end of file 
  • wp-admin/admin-ajax.php

     
    11021102 
    11031103        exit; 
    11041104        break; 
     1105case 'wp-link-ajax': 
     1106        require_once ABSPATH . WPINC . '/js/tinymce/wp-mce-link-includes.php'; 
     1107 
     1108        wp_link_ajax( $_REQUEST ); 
     1109         
     1110        exit; 
     1111        break; 
    11051112case 'menu-locations-save': 
    11061113        if ( ! current_user_can( 'edit_theme_options' ) ) 
    11071114                die('-1'); 
  • wp-admin/includes/post.php

     
    13111311        $mce_spellchecker_languages = apply_filters('mce_spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv'); 
    13121312 
    13131313        if ( $teeny ) { 
    1314                 $plugins = apply_filters( 'teeny_mce_plugins', array('inlinepopups', 'media', 'fullscreen', 'wordpress') ); 
     1314                $plugins = apply_filters( 'teeny_mce_plugins', array('inlinepopups', 'media', 'fullscreen', 'wordpress', 'wplink') ); 
    13151315                $ext_plugins = ''; 
    13161316        } else { 
    1317                 $plugins = array( 'inlinepopups', 'spellchecker', 'paste', 'wordpress', 'media', 'fullscreen', 'wpeditimage', 'wpgallery', 'tabfocus' ); 
     1317                $plugins = array( 'inlinepopups', 'spellchecker', 'paste', 'wordpress', 'media', 'fullscreen', 'wpeditimage', 'wpgallery', 'tabfocus', 'wplink' ); 
    13181318 
    13191319                /* 
    13201320                The following filter takes an associative array of external plugins for TinyMCE in the form 'plugin_name' => 'url'. 
  • wp-admin/css/colors-fresh.dev.css

     
    110110} 
    111111 
    112112div.tabs-panel, 
     113.wp-tab-panel, 
    113114ul.category-tabs li.tabs, 
    114 ul.add-menu-item-tabs li.tabs { 
     115ul.add-menu-item-tabs li.tabs, 
     116.wp-tab-active { 
    115117        border-color: #dfdfdf; 
    116118} 
    117119 
    118120ul.category-tabs li.tabs, 
    119 ul.add-menu-item-tabs li.tabs { 
     121ul.add-menu-item-tabs li.tabs, 
     122.wp-tab-active { 
    120123        background-color: #f1f1f1; 
    121124} 
    122125 
     
    382385} 
    383386 
    384387#side-sortables .category-tabs .tabs a, 
    385 #side-sortables .add-menu-item-tabs .tabs a { 
     388#side-sortables .add-menu-item-tabs .tabs a, 
     389.wp-tab-bar .wp-tab-active a { 
    386390        color: #333; 
    387391} 
    388392 
  • wp-admin/css/wp-admin.dev.css

     
    20292029        text-decoration: none; 
    20302030} 
    20312031 
     2032.wp-tab-panel, 
    20322033.categorydiv div.tabs-panel, 
    20332034.customlinkdiv div.tabs-panel, 
    20342035.posttypediv div.tabs-panel, 
     
    20632064} 
    20642065 
    20652066#side-sortables .category-tabs li, 
    2066 #side-sortables .add-menu-item-tabs li { 
     2067#side-sortables .add-menu-item-tabs li, 
     2068.wp-tab-bar li { 
    20672069        display: inline; 
    20682070} 
    20692071 
    20702072#side-sortables .category-tabs a, 
    2071 #side-sortables .add-menu-item-tabs a { 
     2073#side-sortables .add-menu-item-tabs a, 
     2074.wp-tab-bar a { 
    20722075        text-decoration: none; 
    20732076} 
    20742077 
    20752078#side-sortables .category-tabs, 
    2076 #side-sortables .add-menu-item-tabs { 
     2079#side-sortables .add-menu-item-tabs, 
     2080.wp-tab-bar { 
    20772081        margin-bottom: 3px; 
    20782082} 
    20792083 
     
    21102114        margin-bottom: 0px; 
    21112115} 
    21122116 
    2113 .categorydiv .tabs-panel, 
    2114 .customlinkdiv .tabs-panel, 
    2115 .posttypediv .tabs-panel, 
    2116 .taxonomydiv .tabs-panel { 
    2117         border-width: 3px; 
    2118         border-style: solid; 
    2119 } 
    2120  
    21212117ul.category-tabs, 
    2122 ul.add-menu-item-tabs { 
     2118ul.add-menu-item-tabs, 
     2119ul.wp-tab-bar { 
    21232120        margin-top: 12px; 
    21242121} 
    21252122 
    21262123ul.category-tabs li.tabs, 
    2127 ul.add-menu-item-tabs li.tabs { 
     2124ul.add-menu-item-tabs li.tabs, 
     2125.wp-tab-active { 
    21282126        border-style: solid solid none; 
    21292127        border-width: 1px 1px 0; 
    21302128} 
     
    21372135} 
    21382136 
    21392137ul.category-tabs li, 
    2140 ul.add-menu-item-tabs li { 
     2138ul.add-menu-item-tabs li, 
     2139ul.wp-tab-bar li { 
    21412140        padding: 5px; 
    21422141        -moz-border-radius: 3px 3px 0 0; 
    21432142        -webkit-border-top-left-radius: 3px;