<?php
/*
Plugin Name: Test Configure Link
Version: 1.8
Plugin URI: http://dd32.id.au/wordpress-plugins/?configure-link
Description: Plugin to show-case the Ability to add extra Action links.
Author: Dion Hulse
Author URI: http://dd32.id.au/
*/

add_action('admin_init''tcl_admin_init');
function 
tcl_admin_init(){
    
//Load our admin stuff on the admin pages
    
add_options_page('Test Configure Link Options''Test Configure Link''administrator''tcloptions''tcloptions');// Use a string as the file and function methods to produce a "nice" url of ?page=tcloptions
}

register_activation_hook(__FILE__'tcl_activate');
function 
tcl_activate(){
    
//Set defaults upon activation
    
add_option('tcl_location''before');
}

register_deactivation_hook(__FILE__'tcl_deactivate');
function 
tcl_deactivate(){
    
//Cleanup any options, Note that if a plugin upgrade is performed via the automatic upgrader, then this function is never called.
    
delete_option('tcl_location');
}

//Now comes all the actual work
add_filter('plugin_action_links''tcl_filter'102);
function 
tcl_filter($links$plugin){
    
//Static so we dont call plugin_basename on every plugin row.
    
static $this_plugin;
    if( ! 
$this_plugin )
        
$this_plugin plugin_basename(__FILE__);

    if( 
$plugin == $this_plugin ){
        
//For the page value, if its a hard coded string then thats ok, Else, You can do something like this:
        // $page = add_options_page()...;
        // $href = 'options-general.php?page=' . $page;
        //Which takes some more stuffing around with values as its not in the same file. I think strings make it look better though, no ugly filenames :)
        
$link '<a href="options-general.php?page=tcloptions">Configure</a>';
        if( 
'before' == get_option('tcl_location') )
            
$links array_merge( array($link), $links); //If we want to add a item before the other links, We need to insert it at the start of the array, looks better, but takes some effort
        
else //After
            
$links[] = $link//If its simply being appended, Its rather painless.
    
}
    return 
$links;
}

//Generic Options page stuff, But with some extra validation.
function tcloptions(){
    if( isset(
$_POST['tcl_location']) ){
        
$location $_POST['tcl_location'];
        
$valid = array('before''after'); //Lets validate that a correct setting was passed.
        
if( in_array($location$valid) ){
            
update_option('tcl_location'$location);
            echo 
'<div class="message updated" id="message"><p>Settings saved</p></div>';
        } else {
            echo 
'<div class="error fade" id="message"><p>Invalid Settings</p></div>';
        }
    }
?>
<div class="wrap">
    <h1> This is the Options page... </h1>
    <form action="<?php echo $_SERVER['REQUEST_URI'?>" method="post">
        Location for the Confgure link, Before or after the default links.
        <select name="tcl_location">
            <option<?php selected(get_option('tcl_location'), 'before'?>>before</option>
            <option<?php selected(get_option('tcl_location'), 'after'?>>after</option>
            <option<?php selected(get_option('tcl_location'), 'invalid'?>>invalid</option>
        </select><br />
        <p class="submit">
            <input type="submit" name="submit" value="Save options" />
        </p>
    </form>
</div>
<?php    
}

?>