WordPress.org

Make WordPress Core

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

File internal-linking.second-pass.diff, 32.5 KB (added by koopersmith, 10 years ago)
  • wp-includes/js/tinymce/plugins/wplink/editor_plugin.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 : 380,
     18                                        inline : 1
     19                                }, {
     20                                        plugin_url : url // Plugin absolute URL
     21                                });
     22                        });
     23
     24                        // Register example button
     25                        ed.addButton('wplink', {
     26                                title : ed.getLang('wplink.link_desc'),
     27                                cmd : 'WP_Link'
     28                        });
     29                       
     30                        ed.addShortcut('alt+shift+a', ed.getLang('wplink.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/plugins/wplink/js/wplink.js

     
     1// WPTABS
     2(function($){
     3        $.widget('wp.wpTabs', {
     4                options: {
     5                       
     6                },
     7                _create: function() {
     8                        var self = this,
     9                                ul = this.element,
     10                                lis = ul.children();
     11                       
     12                        this.active = lis.filter('.wp-tab-active');
     13                        // Calculate panel IDs
     14                        lis.each(function() {
     15                                var panel = self._getPanel( $(this) );
     16                                if ( self.active[0] == this )
     17                                        panel.show();
     18                                else
     19                                        panel.hide();
     20                        });
     21                       
     22                        ul.delegate('li', 'click.wpTabs', function(e) {
     23                                var li = $(this);
     24                               
     25                                // Prevent any child link from redirecting the page.
     26                                e.preventDefault();
     27                                // Deactivate previous tab.
     28                                self._getPanel( self.active ).hide();
     29                                self.active.removeClass('wp-tab-active');
     30                                // Activate current tab.
     31                                self.active = li.addClass('wp-tab-active');
     32                                self._getPanel( self.active ).show();
     33                        });
     34                },
     35                _setPanel: function( $el ) {
     36                        var panel = $( '#' + $el[0].id.replace('wp-tab-for-','') );
     37                        $el.data( 'wp-tab-panel', panel );
     38                        return panel;
     39                },
     40                _getPanel: function( $el ) {
     41                        var panel = $el.data('wp-tab-panel');
     42                        return ( !panel || !panel.length ) ? this._setPanel( $el ) : panel;
     43                }
     44        });
     45        // Create tab bars by default.
     46        $(function(){
     47                $('.wp-tab-bar').wpTabs();
     48        });
     49})(jQuery);
     50
     51(function($){   
     52        var inputs = {}, panels, active, ed,
     53        wpLink = {
     54                init : function() {
     55                        var e, etarget, eclass;
     56                        // Init shared vars
     57                        ed = tinyMCEPopup.editor;
     58                        // Secondary options
     59                        inputs.title = $('#link-title-field');
     60                        // Advanced Options
     61                        inputs.advancedOptions = $('#link-advanced-options');
     62                        inputs.target = $('#link-target-select');
     63                        inputs['class'] = $('#link-class-select');
     64                        // Types
     65                        inputs.typeDropdown = $('#link-type');
     66                        inputs.typeOptions = inputs.typeDropdown.find('option');
     67                       
     68                        panels = $('.link-panel');
     69                        active = $('.link-panel-active');
     70                       
     71                        // Build lists
     72                        wpLink.fillClassList('link-class-select');
     73                        wpLink.fillTargetList('link-target-select');
     74                       
     75                        // Extract type names
     76                        inputs.typeOptions.each( function(){
     77                                var linkType = this.id.replace(/^link-option-id-/,''),
     78                                        parts = linkType.split('-');
     79                                $(this).data( 'link-type', {
     80                                        full : linkType,
     81                                        type : parts[0],
     82                                        name : parts[1] || ''
     83                                });
     84                        });
     85                        panels.each( function(){
     86                                var linkType = this.id.replace(/^link-panel-id-/,''),
     87                                        parts = linkType.split('-');
     88                                $(this).data( 'link-type', {
     89                                        full : linkType,
     90                                        type : parts[0],
     91                                        name : parts[1] || ''
     92                                });
     93                        });
     94                       
     95                        // Bind event handlers
     96                        inputs.typeDropdown.change( wpLink.selectPanel );
     97                        $('#wp-update').click( wpLink.update );
     98                        $('#wp-cancel').click( function() { tinyMCEPopup.close(); } );
     99                        $('#link-advanced-options-toggle').click( wpLink.toggleAdvancedOptions );
     100                        $('.link-panel .wp-tab-panel').delegate('li', 'click', wpLink.selectInternalLink );
     101                        $('.link-panel .link-search-field').keyup( wpLink.searchInternalLinks );
     102                       
     103                        // If link exists, select proper values.
     104                        e = ed.dom.getParent(ed.selection.getNode(), 'A');
     105                        if ( ! e )
     106                                return;
     107                       
     108                        // @TODO: select proper panel/fill values when a link is edited
     109                        active.find('input.url-field').val( e.href );
     110                        inputs.title.val( ed.dom.getAttrib(e, 'title') );
     111                        // Advanced Options
     112                        inputs.target.val( etarget = ed.dom.getAttrib(e, 'target') );
     113                        inputs['class'].val( eclass = ed.dom.getAttrib(e, 'class') );
     114                        if ( etarget || eclass ) // Open the adv. options if one is set.
     115                                inputs.advancedOptions.toggleClass('adv-options-active');
     116                },
     117               
     118                update : function() {
     119                        var el,
     120                                ed = tinyMCEPopup.editor,
     121                                attrs = {
     122                                        title : inputs.title.val(),
     123                                        target : inputs.target.val(),
     124                                        'class' : inputs['class'].val()
     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                },
     207               
     208                toggleAdvancedOptions : function() {
     209                        inputs.advancedOptions.toggleClass('adv-options-active');
     210                        return false;
     211                },
     212               
     213                selectInternalLink : function() {
     214                        $(this).siblings('.selected').removeClass('selected');
     215                        $(this).addClass('selected');
     216                },
     217               
     218                searchInternalLinks : function() {
     219                        var t = $(this),
     220                                linkType = t.parents('.link-panel').data('link-type'),
     221                                waiting = t.siblings('img.waiting').show();
     222                        $.post( ajaxurl, {
     223                                action : 'wp-link-search',
     224                                type : linkType.type,
     225                                name : linkType.name,
     226                                title : t.val()
     227                        }, function(r) {
     228                                var s = '';
     229                                $.each( r, function() {
     230                                        s+= '<li id="link-to-' + linkType.full + '-' + this['ID'] + '">';
     231                                        s+= '<input type="hidden" value="' + this['permalink'] + '" />';
     232                                        s+= this['title'] + '</li>';
     233                                });
     234                               
     235                                t.parent().siblings('ul').html( s );
     236                                waiting.hide();
     237                        }, "json");
     238                },
     239               
     240                /**
     241                 * Taken from themes/advanced/js/link.js
     242                 */
     243                fillClassList : function(id) {
     244                        var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
     245
     246                        if (v = tinyMCEPopup.getParam('theme_advanced_styles')) {
     247                                cl = [];
     248
     249                                tinymce.each(v.split(';'), function(v) {
     250                                        var p = v.split('=');
     251
     252                                        cl.push({'title' : p[0], 'class' : p[1]});
     253                                });
     254                        } else
     255                                cl = tinyMCEPopup.editor.dom.getClasses();
     256
     257                        if (cl.length > 0) {
     258                                lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
     259
     260                                tinymce.each(cl, function(o) {
     261                                        lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']);
     262                                });
     263                        } else
     264                                dom.remove(dom.getParent(id, 'tr'));
     265                },
     266
     267                /**
     268                 * Taken from themes/advanced/js/link.js
     269                 */
     270                fillTargetList : function(id) {
     271                        var dom = tinyMCEPopup.dom, lst = dom.get(id), v;
     272
     273                        lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
     274                        lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self');
     275                        lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank');
     276
     277                        if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) {
     278                                tinymce.each(v.split(','), function(v) {
     279                                        v = v.split('=');
     280                                        lst.options[lst.options.length] = new Option(v[0], v[1]);
     281                                });
     282                        }
     283                }
     284        }
     285       
     286        $(document).ready( wpLink.init );
     287})(jQuery);
     288 No newline at end of file
  • wp-includes/js/tinymce/langs/wp-langs-en.js

     
    429429caption:"Edit Image Caption",
    430430alt:"Edit Alternate Text"
    431431});
     432
     433tinyMCE.addI18n("en.wplink",{
     434link_desc:"Insert/edit link",
     435unlink_desc:"Unlink (Alt+Shift+S)"
     436});
  • wp-includes/js/tinymce/langs/wp-langs.php

     
    452452caption:"' . mce_escape( __('Edit Image Caption') ) . '",
    453453alt:"' . mce_escape( __('Edit Alternate Text') ) . '"
    454454});
     455
     456tinyMCE.addI18n("' . $language . '.wplink",{
     457link_desc:"' . mce_escape( __('Insert/edit link') ) . '",
     458unlink_desc:"' . mce_escape( __('Unlink') ) . ' (Alt+Shift+S)"
     459});
    455460';
  • wp-includes/js/tinymce/themes/advanced/skins/wp_theme/ui.css

     
    274274.wp_themeSkin span.mce_anchor {background-position:-200px 0}
    275275.wp_themeSkin span.mce_indent {background-position:-400px 0}
    276276.wp_themeSkin span.mce_outdent {background-position:-540px 0}
    277 .wp_themeSkin span.mce_link {background-position:-500px 0}
     277.wp_themeSkin span.mce_link,
     278.wp_themeSkin span.mce_wplink {background-position:-500px 0}
    278279.wp_themeSkin span.mce_unlink {background-position:-640px 0}
    279280.wp_themeSkin span.mce_sub {background-position:-600px 0}
    280281.wp_themeSkin span.mce_sup {background-position:-620px 0}
  • 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//]]>
     14</script>
     15<script type="text/javascript" src="tiny_mce_popup.js?ver=3223"></script>
     16<?php
     17wp_print_scripts( array('jquery', 'jquery-ui-widget') );
     18?>
     19<script type="text/javascript" src="plugins/wplink/js/wplink.js?ver=1.0"></script>
     20<?php
     21wp_admin_css( 'global', true );
     22wp_admin_css( 'wp-admin', true );
     23wp_admin_css( 'colors-fresh', true );
     24?>
     25<style>
     26html, body {
     27        background: #f1f1f1;
     28}
     29
     30a:link, a:visited {
     31        color: #21759B;
     32}
     33
     34select {
     35        height: 2em;
     36}
     37
     38#link-header,
     39#link-options,
     40#link-advanced-options {
     41        padding: 5px;
     42        border-bottom: 1px solid #dfdfdf;
     43}
     44#link-type {
     45        width: 140px;
     46}
     47
     48.link-panel {
     49        padding: 5px 5px 0;
     50        display: none;
     51}
     52        .link-panel-active {
     53                display: block;
     54        }
     55
     56label input[type="text"] {
     57        width: 220px;
     58}
     59        .wp-tab-panel label input[type="text"] {
     60                float: left;
     61                width: 200px;
     62        }
     63
     64label span {
     65        display: inline-block;
     66        width: 80px;
     67        text-align: right;
     68        padding-right: 5px;
     69}
     70        .wp-tab-panel label span {
     71                width: auto;
     72                text-align: left;
     73                float: left;
     74                margin-top: 3px;
     75        }
     76        .link-search-wrapper {
     77                padding: 5px;
     78                border-bottom: solid 1px #dfdfdf;
     79                display: block;
     80                overflow: hidden;
     81        }
     82                .link-search-wrapper img.waiting {
     83                        margin: 4px 1px 0 4px;
     84                        float: left;
     85                        display: none;
     86                }
     87
     88#link-advanced-options,
     89#link-advanced-options select,
     90#link-advanced-options option {
     91        font-size: 11px;
     92}
     93
     94#link-advanced-options {
     95        background: #f9f9f9;
     96        padding: 3px 5px;
     97}
     98        #link-advanced-options label select {
     99                width: 195px;
     100        }
     101
     102#link-advanced-options-toggle {
     103        display: block;
     104}
     105
     106#link-advanced-options label {
     107        padding-top: 2px;
     108        display: none;
     109}
     110        #link-advanced-options.adv-options-active label {
     111                display: block;
     112        }
     113
     114.submitbox {
     115        padding: 5px;
     116        font-size: 11px;
     117        overflow: auto;
     118        height: 29px;
     119}
     120#wp-cancel {
     121        line-height: 25px;
     122        float: left;
     123}
     124#wp-update {
     125        line-height: 23px;
     126        float: right;
     127}
     128#wp-update a {
     129        display: inline-block;
     130}
     131.wp-tab-active,
     132.wp-tab-panel {
     133        background: #fff;
     134}
     135        .wp-tab-panel {
     136                height: 160px;
     137                padding: 0;
     138        }
     139.wp-tab-panel li {
     140        margin-bottom: 0;
     141        border-bottom: 1px solid #dfdfdf;
     142        color: #555;
     143        padding: 4px 6px;
     144        cursor: pointer;
     145}
     146        .wp-tab-panel li:hover {
     147                background: #EAF2FA;
     148                color: #333;
     149        }
     150        .wp-tab-panel li.selected {
     151                background: #f1f1f1;
     152                font-weight: bold;
     153                color: #333;
     154        }
     155.wp-tab-panel-pagelinks {
     156        padding:4px 0;
     157        margin:0 auto;
     158        text-align:center;
     159}
     160        .wp-tab-panel-pagelinks-top {
     161                border-bottom: 1px solid #dfdfdf;
     162        }
     163</style>
     164</head>
     165<?php
     166
     167
     168$panels = array();
     169foreach ( $pts as $pt_obj ) {
     170        $panel = new WP_Link_Panel( 'pt', $pt_obj, array(
     171                array( 'preset' => 'all', 'label' => __('View All'), 'pagenum' => 1 ),
     172                array( 'preset' => 'recent', 'label' => __('Most Recent') ),
     173        ));
     174        if ( !empty( $panel->queries[0]['data'] ) )
     175                $panels[] = $panel;
     176}
     177foreach ( $taxes as $tax_obj ) {
     178        $panel = new WP_Link_Panel( 'tax', $tax_obj, array(
     179                array( 'preset' => 'all', 'label' => __('View All'), 'pagenum' => 1 ),
     180                array( 'preset' => 'popular', 'label' => __('Most Used') ),
     181        ));
     182        if ( !empty( $panel->queries[0]['data'] ) )
     183                $panels[] = $panel;
     184}
     185
     186?>
     187<body id="post-body">
     188<div id="link-header">
     189        <label for="link-type">
     190                <span><strong><?php _e('Link Type:'); ?></strong>
     191                </span><select id="link-type">
     192                        <option id="link-option-id-custom" class="link-custom"><?php _e('External Link'); ?></option>
     193                <?php
     194                foreach ( $panels as $panel ) {
     195                        echo "<option id='link-option-id-$panel->id' class='link-option-pt'>";
     196                        echo $panel->labels->singular_name . '</option>';
     197                } ?>
     198                </select>
     199        </label>
     200</div>
     201<div id="link-selector">
     202        <?php
     203        wp_link_panel_custom();
     204        foreach( $panels as $panel )
     205                $panel->render();
     206        ?>
     207        <div id="link-options">
     208                <label for="link-title-field">
     209                        <span><?php _e('Description:'); ?></span><input id="link-title-field" type="text" />
     210                </label>
     211        </div>
     212        <div id="link-advanced-options">
     213                <a id="link-advanced-options-toggle" href="#"><?php _e('Advanced Options'); ?></a>
     214                <label for="link-target-select">
     215                        <span><?php _e('Target:'); ?></span><select id="link-target-select"></select>
     216                </label>
     217                <label for="link-class-select">
     218                        <span><?php _e('Class:'); ?></span><select id="link-class-select"></select>
     219                </label>
     220        </div>
     221</div>
     222<div class="submitbox">
     223        <div id="wp-cancel">
     224                <a class="submitdelete deletion"><?php _e('Cancel'); ?></a>
     225        </div>
     226        <div id="wp-update">
     227                <a class="button-primary"><?php _e('Update'); ?></a>
     228        </div>
     229</div>
     230</body>
     231</html>
  • wp-includes/js/tinymce/wp-mce-link-includes.php

     
     1<?php
     2/** @ignore */
     3if ( ! defined('ABSPATH') )
     4        require_once('../../../wp-load.php');
     5
     6function wp_tab_bar( $tabs, $active=null, $echo=true ) {
     7        if ( empty( $active ) )
     8                $active = $tabs[0]['for'];
     9       
     10        $out = "<ul class='wp-tab-bar'>";
     11        foreach( $tabs as $tab ) {
     12                if ( !isset($tab['url']) )
     13                        $tab['url'] = '';
     14               
     15                $out.= "<li id='wp-tab-for-{$tab['for']}' class='";
     16                $out.= $active == $tab['for'] ? 'wp-tab-active' : '';
     17                $out.= "'><a href='{$tab['url']}#{$tab['for']}'>";
     18                $out.= "{$tab['title']}</a></li>";
     19        }
     20        $out.= "</ul>";
     21       
     22        if ( $echo )
     23                echo $out;
     24       
     25        return $out;
     26}
     27
     28function wp_tab_bar_item( $title, $id, $url='' ) {
     29        return array(
     30                'title' => $title,
     31                'for' => $id,
     32                'url' => $url
     33        );
     34}
     35
     36// Set up some vars
     37$pts = get_post_types( array( 'public' => true, 'show_ui' => true ), 'objects' );
     38$taxes = get_taxonomies( array( 'public' => true, 'show_ui' => true ), 'objects' );
     39
     40// Helper functions
     41function wp_link_panel_custom() { ?>
     42        <div id="link-panel-id-custom" class="link-panel link-panel-custom link-panel-active">
     43                <label>
     44                        <span><?php _e('URL:'); ?></span><input class="url-field" type="text" />
     45                </label>
     46        </div>
     47<?php }
     48
     49class WP_Link_Panel {
     50        /**
     51         * The type of data contained: post type or taxonomy.
     52         *
     53         * @var string 'pt' or 'tax'
     54         */
     55        var $obj_type;
     56        /**
     57         * Either a post type object or a taxonomy object.
     58         *
     59         * @var object
     60         */
     61        var $obj;
     62        /**
     63         * An array of array('slug' => string, 'preset' => string, 'label' => string, ['pagenum' => int])
     64         *
     65         * @var array
     66         */
     67        var $queries;
     68        /**
     69         * The pt/tax name.
     70         *
     71         * @var string
     72         */
     73        var $name;
     74        /**
     75         * The pt/tax id (combined with the obj_type).
     76         *
     77         * @var string
     78         */
     79        var $id;
     80        /**
     81         * The pt/tax labels.
     82         *
     83         * @var string
     84         */
     85        var $labels;
     86       
     87        function WP_Link_Panel( $obj_type, $obj, $queries ) {
     88                if ( !in_array( $obj_type, array('pt','tax') ) )
     89                        return;
     90               
     91                $this->obj_type = $obj_type;
     92                $this->obj = $obj;
     93                $this->name = $obj->name;
     94                $this->id = esc_attr("$this->obj_type-$this->name");
     95                $this->labels = $obj->labels;
     96               
     97                foreach( $queries as $i => $query ) {
     98                        if ( !isset( $query['slug'] ) )
     99                                $queries[$i]['slug'] = $query['preset'];
     100                       
     101                        $args = array();
     102                        if ( isset( $query['pagenum'] ) )
     103                                $args['pagenum'] = $query['pagenum'];
     104                       
     105                        if ( 'pt' == $this->obj_type )
     106                                $queries[$i]['data'] = wp_link_query_post_type( $this->obj, $query['preset'], $args );
     107                        else
     108                                $queries[$i]['data'] = wp_link_query_taxonomy( $this->obj, $query['preset'], $args );
     109                }
     110               
     111                $this->queries = $queries;
     112        }
     113       
     114        /**
     115         * Render the link data.
     116         */
     117        function render() {
     118                $id = $this->id;
     119                $tabs = $this->queries;
     120                ?>
     121                <div id="link-panel-id-<?php echo $id; ?>" class="link-panel link-panel-<?php echo $this->obj_type; ?>">
     122                        <?php
     123
     124                        $tbitems = array();
     125                        foreach( $tabs as $i => $tab ) {
     126                                $tabs[$i]['id'] = "$id-{$tabs[$i]['slug']}";
     127                                $tbitems[] = wp_tab_bar_item( $tabs[$i]['label'], $tabs[$i]['id'] );
     128                        }
     129                        array_push( $tbitems, wp_tab_bar_item( __('Search'), "$id-search" ) );
     130                        wp_tab_bar( $tbitems );
     131
     132                        foreach( $tabs as $tab ):
     133                                $data = $tab['data'];
     134                                $slug = $tab['slug'];
     135                                ?>
     136                        <div id="<?php echo $tab['id']; ?>" class="wp-tab-panel">
     137                                <?php if ( isset( $data['pages'] ) && ! empty( $data['pages']['page_links'] ) ) : ?>
     138                                        <div class="wp-tab-panel-pagelinks wp-tab-panel-pagelinks-top">
     139                                                <?php echo $data['pages']['page_links']; ?>
     140                                        </div>
     141                                <?php endif; ?>
     142                                <ul>
     143                                        <?php
     144                                        foreach( $data['results'] as $result ): ?>
     145                                        <li id="link-to-<?php echo "$id-" . esc_attr( $result['ID'] ); ?>">
     146                                                <input type="hidden" value="<?php echo esc_url( $result['permalink'] ); ?>" />
     147                                                <?php
     148                                                echo empty( $result['title'] ) ? '<em>' . __('Untitled') . '</em>' : esc_html( $result['title'] ); ?>
     149                                        </li>
     150                                        <?php endforeach; ?>
     151                                </ul>
     152                                <?php if ( isset( $data['pages'] ) && ! empty( $data['pages']['page_links'] ) ) : ?>
     153                                        <div class="wp-tab-panel-pagelinks wp-tab-panel-pagelinks-bottom">
     154                                                <?php echo $data['pages']['page_links']; ?>
     155                                        </div>
     156                                <?php endif; ?>
     157                        </div>
     158                        <?php endforeach; ?>
     159                        <div id="<?php echo $id; ?>-search" class="wp-tab-panel">
     160                                <label for="<?php echo $id; ?>-search-field" class="link-search-wrapper">
     161                                        <span><?php _e('Search:'); ?></span>
     162                                        <input type="text" id="<?php echo $id; ?>-search-field" class="link-search-field" />
     163                                        <img class="waiting" src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" />
     164                                </label>
     165                                <ul id="<?php echo $id; ?>-search-results" class="link-search-results"></ul>
     166                        </div>
     167                </div>
     168        <?php }
     169}
     170
     171function wp_link_query_post_type( $pt_obj, $preset='all', $opts=array() ) {
     172        $args_base = array(
     173                'post_type' => $pt_obj->name,
     174                'suppress_filters' => true,
     175                'update_post_term_cache' => false,
     176                'update_post_meta_cache' => false,
     177                'post_status' => 'publish',
     178        );
     179       
     180        switch( $preset ) {
     181                case 'all':
     182                        $args = array_merge( $args_base, array(
     183                                'order' => 'ASC',
     184                                'orderby' => 'title',
     185                                'posts_per_page' => 20,
     186                        ));
     187                        break;
     188                case 'recent':
     189                        $args = array_merge( $args_base, array(
     190                                'order' => 'DESC',
     191                                'orderby' => 'post_date',
     192                                'posts_per_page' => 15,
     193                        ));
     194                        break;
     195        case 'search':
     196                $args = array_merge( $args_base, array(
     197                        's' => $opts['search'],
     198                        'posts_per_page' => 10
     199                ));
     200                break;
     201        }
     202       
     203        // Handle pages if a page number is specified.
     204        if ( isset( $opts['pagenum'] ) && isset( $args['posts_per_page'] ) ) {
     205                $pages = array(
     206                        'current' => $opts['pagenum'],
     207                        'per_page' => $args['posts_per_page']
     208                );
     209               
     210                if ( ! isset( $args['offset'] ) )
     211                        $args['offset'] = 0 < $opts['pagenum'] ? $args['posts_per_page'] * ( $opts['pagenum'] - 1 ) : 0;
     212                $pages['offset'] = $args['offset'];
     213        }
     214       
     215        // Do main query.
     216        $get_posts = new WP_Query;
     217        $posts = $get_posts->query( $args );
     218        // Check if any posts were found.
     219        if ( ! $get_posts->post_count )
     220                return false;
     221       
     222        // Build results.
     223        $results = array();
     224        foreach ( $posts as $post ) {
     225                $results[] = array(
     226                        'ID' => $post->ID,
     227                        'title' => $post->post_title,
     228                        'permalink' => get_permalink( $post->ID )
     229                );
     230        }
     231        // Build response.
     232        $resp = array(
     233                'query' => $get_posts,
     234                'objects' => $posts,
     235                'results' => $results
     236        );
     237       
     238        // Set remaining pages values.
     239        if ( isset( $pages ) ) {
     240                $pages['max'] = $resp['query']->max_num_pages;
     241                $pages['page_links'] = paginate_links( array(
     242                        'prev_text' => __('&laquo;'),
     243                        'next_text' => __('&raquo;'),
     244                        'total' => $pages['max'],
     245                        'current' => $pages['current']
     246                ));
     247                $resp['pages'] = $pages;
     248        }
     249       
     250        return $resp;
     251}
     252
     253function wp_link_query_taxonomy( $tax_obj, $preset='all', $opts=array() ) {
     254        switch( $preset ) {
     255                case 'all':
     256                        $args = array(
     257                                'child_of' => 0,
     258                                'exclude' => '',
     259                                'hide_empty' => false,
     260                                'hierarchical' => 1,
     261                                'include' => '',
     262                                'include_last_update_time' => false,
     263                                'number' => 30,
     264                                'order' => 'ASC',
     265                                'orderby' => 'name',
     266                                'pad_counts' => false,
     267                        );
     268                        break;
     269                case 'popular':
     270                        $args = array(
     271                                'orderby' => 'count',
     272                                'order' => 'DESC',
     273                                'number' => 10,
     274                                'hierarchical' => false
     275                        );
     276                        break;
     277                case 'search':
     278                        $args = array(
     279                                'name__like' => $opts['search'],
     280                                'number' => 10
     281                        );
     282                        break;
     283        }
     284       
     285        // Handle pages if a page number is specified.
     286        if ( isset( $opts['pagenum'] ) && isset( $args['number'] ) ) {
     287                $pages = array(
     288                        'current' => $opts['pagenum'],
     289                        'per_page' => $args['number']
     290                );
     291               
     292                $pages['max'] = ceil( wp_count_terms( $tax_obj->name , array_merge( $args, array('number' => '', 'offset' => '') ) ) / $pages['per_page'] );
     293               
     294                if ( ! isset( $args['offset'] ) )
     295                        $args['offset'] = 0 < $opts['pagenum'] ? $args['number'] * ( $opts['pagenum'] - 1 ) : 0;
     296                $pages['offset'] = $args['offset'];
     297               
     298                $pages['page_links'] = paginate_links( array(
     299                        'prev_text' => __('&laquo;'),
     300                        'next_text' => __('&raquo;'),
     301                        'total' => $pages['max'],
     302                        'current' => $pages['current']
     303                ));
     304        }
     305       
     306        // Do the main query.
     307        $terms = get_terms( $tax_obj->name, $args );
     308        // Check if any terms were found.
     309        if ( ! $terms || is_wp_error($terms) )
     310                return false;
     311       
     312        // Build results.
     313        $results = array();
     314        foreach ( $terms as $term ) {
     315                $results[] = array(
     316                        'ID' => $term->term_id,
     317                        'title' => $term->name,
     318                        'permalink' => get_term_link( $term )
     319                );
     320        }
     321       
     322        // Build response.
     323        $resp = array(
     324                'objects' => $terms,
     325                'results' => $results
     326        );
     327        if ( isset( $pages ) )
     328                $resp['pages'] = $pages;
     329       
     330        return $resp;
     331}
     332?>
     333 No newline at end of file
  • wp-admin/admin-ajax.php

     
    11021102
    11031103        exit;
    11041104        break;
     1105        case 'wp-link-search':
     1106                require_once ABSPATH . WPINC . '/js/tinymce/wp-mce-link-includes.php';
     1107
     1108                if ( !isset($_REQUEST['type']) || !isset($_REQUEST['name']) || !isset($_REQUEST['title']) )
     1109                        die('-1');
     1110
     1111                if ( 'pt' == $_REQUEST['type'] && $obj = get_post_type_object($_REQUEST['name']) )
     1112                        $resp = wp_link_query_post_type( $obj, 'search', array('search' => $_REQUEST['title']) );
     1113                else if ( 'tax' == $_REQUEST['type'] && $obj = get_taxonomy($_REQUEST['name']) )
     1114                        $resp = wp_link_query_taxonomy( $obj, 'search', array('search' => $_REQUEST['title']) );
     1115                else
     1116                        die('-1');
     1117
     1118                if ( !$resp )
     1119                        die('0');
     1120
     1121                echo json_encode($resp['results']);
     1122                echo "\n";
     1123
     1124                exit;
     1125                break;
    11051126case 'menu-locations-save':
    11061127        if ( ! current_user_can( 'edit_theme_options' ) )
    11071128                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'.
     
    13981398        $plugins = implode($plugins, ',');
    13991399
    14001400        if ( $teeny ) {
    1401                 $mce_buttons = apply_filters( 'teeny_mce_buttons', array('bold, italic, underline, blockquote, separator, strikethrough, bullist, numlist,justifyleft, justifycenter, justifyright, undo, redo, link, unlink, fullscreen') );
     1401                $mce_buttons = apply_filters( 'teeny_mce_buttons', array('bold, italic, underline, blockquote, separator, strikethrough, bullist, numlist,justifyleft, justifycenter, justifyright, undo, redo, wplink, unlink, fullscreen') );
    14021402                $mce_buttons = implode($mce_buttons, ',');
    14031403                $mce_buttons_2 = $mce_buttons_3 = $mce_buttons_4 = '';
    14041404        } else {
    1405                 $mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'blockquote', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'link', 'unlink', 'wp_more', '|', 'spellchecker', 'fullscreen', 'wp_adv' ));
     1405                $mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'blockquote', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'wplink', 'unlink', 'wp_more', '|', 'spellchecker', 'fullscreen', 'wp_adv' ));
    14061406                $mce_buttons = implode($mce_buttons, ',');
    14071407
    14081408                $mce_buttons_2 = array('formatselect', 'underline', 'justifyfull', 'forecolor', '|', 'pastetext', 'pasteword', 'removeformat', '|' );
  • 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;