Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

How difficult would it be to add an option for "nofollow" to the Link editor's existing "Link Relationship(XFN) options list?

Alternately, or better yet, in addition, add an item to the "Bulk Actions" listing called "Make links no follow" that would make all selected links rel="nofollow".

I'd like to add this feature to my theme's functions.php

share|improve this question

4 Answers 4

up vote 1 down vote accepted

Alternatively you can undo the code that disables the relationship box by re-pointing the enqueue to the xfn.js script..

First create a modified version of that script, like so..

jQuery(document).ready( function($) {
    //$('#link_rel').attr('readonly', 'readonly');
    $('#linkxfndiv input').bind('click keyup', function() {
        var isMe = $('#me').is(':checked'), inputs = '';
        $('input.valinp').each( function() {
            if (isMe) {
                $(this).attr('disabled', 'disabled').parent().addClass('disabled');
            } else {
                $(this).removeAttr('disabled').parent().removeClass('disabled');
                if ( $(this).is(':checked') && $(this).val() != '')
                    inputs += $(this).val() + ' ';
            }
        });
        $('#link_rel').val( (isMe) ? 'me' : inputs.substr(0,inputs.length - 1) );
    });
});

Save as xfn.js and place into a plugin's folder or the current theme's folder.

NOTE: It's a direct copy of the original(existing) script enqueued by WordPress, i've left original code that sets the rel input to read-only so you can see what's been changed(one line).

Then add this to your plugin code, or theme's functions.php, and uncomment the appropriate line in the code sample..

function switch_xfn_src( $src, $handle ) {
    if( 'xfn' == $handle )
        //$src = plugins_url( '/xfn.js', __FILE__ ); // For use inside plugin
        //$src = get_bloginfo( 'stylesheet_directory' ) . '/xfn.js'; // For use inside theme
    return $src;
}
add_filter( 'script_loader_src', 'switch_xfn_src', 10, 2 );

Job done... :)

share|improve this answer
    
Very slick. I'm liking these jQuery solutions. Need to look into that 'script_loader_src' filter. –  goldenapples Dec 17 '10 at 17:50
    
But on second look, this doesn't really add an option for nofollow, so that clicking on any of the options will remove nofollow from the list of attributes. –  goldenapples Dec 17 '10 at 17:53

I'm not sure there's a filter or action in there. If so, reasonably easy. If not, use my External Links plugin:

http://wordpress.org/extend/plugins/sem-external-links/

share|improve this answer
    
There's no filter or actions in there, unfortunately. We looked through it on a thread yesterday. You would have to remove that link_relationship_xfn meta box and add a new one. –  goldenapples Dec 10 '10 at 19:08
    
No problem with that. Let's say I want to add a new one. Is there an example you could reference? –  Scott B Dec 11 '10 at 5:17

Here's a function which removes the existing link_xfn meta box, and adds another identical one with a checkbox for "nofollow":

add_action( 'admin_menu', 'nofollow_enabled_xfn_box' );

function nofollow_enabled_xfn_box() {
    global $pagenow;
    if ( $pagenow != 'link.php' ) return;

    remove_meta_box( 'linkxfndiv', 'link', 'normal' );
    add_meta_box('linkxfndiv', __('Link Relationship (XFN)'), 'se5160_link_xfn_meta_box', 'link', 'normal' );
}

/**
 * Modified xfn form fields box, with "nofollow" link.
 *
 * @based on function link_xfn_meta_box() (from /wp-admin/includes/meta-boxes.php)
 *
 * @param object $link
 */
function se5160_link_xfn_meta_box($link) {
?>
<table class="editform" style="width: 100%;" cellspacing="2" cellpadding="5">
    <tr>
        <th style="width: 20%;" scope="row"><label for="link_rel"><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('rel:') ?></label></th>
        <td style="width: 80%;"><input type="text" name="link_rel" id="link_rel" size="50" value="<?php echo ( isset( $link->link_rel ) ? esc_attr($link->link_rel) : ''); ?>" /></td>
    </tr>
    <tr>
        <td colspan="2">
            <table cellpadding="3" cellspacing="5" class="form-table">
                <tr>
                <th scope="row"> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('nofollow') ?> </th>
                <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('not a trusted link') ?> </span></legend>
                    <label for="nofollow">
                    <input class="valinp" type="checkbox" name="nofollow" value="nofollow" id="nofollow" <?php xfn_check('seo','nofollow'); ?> />
                    <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('not a trusted link') ?></label>
                    </fieldset></td>
                </tr>
                <tr>
                    <th scope="row"> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('identity') ?> </th>
                    <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('identity') ?> </span></legend>
                        <label for="me">
                        <input type="checkbox" name="identity" value="me" id="me" <?php xfn_check('identity', 'me'); ?> />
                        <?php _e('another web address of mine') ?></label>
                    </fieldset></td>
                </tr>
                <tr>
                    <th scope="row"> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('friendship') ?> </th>
                    <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('friendship') ?> </span></legend>
                        <label for="contact">
                        <input class="valinp" type="radio" name="friendship" value="contact" id="contact" <?php xfn_check('friendship', 'contact'); ?> /> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('contact') ?></label>
                        <label for="acquaintance">
                        <input class="valinp" type="radio" name="friendship" value="acquaintance" id="acquaintance" <?php xfn_check('friendship', 'acquaintance'); ?> />  <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('acquaintance') ?></label>
                        <label for="friend">
                        <input class="valinp" type="radio" name="friendship" value="friend" id="friend" <?php xfn_check('friendship', 'friend'); ?> /> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('friend') ?></label>
                        <label for="friendship">
                        <input name="friendship" type="radio" class="valinp" value="" id="friendship" <?php xfn_check('friendship'); ?> /> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('none') ?></label>
                    </fieldset></td>
                </tr>
                <tr>
                    <th scope="row"> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('physical') ?> </th>
                    <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('physical') ?> </span></legend>
                        <label for="met">
                        <input class="valinp" type="checkbox" name="physical" value="met" id="met" <?php xfn_check('physical', 'met'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('met') ?></label>
                    </fieldset></td>
                </tr>
                <tr>
                    <th scope="row"> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('professional') ?> </th>
                    <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('professional') ?> </span></legend>
                        <label for="co-worker">
                        <input class="valinp" type="checkbox" name="professional" value="co-worker" id="co-worker" <?php xfn_check('professional', 'co-worker'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('co-worker') ?></label>
                        <label for="colleague">
                        <input class="valinp" type="checkbox" name="professional" value="colleague" id="colleague" <?php xfn_check('professional', 'colleague'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('colleague') ?></label>
                    </fieldset></td>
                </tr>
                <tr>
                    <th scope="row"> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('geographical') ?> </th>
                    <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('geographical') ?> </span></legend>
                        <label for="co-resident">
                        <input class="valinp" type="radio" name="geographical" value="co-resident" id="co-resident" <?php xfn_check('geographical', 'co-resident'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('co-resident') ?></label>
                        <label for="neighbor">
                        <input class="valinp" type="radio" name="geographical" value="neighbor" id="neighbor" <?php xfn_check('geographical', 'neighbor'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('neighbor') ?></label>
                        <label for="geographical">
                        <input class="valinp" type="radio" name="geographical" value="" id="geographical" <?php xfn_check('geographical'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('none') ?></label>
                    </fieldset></td>
                </tr>
                <tr>
                    <th scope="row"> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('family') ?> </th>
                    <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('family') ?> </span></legend>
                        <label for="child">
                        <input class="valinp" type="radio" name="family" value="child" id="child" <?php xfn_check('family', 'child'); ?>  />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('child') ?></label>
                        <label for="kin">
                        <input class="valinp" type="radio" name="family" value="kin" id="kin" <?php xfn_check('family', 'kin'); ?>  />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('kin') ?></label>
                        <label for="parent">
                        <input class="valinp" type="radio" name="family" value="parent" id="parent" <?php xfn_check('family', 'parent'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('parent') ?></label>
                        <label for="sibling">
                        <input class="valinp" type="radio" name="family" value="sibling" id="sibling" <?php xfn_check('family', 'sibling'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('sibling') ?></label>
                        <label for="spouse">
                        <input class="valinp" type="radio" name="family" value="spouse" id="spouse" <?php xfn_check('family', 'spouse'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('spouse') ?></label>
                        <label for="family">
                        <input class="valinp" type="radio" name="family" value="" id="family" <?php xfn_check('family'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('none') ?></label>
                    </fieldset></td>
                </tr>
                <tr>
                    <th scope="row"> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('romantic') ?> </th>
                    <td><fieldset><legend class="screen-reader-text"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('romantic') ?> </span></legend>
                        <label for="muse">
                        <input class="valinp" type="checkbox" name="romantic" value="muse" id="muse" <?php xfn_check('romantic', 'muse'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('muse') ?></label>
                        <label for="crush">
                        <input class="valinp" type="checkbox" name="romantic" value="crush" id="crush" <?php xfn_check('romantic', 'crush'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('crush') ?></label>
                        <label for="date">
                        <input class="valinp" type="checkbox" name="romantic" value="date" id="date" <?php xfn_check('romantic', 'date'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('date') ?></label>
                        <label for="romantic">
                        <input class="valinp" type="checkbox" name="romantic" value="sweetheart" id="romantic" <?php xfn_check('romantic', 'sweetheart'); ?> />
                        <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('sweetheart') ?></label>
                    </fieldset></td>
                </tr>
            </table>
        </td>
    </tr>
</table>
<p><?php _e('If the link is to a person, you can specify your relationship with them using the above form. If you would like to learn more about the idea check out <a href="http://gmpg.org/xfn/">XFN</a>.'); ?></p>
<?php
}

A lot of copypasta from core, but its better than a hack. You of course are free to change the xfn options in any way you want.

share|improve this answer
    
Sweet! Testing it now. Thanks :) –  Scott B Dec 12 '10 at 3:42

It's already in there. You only need to deactivate javascript in your browser and reload the page. You can now enter freely nofollow.

If you ask yourself why I know that: The related ticket is #14599: Link Manager does not support nofollow in Link Relationship (XFN)

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.