WordPress.org

Make WordPress Core

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

File internal-linking.round-two.diff, 25.2 KB (added by koopersmith, 10 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