WordPress.org

Make WordPress Core

Ticket #11420: internal-linking.round-two.diff

File internal-linking.round-two.diff, 25.2 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 
     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:480,height:400,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.dev.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  
    581(function($){    
    59         var inputs = {}, panels, active, ed, 
     2        var inputs = {}, results = {}, ed, 
    603        wpLink = { 
    614                init : function() { 
    625                        var e, etarget, eclass; 
    636                        // Init shared vars 
    647                        ed = tinyMCEPopup.editor; 
     8                         
     9                         
     10                        // URL 
     11                        inputs.url = $('#url-field'); 
    6512                        // Secondary options 
    6613                        inputs.title = $('#link-title-field'); 
    6714                        // Advanced Options 
    6815                        inputs.openInNewTab = $('#link-target-checkbox'); 
     16                        inputs.search = $('#search-field'); 
     17                        // Result lists 
     18                        results.search = $('#search-results'); 
     19                        results.recent = $('#most-recent-results'); 
    6920                         
    70                         panels = $('.link-panel'); 
    71                         active = $('.link-panel-active'); 
    72                         $('#link-panel-tab-bar').wpTabs({ 
    73                                 show: function(e, widget) { 
    74                                         active = widget.panel; 
    75                                         active.addClass('link-panel-active'); 
    76                                         wpLink.maybeLoadPanel(); 
    77                                 }, 
    78                                 hide: function(e, widget) { 
    79                                         active.removeClass('link-panel-active'); 
    80                                 } 
    81                         }) 
    82                          
    83                         panels.each( function(){ 
    84                                 var linkType = this.id.replace(/^link-panel-id-/,''), 
    85                                         parts = linkType.split('-'); 
    86                                 $(this).data( 'link-type', { 
    87                                         full : linkType, 
    88                                         type : parts[0], 
    89                                         name : parts[1] || '' 
    90                                 }); 
    91                         }); 
    92                          
    9321                        // Bind event handlers 
    9422                        $('#wp-update').click( wpLink.update ); 
    9523                        $('#wp-cancel').click( function() { tinyMCEPopup.close(); } ); 
    96                         $('.link-panel .wp-tab-bar').wpTabs('option', 'show', wpLink.maybeLoadPanel ); 
    97                         $('.link-panel .wp-tab-panel').delegate('li', 'click', wpLink.selectInternalLink ); 
    98                         $('.wp-tab-panel-pagelinks').delegate('a', 'click', wpLink.selectPageLink ); 
    99                         $('.link-panel .link-search-field').keyup( wpLink.searchInternalLinks ); 
     24                        $('.query-results').delegate('li', 'click', wpLink.selectInternalLink ); 
     25                        $('.wp-results-pagelinks').delegate('a', 'click', wpLink.selectPageLink ); 
     26                        inputs.search.keyup( wpLink.searchInternalLinks ); 
    10027 
    101                         active.find('input.url-field').focus(); 
    102  
    10328                        // If link exists, select proper values. 
    104                         e = ed.dom.getParent(ed.selection.getNode(), 'A'); 
    105                         if ( ! e ) 
    106                                 return; 
    107                          
    108                         active.find('input.url-field').val( e.href ); 
    109                         inputs.title.val( ed.dom.getAttrib(e, 'title') ); 
    110                         // Advanced Options 
    111                          
    112                         if ( "_blank" == ed.dom.getAttrib(e, 'target') ) 
    113                                 inputs.openInNewTab.attr('checked','checked'); 
     29                        if ( e = ed.dom.getParent(ed.selection.getNode(), 'A') ) { 
     30                                // Set URL and description. 
     31                                inputs.url.val( e.href ); 
     32                                inputs.title.val( ed.dom.getAttrib(e, 'title') ); 
     33                                // Set open in new tab. 
     34                                if ( "_blank" == ed.dom.getAttrib(e, 'target') ) 
     35                                        inputs.openInNewTab.attr('checked','checked'); 
     36                        } 
    11437                }, 
    11538                 
    11639                update : function() { 
    11740                        var el, 
    11841                                ed = tinyMCEPopup.editor, 
    11942                                attrs = { 
     43                                        href : inputs.url.val(), 
    12044                                        title : inputs.title.val(), 
    12145                                        target : inputs.openInNewTab.attr('checked') ? '_blank' : '' 
    122                                 }, defaultContent, e, b; 
     46                                }, e, b, 
     47                                defaultContent = attrs.title ? attrs.title : attrs.href; 
    12348                         
    124                         if ( active.hasClass('link-panel-custom') ) { 
    125                                 attrs.href = active.find('input.url-field').val(); 
    126                                 defaultContent = attrs.href; 
    127                         } else { 
    128                                 el = active.find('li.selected:visible'); 
    129                                 if ( !el.length ) 
    130                                         return; 
    131                                  
    132                                 attrs.href = el.children('input').val(); 
    133                                 defaultContent = el.text(); 
    134                         } 
    135                          
    13649                        tinyMCEPopup.restoreSelection(); 
    13750                        e = ed.dom.getParent(ed.selection.getNode(), 'A'); 
    13851                         
     
    190103                        tinyMCEPopup.close(); 
    191104                }, 
    192105                 
    193                 maybeLoadPanel : function() { 
    194                         var panel = active.find('.wp-tab-panel:visible'); 
    195                         if ( panel.length && panel.find('.wp-tab-panel-loading').length ) 
    196                                 wpLink.linkPanelAJAX( panel ); 
    197                 }, 
    198                  
    199                 linkPanelAJAX : function( $panel, params, callback ) { 
    200                         if ( ! $panel.hasClass('wp-tab-panel') ) 
    201                                 $panel = $panel.parents('.wp-tab-panel'); 
    202                          
    203                         if ( ! $panel.length ) 
    204                                 return; 
    205                                  
    206                         var query = $panel.children('.wp-tab-panel-query').val(); 
    207                          
    208                         wpLink.linkAJAX( $panel, $.extend({ 
    209                                 preset : query, 
    210                                 page : 'all' == query ? 1 : 0 
    211                         }, params), function(r, lt) { 
    212                                 var pagelinks = $panel.children('.wp-tab-panel-pagelinks'); 
    213                                  
    214                                 // Set results 
    215                                 $panel.children('ul').html( wpLink.generateListMarkup( r['results'], lt ) ); 
    216                                  
    217                                 // Handle page links 
    218                                 if ( r['page_links'] ) 
    219                                         pagelinks.html( r['page_links'] ).show(); 
    220                                 else 
    221                                         pagelinks.hide(); 
    222                                 // Run callback 
    223                                 if ( callback ) 
    224                                         callback(r, lt); 
    225                         }) 
    226                 }, 
    227                  
    228106                selectInternalLink : function() { 
    229107                        var t = $(this); 
    230108                        if ( t.hasClass('unselectable') ) 
    231109                                return; 
    232110                        t.siblings('.selected').removeClass('selected'); 
    233111                        t.addClass('selected'); 
     112                        inputs.url.val( t.children('.item-permalink').val() ); 
     113                        inputs.title.val( t.children('.item-title').text() ); 
    234114                }, 
    235115                 
    236116                selectPageLink : function(e) { 
     
    239119                        page = page ? page[1] : 1; // If there's no match, it's the first page. 
    240120                        e.preventDefault(); // Prevent the link from redirecting. 
    241121                         
    242                         wpLink.linkPanelAJAX( $(this), { page : page }); 
     122                        wpLink.linkAJAX( $(this), { page : page }); 
    243123                }, 
    244124                 
    245125                searchInternalLinks : function() { 
    246                         var t = $(this), 
     126                        var t = $(this), waiting, 
     127                                title = t.val(); 
     128                         
     129                        if ( title ) { 
     130                                results.recent.hide(); 
     131                                results.search.show(); 
    247132                                waiting = t.siblings('img.waiting').show(); 
    248                                  
    249                         wpLink.linkPanelAJAX( t, { title : t.val() }, function(){ waiting.hide(); }); 
     133                                wpLink.linkAJAX( results.search, { title : title }, function(){ waiting.hide(); }); 
     134                        } else { 
     135                                results.search.hide(); 
     136                                results.recent.show(); 
     137                        } 
    250138                }, 
    251139                 
    252                 linkAJAX : function( el, params, callback ) { 
    253                         var linkType = el.parents('.link-panel').data('link-type'); 
     140                linkAJAX : function( $panel, params, callback ) { 
     141                        if ( ! $panel.hasClass('query-results') ) 
     142                                $panel = $panel.parents('.query-results'); 
     143                         
     144                        if ( ! $panel.length ) 
     145                                return; 
     146                         
    254147                        $.post( ajaxurl, $.extend({ 
    255                                 action : 'wp-link-ajax', 
    256                                 type : linkType.type, 
    257                                 name : linkType.name 
     148                                action : 'wp-link-ajax' 
    258149                        }, params ), function(r) { 
    259                                 return callback(r, linkType);  
     150                                var pagelinks = $panel.children('.wp-results-pagelinks'); 
     151                                 
     152                                // Set results 
     153                                $panel.children('ul').html( wpLink.generateListMarkup( r['results'] ) ); 
     154                                 
     155                                // Handle page links 
     156                                if ( r['page_links'] ) 
     157                                        pagelinks.html( r['page_links'] ).show(); 
     158                                else 
     159                                        pagelinks.hide(); 
     160                                 
     161                                // Run callback 
     162                                if ( callback ) 
     163                                        callback( r['results'] ); 
    260164                        }, "json" ); 
    261165                }, 
    262166                 
    263                 generateListMarkup : function( results, linkType ) { 
     167                generateListMarkup : function( results ) { 
    264168                        var s = ''; 
    265169                         
    266170                        if ( ! results ) 
    267                                 return '<li class="no-matches-found unselectable"><em>' + wpLinkL10n.noMatchesFound + '</em></li>'; 
     171                                return '<li class="no-matches-found unselectable"><span class="item-title"><em>' + wpLinkL10n.noMatchesFound + '</em></span></li>'; 
    268172                         
    269173                        $.each( results, function() { 
    270                                 s+= '<li id="link-to-' + linkType.full + '-' + this['ID'] + '">'; 
    271                                 s+= '<input type="hidden" value="' + this['permalink'] + '" />'; 
     174                                s+= '<li><input type="hidden" class="item-permalink" value="' + this['permalink'] + '" />'; 
     175                                s+= '<span class="item-title">' 
    272176                                s+= this['title'] ? this['title'] : '<em>'+ wpLinkL10n.untitled + '</em>'; 
     177                                s+= '</span><span class="item-info">' + this['info'] + '</span>'; 
    273178                                s+= '</li>'; 
    274179                        }); 
    275180                        return s; 
  • wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js

     
    1313                        ed.addCommand('WP_Link', function() { 
    1414                                ed.windowManager.open({ 
    1515                                        file : tinymce.baseURL + '/wp-mce-link.php', 
    16                                         width : 320, 
    17                                         height : 340, 
     16                                        width : 480, 
     17                                        height : 400, 
    1818                                        inline : 1 
    1919                                }, { 
    2020                                        plugin_url : url // Plugin absolute URL 
  • wp-includes/js/tinymce/wp-mce-link.php

     
    2323<?php 
    2424wp_print_scripts( array('jquery', 'jquery-ui-widget') ); 
    2525?> 
    26 <script type="text/javascript" src="plugins/wplink/js/wplink.js?ver=20101023"></script> 
    2726<?php 
     27        $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '.dev' : ''; 
     28        $src = "plugins/wplink/js/wplink$suffix.js?ver=20101023"; 
     29?> 
     30<script type="text/javascript" src="<?php echo $src; ?>"></script> 
     31<?php 
    2832wp_admin_css( 'global', true ); 
    2933wp_admin_css( 'wp-admin', true ); 
    3034register_admin_color_schemes(); 
     
    4347        height: 2em; 
    4448} 
    4549 
    46 #link-header, 
    4750#link-options, 
    4851#link-advanced-options { 
    4952        padding: 5px; 
    5053        border-bottom: 1px solid #dfdfdf; 
    5154} 
    52         #link-header { 
    53                 padding-bottom: 0; 
    54                 background: #fff; 
    55         } 
    56         #link-panel-tab-bar li { 
    57                 font-weight: bold; 
    58                 border: #dfdfdf solid; 
    59                 margin-right: 5px; 
    60                 border-width: 1px 1px 0; 
    61         } 
    62         #link-panel-tab-bar .wp-tab-active { 
    63                 border-color:#ccc; 
    64                 background-color: #f1f1f1; 
    65         } 
    6655 
    6756#link-type { 
    6857        width: 140px; 
     
    7766        } 
    7867 
    7968label input[type="text"] { 
    80         width: 220px; 
     69        width: 360px; 
     70        margin-top: 5px; 
    8171} 
    82         .wp-tab-panel label input[type="text"] { 
    83                 float: left; 
    84                 width: 200px; 
    85         } 
    8672 
    8773label span { 
    8874        display: inline-block; 
     
    9076        text-align: right; 
    9177        padding-right: 5px; 
    9278} 
    93         .wp-tab-panel label span { 
    94                 width: auto; 
    95                 text-align: left; 
    96                 float: left; 
    97                 margin-top: 3px; 
    98         } 
    9979        .link-search-wrapper { 
    10080                padding: 5px; 
    101                 border-bottom: solid 1px #dfdfdf; 
    10281                display: block; 
    10382                overflow: hidden; 
    10483        } 
     84                .link-search-wrapper span { 
     85                        float: left; 
     86                        margin-top: 6px; 
     87                } 
     88                .link-search-wrapper input[type="text"] { 
     89                        float: left; 
     90                        width: 220px; 
     91                } 
    10592                .link-search-wrapper img.waiting { 
    106                         margin: 4px 1px 0 4px; 
     93                        margin: 8px 1px 0 4px; 
    10794                        float: left; 
    10895                        display: none; 
    10996                } 
     
    116103                margin-left: 10px; 
    117104                font-size: 11px; 
    118105        } 
     106         
     107.query-results { 
     108        border: #dfdfdf solid; 
     109        border-width: 1px 0; 
     110        margin: 5px 0; 
     111        background: #fff; 
     112        height: 220px; 
     113        overflow: auto; 
     114} 
     115        .query-results li { 
     116                margin-bottom: 0; 
     117                border-bottom: 1px solid #dfdfdf; 
     118                color: #555; 
     119                padding: 4px 6px; 
     120                cursor: pointer; 
     121        } 
     122        .query-results li:hover { 
     123                background: #EAF2FA; 
     124                color: #333; 
     125        } 
     126        .query-results li.selected { 
     127                background: #f1f1f1; 
     128                font-weight: bold; 
     129                color: #333; 
     130        } 
     131.item-info { 
     132        text-transform: uppercase; 
     133        color: #aaa; 
     134        font-weight: bold; 
     135        font-size: 11px; 
     136        float: right; 
     137} 
     138#search-results { 
     139        display: none; 
     140} 
     141         
     142.wp-results-pagelinks { 
     143        padding:4px 0; 
     144        margin:0 auto; 
     145        text-align:center; 
     146} 
     147        .wp-results-pagelinks-top { 
     148                border-bottom: 1px solid #dfdfdf; 
     149        } 
    119150 
    120151.submitbox { 
    121         padding: 5px; 
     152        padding: 5px 5px 0; 
    122153        font-size: 11px; 
    123154        overflow: auto; 
    124155        height: 29px; 
     
    134165#wp-update a { 
    135166        display: inline-block; 
    136167} 
    137 .wp-tab-active, 
    138 .wp-tab-panel { 
    139         background: #fff; 
    140 } 
    141         .wp-tab-panel { 
    142                 height: 160px; 
    143                 padding: 0; 
    144         } 
    145 .wp-tab-panel li { 
    146         margin-bottom: 0; 
    147         border-bottom: 1px solid #dfdfdf; 
    148         color: #555; 
    149         padding: 4px 6px; 
    150         cursor: pointer; 
    151 } 
    152         .wp-tab-panel li:hover { 
    153                 background: #EAF2FA; 
    154                 color: #333; 
    155         } 
    156         .wp-tab-panel li.selected { 
    157                 background: #f1f1f1; 
    158                 font-weight: bold; 
    159                 color: #333; 
    160         } 
    161 .wp-tab-panel-pagelinks { 
    162         display: none; 
    163         padding:4px 0; 
    164         margin:0 auto; 
    165         text-align:center; 
    166 } 
    167         .wp-tab-panel-pagelinks-top { 
    168                 border-bottom: 1px solid #dfdfdf; 
    169         } 
    170168</style> 
    171169</head> 
    172170<?php 
    173 // @TODO: Support custom post types. 
    174 // $pts = get_post_types( array( 'public' => true ), 'objects' ); 
    175 $pts = array( get_post_type_object( 'post' ), get_post_type_object( 'page' ) ); 
    176 $queries = array( 
    177         array( 'preset' => 'all', 'label' => __('View All') ), 
    178         array( 'preset' => 'recent', 'label' => __('Most Recent') ), 
    179         array( 'preset' => 'search', 'label' => __('Search') ) 
    180 ); 
    181171 
    182 $tb = new WP_Tab_Bar(); 
    183 $tb->id = 'link-panel-tab-bar'; 
    184 $tb->add( 'link-panel-id-custom', __('External Link') ); 
    185 foreach( $pts as $pt ) { 
    186         $tb->add( "link-panel-id-pt-$pt->name", $pt->labels->singular_name ); 
    187 } 
    188172 
    189  
    190173?> 
    191174<body id="post-body"> 
    192 <div id="link-header"> 
    193         <?php $tb->render(); ?> 
    194 </div> 
    195175<div id="link-selector"> 
    196         <?php 
    197         wp_link_panel_custom(); 
    198         foreach( $pts as $pt ) 
    199                 wp_link_panel_structure('pt', $pt->name, $queries); 
    200         ?> 
    201176        <div id="link-options"> 
     177                <label for="url-field"> 
     178                        <span><?php _e('URL:'); ?></span><input id="url-field" type="text" /> 
     179                </label> 
    202180                <label for="link-title-field"> 
    203181                        <span><?php _e('Description:'); ?></span><input id="link-title-field" type="text" /> 
    204182                </label> 
     
    206184                        <input type="checkbox" id="link-target-checkbox" /><span><?php _e('Open in new tab'); ?></span> 
    207185                </label> 
    208186        </div> 
     187        <div id="search-panel"> 
     188                <label for="search-field" class="link-search-wrapper"> 
     189                        <span><?php _e('Search:'); ?></span> 
     190                        <input type="text" id="search-field" class="link-search-field" /> 
     191                        <img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" /> 
     192                </label> 
     193                 
     194                <div id="search-results" class="query-results"> 
     195                        <div class="wp-results-pagelinks wp-results-pagelinks-top"></div> 
     196                        <ul> 
     197                                <li class="wp-results-loading unselectable"><em><?php _e('Loading...'); ?></em></li> 
     198                        </ul> 
     199                        <div class="wp-results-pagelinks wp-results-pagelinks-bottom"></div> 
     200                </div> 
     201                 
     202                <?php $most_recent = wp_link_query(); ?> 
     203                <div id="most-recent-results" class="query-results"> 
     204                        <div class="wp-results-pagelinks wp-results-pagelinks-top"> 
     205                                <?php echo $most_recent['pages']['page_links']; ?> 
     206                        </div> 
     207                        <ul> 
     208                                <?php foreach ( $most_recent['results'] as $item ): ?> 
     209                                        <li> 
     210                                                <input type="hidden" class="item-permalink" value="<?php echo esc_url( $item['permalink'] ); ?>" /> 
     211                                                <span class="item-title"><?php echo $item['title']; ?></span> 
     212                                                <span class="item-info"><?php echo esc_html( $item['info'] ); ?></span> 
     213                                        </li> 
     214                                <?php endforeach; ?> 
     215                        </ul> 
     216                        <div class="wp-results-pagelinks wp-results-pagelinks-bottom"> 
     217                                <?php echo $most_recent['pages']['page_links']; ?> 
     218                        </div> 
     219                </div> 
     220        </div> 
    209221</div> 
    210222<div class="submitbox"> 
    211223        <div id="wp-cancel"> 
  • wp-includes/js/tinymce/wp-mce-link-includes.php

     
    11<?php 
     2// args expects optionally 'pagenum' and 's' 
     3function wp_link_query( $args = array() ) { 
     4        $pts = get_post_types( array( 'publicly_queryable' => true ), 'objects' ); 
     5        $pt_names = array_keys( $pts ); 
    26         
    3 class WP_Tab_Bar { 
    4         var $tabs = array(); 
    5          
    6         var $id = ''; 
    7         var $classes = array(); 
    8          
    9         var $selected = ''; 
    10          
    11         function add( $id, $label, $url='' ) { 
    12                 array_push( $this->tabs, array( 
    13                         'label' => $label, 
    14                         'for' => $id, 
    15                         'url' => $url 
    16                 )); 
    17         } 
    18          
    19         function select( $id ) { 
    20                 $this->selected = $id; 
    21         } 
    22          
    23         function render( $echo=true ) { 
    24                 if ( empty( $this->selected ) ) 
    25                         $this->selected = $this->tabs[0]['for']; 
    26  
    27                 array_unshift( $this->classes, 'wp-tab-bar' ); 
    28                  
    29                 $out = "<ul id='$this->id' class='" . esc_attr( implode( ' ', $this->classes ) ) . "'>"; 
    30                 foreach( $this->tabs as $tab ) { 
    31                         if ( !isset($tab['url']) ) 
    32                                 $tab['url'] = ''; 
    33  
    34                         $out.= "<li class='"; 
    35                         $out.= $this->selected == $tab['for'] ? 'wp-tab-active' : ''; 
    36                         $out.= "'><input type='hidden' class='wp-tab-for-id' value='{$tab['for']}' />"; 
    37                         $out.= "<a href='{$tab['url']}#{$tab['for']}'>"; 
    38                         $out.= "{$tab['label']}</a></li>"; 
    39                 } 
    40                 $out.= "</ul>"; 
    41  
    42                 if ( $echo ) 
    43                         echo $out; 
    44  
    45                 return $out; 
    46         } 
    47 } 
    48  
    49 function wp_link_panel_custom() { ?> 
    50         <div id="link-panel-id-custom" class="link-panel link-panel-custom link-panel-active"> 
    51                 <input type="hidden" class="link-panel-type" value="custom" /> 
    52                 <label> 
    53                         <span><?php _e('URL:'); ?></span><input class="url-field" type="text" /> 
    54                 </label> 
    55         </div> 
    56 <?php } 
    57  
    58 function wp_link_panel_structure( $panel_type, $name, $queries ) { 
    59         $id = $panel_type . '-' . $name; 
    60          
    61         ?> 
    62         <div id="link-panel-id-<?php echo $id; ?>" class="link-panel link-panel-<?php echo $panel_type; ?>"> 
    63                 <!-- <input type="hidden" class="link-panel-type" value="<?php echo $panel_type; ?>" /> --> 
    64                 <!-- <input type="hidden" class="link-panel-id" value="" /> --> 
    65                 <?php 
    66                  
    67                 $tb = new WP_Tab_Bar(); 
    68                 foreach( $queries as $i => $query ) { 
    69                         $queries[$i]['id'] = "$id-{$query['preset']}"; 
    70                         $tb->add( $queries[$i]['id'], $query['label'] ); 
    71                 } 
    72                 $tb->render(); 
    73  
    74                 foreach( $queries as $query ): ?> 
    75                         <div id="<?php echo $query['id']; ?>" class="wp-tab-panel"> 
    76                                 <input type="hidden" class="wp-tab-panel-query" value="<?php echo $query['preset']; ?>" /> 
    77                                  
    78                         <?php if ( 'search' == $query['preset'] ): ?> 
    79                                 <label for="<?php echo $id; ?>-search-field" class="link-search-wrapper"> 
    80                                         <span><?php _e('Search:'); ?></span> 
    81                                         <input type="text" id="<?php echo $id; ?>-search-field" class="link-search-field" /> 
    82                                         <img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" /> 
    83                                 </label> 
    84                                 <ul id="<?php echo $id; ?>-search-results" class="link-search-results"></ul> 
    85                                  
    86                         <?php else: ?> 
    87                                 <div class="wp-tab-panel-pagelinks wp-tab-panel-pagelinks-top"></div> 
    88                                 <ul> 
    89                                         <li class="wp-tab-panel-loading unselectable"><em><?php _e('Loading...'); ?></em></li> 
    90                                 </ul> 
    91                                 <div class="wp-tab-panel-pagelinks wp-tab-panel-pagelinks-bottom"></div> 
    92                         <?php endif; ?> 
    93                         </div> 
    94                 <?php endforeach; ?> 
    95         </div> 
    96 <?php } 
    97  
    98 function wp_link_query_post_type( $pt_obj, $preset='all', $opts=array() ) { 
    99         $args_base = array( 
    100                 'post_type' => $pt_obj->name, 
     7        $query = array( 
     8                'post_type' => $pt_names, 
    1019                'suppress_filters' => true, 
    10210                'update_post_term_cache' => false, 
    10311                'update_post_meta_cache' => false, 
    10412                'post_status' => 'publish', 
     13                'order' => 'DESC', 
     14                'orderby' => 'post_date', 
     15                'posts_per_page' => 20, 
    10516        ); 
    106          
    107         switch( $preset ) { 
    108         case 'all': 
    109                 $args = array_merge( $args_base, array( 
    110                         'order' => 'ASC', 
    111                         'orderby' => 'title', 
    112                         'posts_per_page' => 20, 
    113                 )); 
    114                 break; 
    115         case 'recent': 
    116                 $args = array_merge( $args_base, array( 
    117                         'order' => 'DESC', 
    118                         'orderby' => 'post_date', 
    119                         'posts_per_page' => 15, 
    120                 )); 
    121                 break; 
    122         case 'search': 
    123                 $args = array_merge( $args_base, array( 
    124                         's' => isset($opts['search']) ? $opts['search'] : '', 
    125                         'posts_per_page' => 10 
    126                 )); 
    127                 break; 
    128         } 
    129          
    130         // Handle pages if a page number is specified. 
    131         if ( isset( $opts['pagenum'] ) && isset( $args['posts_per_page'] ) ) { 
    132                 $pages = array( 
    133                         'current' => $opts['pagenum'], 
    134                         'per_page' => $args['posts_per_page'] 
    135                 ); 
    136                  
    137                 if ( ! isset( $args['offset'] ) ) 
    138                         $args['offset'] = 0 < $opts['pagenum'] ? $args['posts_per_page'] * ( $opts['pagenum'] - 1 ) : 0; 
    139                 $pages['offset'] = $args['offset']; 
    140         } 
    141          
    142         // Allow args to be extended. 
    143         if ( isset( $opts['args'] ) ) 
    144                 $args = array_merge( $args, $opts['args'] ); 
    145          
     17 
     18        $args['pagenum'] = isset( $args['pagenum'] ) ? absint( $args['pagenum'] ) : 1; 
     19 
     20        if ( isset( $args['s'] ) ) 
     21                $query['s'] = $args['s']; 
     22 
     23        $pagination = array( 
     24                'current'  => $args['pagenum'], 
     25                'per_page' => $query['posts_per_page'], 
     26        ); 
     27 
     28        $query['offset'] = $pagination['offset'] = $args['pagenum'] > 1 ? $query['posts_per_page'] * ( $args['pagenum'] - 1 ) : 0; 
     29 
    14630        // Do main query. 
    14731        $get_posts = new WP_Query; 
    148         $posts = $get_posts->query( $args ); 
     32        $posts = $get_posts->query( $query ); 
    14933        // Check if any posts were found. 
    15034        if ( ! $get_posts->post_count ) 
    15135                return false; 
     
    15337        // Build results. 
    15438        $results = array(); 
    15539        foreach ( $posts as $post ) { 
     40                if ( 'post' == $post->post_type ) 
     41                        $info = mysql2date( __( 'Y/m/d' ), $post->post_date ); 
     42                else 
     43                        $info = $pts[ $post->post_type ]->labels->singular_name; 
     44                 
    15645                $results[] = array( 
    15746                        'ID' => $post->ID, 
    158                         'title' => $post->post_title, 
    159                         'permalink' => get_permalink( $post->ID ) 
    160                 ); 
     47                        'title' => esc_html( strip_tags($post->post_title) ), 
     48                        'permalink' => get_permalink( $post->ID ), 
     49                        'info' => $info, 
     50                );; 
    16151        } 
     52 
     53        // Remaining pagination values. 
     54        $pagination['max'] = $get_posts->max_num_pages; 
     55        $pagination['page_links'] = paginate_links( array( 
     56                'prev_text' => __('&laquo;'), 
     57                'next_text' => __('&raquo;'), 
     58                'total' => $pagination['max'], 
     59                'current' => $pagination['current'] 
     60        ) ); 
     61 
    16262        // Build response. 
    16363        $resp = array( 
    16464                'query' => $get_posts, 
    16565                'objects' => $posts, 
    166                 'results' => $results 
     66                'results' => $results, 
     67                'pages' => $pagination, 
    16768        ); 
    168          
    169         // Set remaining pages values. 
    170         if ( isset( $pages ) ) { 
    171                 $pages['max'] = $resp['query']->max_num_pages; 
    172                 $pages['page_links'] = paginate_links( array( 
    173                         'prev_text' => __('&laquo;'), 
    174                         'next_text' => __('&raquo;'), 
    175                         'total' => $pages['max'], 
    176                         'current' => $pages['current'] 
    177                 )); 
    178                 $resp['pages'] = $pages; 
    179         } 
    180          
     69 
    18170        return $resp; 
    18271} 
    18372 
    18473function wp_link_ajax( $request ) { 
    185         if ( !isset($request['type']) || !isset($request['name']) || !isset($request['preset']) ) 
    186                 die('-1'); 
     74        // Searches have a title term. 
     75        if ( isset( $request['title'] ) ) 
     76                $args['s'] = stripslashes( $request['title'] ); 
     77        $args['pagenum'] = ! empty( $request['page'] ) ? absint( $request['page'] ) : 1; 
    18778 
    188         // Run only presets we recognize. 
    189         if ( 'pt' != $request['type'] || ! in_array( $request['preset'], array('all','search','recent') ) ) 
    190                 die('-1'); 
    191         // Searches must have a search term. 
    192         else if ( 'search' == $request['preset'] && !isset($request['title']) ) 
    193                 die('-1'); 
     79        $resp = wp_link_query( $args ); 
    19480 
    195         $opts = array(); 
    196         if ( 'search' == $request['preset'] ) { 
    197                 $opts['search'] = $request['title']; 
    198         } else if ( ! empty( $request['page'] ) ) { 
    199                 $opts['pagenum'] = $request['page']; 
    200         } 
    201                  
    202         if ( 'pt' == $request['type'] && $obj = get_post_type_object($request['name']) ) 
    203                 $resp = wp_link_query_post_type( $obj, $request['preset'], $opts ); 
    204  
    20581        if ( ! isset( $resp ) ) 
    206                 die('0'); 
     82                die( '0' ); 
    20783 
    20884        $json = array( 'results' => $resp['results'] ); 
    20985        if ( isset( $resp['pages'] ) && !empty( $resp['pages']['page_links'] ) ) 
     
    21288        echo json_encode( $json ); 
    21389        echo "\n"; 
    21490} 
     91 
    21592?> 
     93 No newline at end of file