Viewing file: screen-meta-links.php (8.86 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/**
* @author Janis Elsts
* @copyright 2011
*/
if ( !class_exists('wsScreenMetaLinks11') ):
//Load JSON functions for PHP < 5.2
if ( !(function_exists('json_encode') && function_exists('json_decode')) && !(class_exists('Services_JSON') || class_exists('Moxiecode_JSON')) ){
$class_json_path = ABSPATH.WPINC.'/class-json.php';
$class_moxiecode_json_path = ABSPATH.WPINC.'/js/tinymce/plugins/spellchecker/classes/utils/JSON.php';
if ( file_exists($class_json_path) ){
require $class_json_path;
} elseif ( file_exists($class_moxiecode_json_path) ) {
require $class_moxiecode_json_path;
}
}
class wsScreenMetaLinks11 {
var $registered_links; //List of meta links registered for each page.
/**
* Class constructor.
*
* @return void
*/
function __construct(){
$this->registered_links = array();
add_action('admin_notices', array(&$this, 'append_meta_links'));
add_action('admin_print_styles', array(&$this, 'add_link_styles'));
}
/**
* Add a new link to the screen meta area.
*
* Do not call this method directly. Instead, use the global add_screen_meta_link() function.
*
* @param string $id Link ID. Should be unique and a valid value for a HTML ID attribute.
* @param string $text Link text.
* @param string $href Link URL.
* @param string|array $page The page(s) where you want to add the link.
* @param array $attributes Optional. Additional attributes for the link tag.
* @return void
*/
function add_screen_meta_link($id, $text, $href, $page, $attributes = null){
if ( !is_array($page) ){
$page = array($page);
}
if ( is_null($attributes) ){
$attributes = array();
}
//Basically a list of props for a jQuery() call
$link = compact('id', 'text', 'href');
$link = array_merge($link, $attributes);
//Add the CSS classes that will make the look like a proper meta link
if ( empty($link['class']) ){
$link['class'] = '';
}
$link['class'] = 'show-settings custom-screen-meta-link ' . $link['class'];
//Save the link in each relevant page's list
foreach($page as $page_id){
if ( !isset($this->registered_links[$page_id]) ){
$this->registered_links[$page_id] = array();
}
$this->registered_links[$page_id][] = $link;
}
}
/**
* Output the JS that appends the custom meta links to the page.
* Callback for the 'admin_notices' action.
*
* @access private
* @return void
*/
function append_meta_links(){
global $hook_suffix;
//Find links registered for this page
$links = $this->get_links_for_page($hook_suffix);
if ( empty($links) ){
return;
}
?>
<script type="text/javascript">
(function($, links){
var container = $('#screen-meta-links');
if ( container.length == 0 ) {
container = $('<div />').attr('id', 'screen-meta-links').insertAfter('#screen-meta');
}
for(var i = 0; i < links.length; i++){
container.append(
$('<div/>')
.attr({
'id' : links[i].id + '-wrap',
'class' : 'hide-if-no-js custom-screen-meta-link-wrap'
})
.append( $('<a/>', links[i]) )
);
}
})(jQuery, <?php echo $this->json_encode($links); ?>);
</script>
<?php
}
/**
* Get a list of custom screen meta links registered for a specific page.
*
* @param string $page
* @return array
*/
function get_links_for_page($page){
$links = array();
if ( isset($this->registered_links[$page]) ){
$links = array_merge($links, $this->registered_links[$page]);
}
$page_as_screen = $this->page_to_screen_id($page);
if ( ($page_as_screen != $page) && isset($this->registered_links[$page_as_screen]) ){
$links = array_merge($links, $this->registered_links[$page_as_screen]);
}
return $links;
}
/**
* Output the CSS code for custom screen meta links. Required because WP only
* has styles for specific meta links (by #id), not meta links in general.
*
* Callback for 'admin_print_styles'.
*
* @access private
* @return void
*/
function add_link_styles(){
global $hook_suffix;
//Don't output the CSS if there are no custom meta links for this page.
$links = $this->get_links_for_page($hook_suffix);
if ( empty($links) ){
return;
}
if ( !isset($GLOBALS['wp_version']) || version_compare($GLOBALS['wp_version'], '3.8-RC1', '<') ) {
$this->print_old_link_styles();
} else {
$this->print_link_styles();
}
}
/**
* Print screen meta button styles (WP 3.8+).
*/
private function print_link_styles() {
?>
<style type="text/css">
.custom-screen-meta-link-wrap {
float: right;
height: 28px;
margin: 0 0 0 6px;
border: 1px solid #ddd;
border-top: none;
background: #fff;
-webkit-box-shadow: 0 1px 1px -1px rgba(0,0,0,0.1);
box-shadow: 0 1px 1px -1px rgba(0,0,0,0.1);
}
#screen-meta .custom-screen-meta-link-wrap a.custom-screen-meta-link,
#screen-meta-links .custom-screen-meta-link-wrap a.custom-screen-meta-link
{
padding: 3px 16px 3px 16px;
}
#screen-meta-links a.custom-screen-meta-link::after {
display: none;
}
</style>
<?php
}
/**
* Print old screen meta button styles (WP 3.7.x and older).
*/
private function print_old_link_styles() {
?>
<style type="text/css">
.custom-screen-meta-link-wrap {
float: right;
height: 22px;
padding: 0;
margin: 0 0 0 6px;
font-family: sans-serif;
-moz-border-radius-bottomleft: 3px;
-moz-border-radius-bottomright: 3px;
-webkit-border-bottom-left-radius: 3px;
-webkit-border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
background: #e3e3e3;
border-right: 1px solid transparent;
border-left: 1px solid transparent;
border-bottom: 1px solid transparent;
background-image: -ms-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* IE10 */
background-image: -moz-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Firefox */
background-image: -o-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Opera */
background-image: -webkit-gradient(linear, left bottom, left top, from(#dfdfdf), to(#f1f1f1)); /* old Webkit */
background-image: -webkit-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* new Webkit */
background-image: linear-gradient(bottom, #dfdfdf, #f1f1f1); /* proposed W3C Markup */
}
#screen-meta .custom-screen-meta-link-wrap a.custom-screen-meta-link,
#screen-meta-links .custom-screen-meta-link-wrap a.custom-screen-meta-link
{
background-image: none;
padding-right: 6px;
color: #777;
}
</style>
<?php
}
/**
* Convert a page hook name to a screen ID.
*
* @uses convert_to_screen()
* @access private
*
* @param string $page
* @return string
*/
function page_to_screen_id($page){
if ( function_exists('convert_to_screen') ){
$screen = convert_to_screen($page);
if ( isset($screen->id) ){
return $screen->id;
} else {
return '';
}
} else {
return str_replace( array('.php', '-new', '-add' ), '', $page);
}
}
/**
* Back-wards compatible json_encode(). Used to encode link data before
* passing it to the JavaScript that actually creates the links.
*
* @param mixed $data
* @return string
*/
function json_encode($data){
if ( function_exists('json_encode') ){
return json_encode($data);
}
if ( class_exists('Services_JSON') ){
$json = new Services_JSON();
return( $json->encodeUnsafe($data) );
} elseif ( class_exists('Moxiecode_JSON') ){
$json = new Moxiecode_JSON();
return $json->encode($data);
} else {
trigger_error('No JSON parser available', E_USER_ERROR);
return null;
}
}
}
global $ws_screen_meta_links_versions;
if ( !isset($ws_screen_meta_links_versions) ){
$ws_screen_meta_links_versions = array();
}
$ws_screen_meta_links_versions['1.1'] = 'wsScreenMetaLinks11';
endif;
/**
* Add a new link to the screen meta area.
*
* @param string $id Link ID. Should be unique and a valid value for a HTML ID attribute.
* @param string $text Link text.
* @param string $href Link URL.
* @param string|array $page The page(s) where you want to add the link.
* @param array $attributes Optional. Additional attributes for the link tag.
* @return void
*/
function add_screen_meta_link($id, $text, $href, $page, $attributes = null){
global $ws_screen_meta_links_versions;
static $instance = null;
if ( is_null($instance) ){
//Instantiate the latest version of the wsScreenMetaLinks class
uksort($ws_screen_meta_links_versions, 'version_compare');
$className = end($ws_screen_meta_links_versions);
$instance = new $className;
}
$instance->add_screen_meta_link($id, $text, $href, $page, $attributes);
}
?>
|