2008-02-10 12:57:07 +00:00
< ? php
/*
Plugin Name : pageMash
Plugin URI : http :// joelstarnes . co . uk / pagemash /
2008-02-12 22:16:39 +00:00
Description : pageMash > pageManagement [ WP_Admin > Manage > pageMash ]
2008-02-10 12:57:07 +00:00
Author : Joel Starnes
2008-03-16 23:25:12 +00:00
Version : 1.0 . 2
2008-02-10 12:57:07 +00:00
Author URI : http :// joelstarnes . co . uk /
CHANGELOG :
Release : Date : Description :
0.1 . 0 10 Feb 2008 Initial release
2008-02-20 14:40:54 +00:00
0.1 . 1 12 Feb 2008 Minor fixes > Removed external include
0.1 . 2 15 Feb 2008 Minor fixes > Fixed CSS & JS headers to only display on pagemash
1.0 . 0 beta 19 Feb 2008 Major update > Recusive page handles unlimited nested children ,
collapsable list items , interface makeover ...
2008-03-14 22:16:00 +00:00
1.0 . 1 beta 14 Mar 2008 fixed IE > drag selects text
2008-03-16 23:25:12 +00:00
1.0 . 2 16 Mar 2008 Major code rewrite for exclude pages
2008-02-10 12:57:07 +00:00
2008-02-20 14:40:54 +00:00
FIXME :
@ fixme with instantUpdateFeature hide will not send the update
2008-02-10 12:57:07 +00:00
*/
#########CONFIG OPTIONS############################################
$minlevel = 7 ; /*[deafult=7]*/
/* Minimum user level to access page order */
2008-03-16 16:18:04 +00:00
$excludePagesFeature = true ; /*[deafult=true]*/
2008-03-16 23:25:12 +00:00
/* Allows you to set pages not to be listed */
2008-02-20 14:40:54 +00:00
2008-02-10 12:57:07 +00:00
$instantUpdateFeature = false ; /*[deafult=false]*/
/* Updates the database instantly after a move using ajax
otherwise it will wait for update button press .
2008-02-20 14:40:54 +00:00
nb . this feature has not been optimised and enabling will cause
much increased server load */
2008-02-10 12:57:07 +00:00
###################################################################
/*
2008-03-16 23:25:12 +00:00
INSPIRATIONS / CREDITS :
2008-02-10 12:57:07 +00:00
Valerio Proietti - Mootools JS Framework [ http :// mootools . net / ]
Stefan Lange - Hegermann - Mootools AJAX timeout class extension [ http :// www . blackmac . de / archives / 44 - Mootools - AJAX - timeout . html ]
vladimir - Mootools Sortables class extension [ http :// vladimir . akilles . cl / scripts / sortables / ]
ShiftThis - WP Page Order Plugin [ http :// www . shiftthis . net / wordpress - order - pages - plugin / ]
2008-03-16 23:25:12 +00:00
Garrett Murphey - Page Link Manager [ http :// gmurphey . com / 2006 / 10 / 05 / wordpress - plugin - page - link - manager / ]
2008-02-10 12:57:07 +00:00
*/
/* Copyright 2008 Joel Starnes ( email : joel @ joelstarnes . co . uk )
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
2008-02-20 14:40:54 +00:00
function pageMash_getPages ( $post_parent ){
//this is a recurrsive function which calls itself to produce a nested list of elements
//$post_parent should be 0 for root pages, or contain a pageID to return it's sub-pages
2008-03-17 17:40:40 +00:00
global $wpdb , $wp_version , $excludePagesFeature , $excludePagesList ;
2008-02-20 14:40:54 +00:00
if ( $wp_version >= 2.1 ){ //get pages from database
$pageposts = $wpdb -> get_results ( " SELECT * FROM $wpdb->posts WHERE post_type = 'page' AND post_parent = ' $post_parent ' ORDER BY menu_order " );
2008-02-10 12:57:07 +00:00
} else {
2008-02-20 14:40:54 +00:00
$pageposts = $wpdb -> get_results ( " SELECT * FROM $wpdb->posts WHERE post_status = 'static' AND post_parent = ' $post_parent ' ORDER BY menu_order " );
2008-02-10 12:57:07 +00:00
}
2008-02-19 15:27:08 +00:00
2008-02-20 14:40:54 +00:00
if ( $pageposts == true ){ //if $pageposts == true then it does have sub-page(s), so list them.
echo '<ul ' ;
if ( $post_parent == 0 ) echo 'id="pageMash_pages" ' ; //add this ID only to root 'ul' element
2008-03-16 23:25:12 +00:00
echo '>' ;
2008-02-20 14:40:54 +00:00
foreach ( $pageposts as $page ) : //list pages, [the 'li' ID must be the page ID] ?>
2008-03-17 17:40:40 +00:00
< li id = " pm_<?= $page->ID ;?> " < ? php if ( in_array ( $page -> ID , $excludePagesList )) echo 'class="remove"' ; //if page is in exclude list, add class remove ?>>
2008-02-20 14:40:54 +00:00
< span class = " title " >< ? = $page -> post_title ; ?> </span>
< span class = " pageMash_pageFunctions " >
id :< ? = $page -> ID ; ?>
[ < a href = " <?=get_settings('siteurl').'/wp-admin/post.php?action=edit&post='. $page->ID ; ?> " title = " Edit This Page " > edit </ a > ]
< ? php if ( $excludePagesFeature ) : ?>
2008-02-20 17:23:35 +00:00
[ < a href = " # " title = " Show|Hide " class = " excludeLink " onclick = " toggleRemove(this); return false " > hide </ a > ]
2008-02-20 14:40:54 +00:00
< ? php endif ; ?>
</ span >
< ? php pageMash_getPages ( $page -> ID ) //call this function to list any sub-pages (passing it the pageID) ?>
</ li >
< ? php endforeach ;
echo '</ul>' ;
return true ;
} else {
return false ;
}
}
function pageMash_main (){
2008-03-17 17:40:40 +00:00
global $instantUpdateFeature , $excludePagesFeature , $excludePagesList ;
2008-03-18 07:26:23 +00:00
if ( ! is_array ( get_option ( 'exclude_pages' ))) $excludePagesList = array (); else $excludePagesList = get_option ( 'exclude_pages' ); //if it's empty set as an empty array
2008-02-10 12:57:07 +00:00
?>
2008-02-20 14:40:54 +00:00
< div id = " debug_list " ></ div >
2008-02-10 12:57:07 +00:00
< div id = " pageMash " class = " wrap " >
< div id = " pageMash_checkVersion " style = " float:right; font-size:.7em; margin-top:5px; " >
2008-03-16 23:25:12 +00:00
version [ 1.0 . 2 ]
2008-02-10 12:57:07 +00:00
</ div >
< h2 style = " margin-bottom:0; clear:none; " > pageMash - pageManagement </ h2 >
2008-02-20 14:40:54 +00:00
< p style = " margin-top:4px; " >
Just drag the pages < strong > up </ strong > or < strong > down </ strong > to change the page order and < strong > left </ strong > or < strong > right </ strong > to change the page 's parent, then hit ' update ' .< br />
The icon to the left of each page shows if it has child pages , < strong > double click </ strong > anywhere on that item to toggle < strong > expand | collapse </ strong > of it ' s children .
</ p >
< div >
< ? php pageMash_getPages ( 0 ); //pass 0, as initial parent ?>
</ div >
2008-02-10 12:57:07 +00:00
< p class = " submit " >
2008-02-20 14:40:54 +00:00
< div id = " update_status " style = " float:left; margin-left:40px; opacity:0; " ></ div >
2008-02-10 12:57:07 +00:00
< ? php if ( ! $instantUpdateFeature ) : ?>
< input type = " submit " id = " pageMash_submit " tabindex = " 2 " style = " font-weight: bold; float:right; " value = " Update " name = " submit " />
< ? php endif ; ?>
</ p >
< br style = " margin-bottom: .8em; " />
</ div >
< div class = " wrap " style = " width:160px; margin-bottom:0; padding:2px; text-align:center; " >< a href = " # " id = " pageMashInfo_toggle " style = " text-align:center; " > Show | Hide Further Info </ a ></ div >
< div class = " wrap " id = " pageMashInfo " style = " margin-top:-1px; " >
2008-03-16 23:25:12 +00:00
< h2 > How to Use </ h2 >
< p > pageMash works with the wp_list_pages function . The easiest way to use it is to put the pages widget in your sidebar [ WP admin page > Presentation > Widgets ] . Click the configure button on the widget and ensure that 'sort by' is set to 'page order' . Hey presto , you ' re done .</ p >
< p > You can also use the function anywhere in your theme code . e . g . in your sidebar . php file ( but the code in here will not run if you ' re using any widgets ) or your header . php file ( somewhere under the body tag , you may want to use the depth = 1 parameter to only show top levle pages ) . The code should look something like the following :</ p >
2008-02-20 14:40:54 +00:00
< p style = " margin-bottom:0; font-weight:bold; " > Code :</ p >
2008-03-16 23:25:12 +00:00
< code id = " pageMash_code " >
< span class = " white " >& lt ; ? php </ span > < span class = " blue " > wp_list_pages ( </ span >< span class = " orange " > 'title_li=<h2>Pages</h2>&depth=0' </ span >< span class = " blue " > ); </ span > < span class = " white " > ? & gt ; </ span >
2008-02-10 12:57:07 +00:00
</ code >
2008-03-16 23:25:12 +00:00
< p > You can also hard - code pages to exclude and these will be merged with the pages you set to exclude in your pageMash admin .</ p >
< p > The code here is very simple and flexible , for more information look up < a href = " http://codex.wordpress.org/Template_Tags/wp_list_pages " title = " wp_list_pages Documentation " > wp_list_pages () in the Wordpress Codex </ a > as it is very well documented and if you have any further questions or feedback I like getting messages , so < a href = " http://joelstarnes.co.uk/contact/ " title = " email Joel Starnes " > drop me an email </ a >.</ p >
2008-02-10 12:57:07 +00:00
</ div >
< ? php
}
function pageMash_head (){
2008-02-20 14:40:54 +00:00
if ( strrpos ( '>' . $_GET [ " page " ], 'pagemash' )) : // only include header stuff on pagemash admin page
2008-02-10 12:57:07 +00:00
//stylesheet & javascript to go in page header
global $instantUpdateFeature , $excludePagesFeature ;
?>
< style type = " text/css " >
2008-02-20 14:40:54 +00:00
ul #pageMash_pages {
margin : 0 0 0 0 ;
2008-03-16 23:25:12 +00:00
list - style : none ;
2008-02-20 14:40:54 +00:00
}
2008-03-16 23:25:12 +00:00
ul #pageMash_pages li.collapsed ul { display:none; }
2008-02-20 14:40:54 +00:00
ul #pageMash_pages li.children {
background - image : url ( '<?=get_settings("siteurl")?>/wp-content/plugins/pagemash/collapse.png' );
}
ul #pageMash_pages li.collapsed.children {
background - image : url ( '<?=get_settings("siteurl")?>/wp-content/plugins/pagemash/expand.png' );
}
ul #pageMash_pages li {
display : block ;
margin : 2 px 0 0 0 ;
border - bottom : 1 px solid #aaa; border-right:1px solid #aaa; border-top:1px solid #ccc; border-left:1px solid #ccc;
padding : 4 px 6 px 4 px 24 px ;
background : #F1F1F1 url('<?=get_settings("siteurl")?>/wp-content/plugins/pagemash/page.png') no-repeat 4px 4px;
list - style - type : none ;
}
2008-03-16 23:25:12 +00:00
ul #pageMash_pages li span.title { font-weight: bold; }
ul #pageMash_pages li.collapsed.children span.title { text-decoration: underline; }
ul #pageMash_pages li.collapsed.children li span.title { text-decoration: none; }
2008-02-20 14:40:54 +00:00
#update_status {
font - weight : bold ;
display : block ;
border : 2 px solid #AC604C;
background - color : #DDA37A;
padding : 2 px 6 px ;
}
2008-03-16 23:25:12 +00:00
ul #pageMash_pages li.remove {
color : grey ;
border - style : dashed ;
border - color : #aaa;
opacity :. 5 ;
filter : alpha ( opacity = 50 ); zoom : 1 ; /* ie hack[has layout] for opacity */
}
2008-02-10 12:57:07 +00:00
ul #pageMash_pages li.remove a { color:grey; }
2008-02-20 14:40:54 +00:00
ul #pageMash_pages li span.pageMash_pageFunctions {
border : 1 px solid #ccc;
background - color : #eee;
padding : 1 px 3 px ;
}
ul #pageMash_pages li span.pageMash_pageFunctions a { border:0; }
2008-03-16 23:25:12 +00:00
/* Show [page id, 'edit page' link and 'hide' link] function box on hover */
2008-02-20 14:40:54 +00:00
ul #pageMash_pages li span.pageMash_pageFunctions { display:none; }
ul #pageMash_pages li:hover span.pageMash_pageFunctions { display:inline; }
ul #pageMash_pages li:hover li span.pageMash_pageFunctions { display:none; }
ul #pageMash_pages li:hover li:hover span.pageMash_pageFunctions { display:inline; }
ul #pageMash_pages li:hover li:hover li span.pageMash_pageFunctions { display:none; }
ul #pageMash_pages li:hover li:hover li:hover span.pageMash_pageFunctions { display:inline; }
ul #pageMash_pages li:hover li:hover li:hover li span.pageMash_pageFunctions { display:none; }
ul #pageMash_pages li:hover li:hover li:hover li:hover span.pageMash_pageFunctions { display:inline; }
ul #pageMash_pages li:hover li:hover li:hover li:hover li span.pageMash_pageFunctions { display:none; }
ul #pageMash_pages li:hover li:hover li:hover li:hover li:hover span.pageMash_pageFunctions { display:inline; }
2008-03-14 22:16:00 +00:00
ul #pageMash_pages li:hover li:hover li:hover li:hover li:hover li span.pageMash_pageFunctions { display:none; }
ul #pageMash_pages li:hover li:hover li:hover li:hover li:hover li:hover span.pageMash_pageFunctions { display:inline; }
2008-02-10 12:57:07 +00:00
2008-03-16 23:25:12 +00:00
#pageMash_code {display:block; border:solid 3px #858EF4; background-color:#211E1E; padding:7px; margin:0px;}
#pageMash_code .white{color:#DADADA;}
#pageMash_code .purple{color:#9B2E4D; font-weight:bold;}
#pageMash_code .green{color:#00FF00;}
#pageMash_code .blue{color:#858EF4;}
#pageMash_code .yellow{color:#C1C144;}
#pageMash_code .orange{color:#EC9E00;}
2008-02-10 12:57:07 +00:00
</ style >
2008-03-16 23:25:12 +00:00
<!-- Current code not compatible with newer releases of moo -->
2008-02-20 14:40:54 +00:00
< script type = " text/javascript " src = " <?=get_settings('siteurl')?>/wp-content/plugins/pagemash/nest-mootools.v1.11.js " ></ script >
< script type = " text/javascript " src = " <?=get_settings('siteurl')?>/wp-content/plugins/pagemash/nested.js " ></ script >
2008-02-10 12:57:07 +00:00
< script type = " text/javascript " >
2008-02-20 14:40:54 +00:00
/* add timeout to Ajax class */
2008-02-10 12:57:07 +00:00
Ajax = Ajax . extend ({
request : function (){
if ( this . options . timeout ) {
this . timeoutTimer = window . setTimeout ( this . callTimeout . bindAsEventListener ( this ), this . options . timeout );
this . addEvent ( 'onComplete' , this . removeTimer );
}
this . parent ();
},
callTimeout : function () {
this . transport . abort ();
this . onFailure ();
if ( this . options . onTimeout ) {
this . options . onTimeout ();
}
},
removeTimer : function () {
window . clearTimeout ( this . timeoutTimer );
}
});
2008-02-20 14:40:54 +00:00
/* function to retrieve list data and send to server in JSON format */
var SaveList = function () {
var theDump = sortIt . serialize ();
new Ajax ( '<?=get_settings("siteurl")?>/wp-content/plugins/pagemash/saveList.php' , {
method : 'post' ,
postBody : 'm=' + Json . toString ( theDump ),
2008-03-16 23:25:12 +00:00
// update: "debug_list",
2008-02-20 14:40:54 +00:00
onComplete : function () {
$ ( 'update_status' ) . setText ( 'Database Updated' );
new Fx . Style ( $ ( 'update_status' ), 'opacity' , { duration : 500 }) . start ( 0 , 1 ) . chain ( function () {
new Fx . Style ( $ ( 'update_status' ), 'opacity' , { duration : 1500 }) . start ( 1 , 0 );
});
},
2008-03-16 23:25:12 +00:00
timeout : 8500 ,
2008-02-20 14:40:54 +00:00
onTimeout : function () {
$ ( 'update_status' ) . setText ( 'Error: Update Timeout' );
new Fx . Style ( $ ( 'update_status' ), 'opacity' , { duration : 200 }) . start ( 0 , 1 );
}
}) . request ();
};
/* toggle the remove class of grandparent */
< ? php if ( $excludePagesFeature ) : ?>
var toggleRemove = function ( el ) {
el . parentNode . parentNode . toggleClass ( 'remove' );
2008-02-10 12:57:07 +00:00
}
2008-02-20 14:40:54 +00:00
< ? php endif ; ?>
2008-02-10 12:57:07 +00:00
2008-02-20 14:40:54 +00:00
/* ******** dom ready ******** */
2008-02-10 12:57:07 +00:00
window . addEvent ( 'domready' , function (){
2008-02-20 14:40:54 +00:00
sortIt = new Nested ( 'pageMash_pages' , {
collapse : true ,
onComplete : function ( el ) {
el . setStyle ( 'background-color' , '#F1F1F1' );
sortIt . altColor ();
< ? php if ( $instantUpdateFeature ) : ?> SaveList();<?php endif; ?>
$ES ( 'li' , 'pageMash_pages' ) . each ( function ( el ) {
if ( el . getElement ( 'ul' ) ){
el . addClass ( 'children' );
} else {
el . removeClass ( 'children' );
}
});
2008-02-10 12:57:07 +00:00
}
2008-02-20 14:40:54 +00:00
});
Nested . implement ({
/* alternate the colours of top level nodes */
2008-02-10 12:57:07 +00:00
altColor : function (){
var odd = 1 ;
this . list . getChildren () . each ( function ( element , i ){
if ( odd == 1 ){
odd = 0 ;
2008-02-20 14:40:54 +00:00
element . setStyle ( 'background-color' , '#CFE8A8' );
2008-02-10 12:57:07 +00:00
} else {
odd = 1 ;
2008-02-20 14:40:54 +00:00
element . setStyle ( 'background-color' , '#D8E8E6' );
2008-02-10 12:57:07 +00:00
}
});
}
});
2008-02-20 14:40:54 +00:00
sortIt . altColor ();
$ ( 'update_status' ) . setStyle ( 'opacity' , 0 );
2008-02-10 12:57:07 +00:00
< ? php if ( ! $instantUpdateFeature ) : ?>
$ ( 'pageMash_submit' ) . addEvent ( 'click' , function ( e ){
e = new Event ( e );
2008-02-20 14:40:54 +00:00
SaveList ();
2008-02-10 12:57:07 +00:00
e . stop ();
});
2008-02-20 14:40:54 +00:00
< ? php endif ; ?>
2008-02-10 12:57:07 +00:00
var pageMashInfo = new Fx . Slide ( 'pageMashInfo' );
$ ( 'pageMashInfo_toggle' ) . addEvent ( 'click' , function ( e ){
e = new Event ( e );
pageMashInfo . toggle ();
e . stop ();
switch ( $ ( 'pageMashInfo_toggle' ) . getText ()) {
case " Show Further Info " :
$ ( 'pageMashInfo_toggle' ) . setText ( 'Hide Further Info' );
break
case " Hide Further Info " :
$ ( 'pageMashInfo_toggle' ) . setText ( 'Show Further Info' );
break
}
});
pageMashInfo . hide ();
$ ( 'pageMashInfo_toggle' ) . setText ( 'Show Further Info' );
2008-02-20 14:40:54 +00:00
/* loop through each page */
$ES ( 'li' , 'pageMash_pages' ) . each ( function ( el ) {
/* If the li has a 'ul' child; it has children pages */
if ( el . getElement ( 'ul' ) ) el . addClass ( 'children' );
/* on page dblClick add this event */
el . addEvent ( 'dblclick' , function ( e ){
e = new Event ( e );
if ( el . hasClass ( 'children' )) el . toggleClass ( 'collapsed' );
e . stop ();
2008-02-10 12:57:07 +00:00
});
2008-02-20 14:40:54 +00:00
});
2008-03-14 22:16:00 +00:00
2008-03-16 23:25:12 +00:00
//disable drag text-selection for IE
if ( typeof document . body . onselectstart != " undefined " )
document . body . onselectstart = function (){ return false }
2008-03-14 22:16:00 +00:00
2008-02-20 14:40:54 +00:00
}); /* close dom ready */
2008-02-10 12:57:07 +00:00
</ script >
< ? php
2008-02-20 14:40:54 +00:00
endif ; //main function only display head if jmash admin page
}
2008-02-10 12:57:07 +00:00
2008-03-16 23:25:12 +00:00
function pageMash_add_excludes ( $excludes ) {
//merge array of hardcoded exclude pages with pageMash ones
$excludes = array_merge ( get_option ( 'exclude_pages' ), $excludes );
sort ( $excludes );
return $excludes ;
}
2008-02-10 12:57:07 +00:00
function pageMash_add_pages (){
//add link in the management tab
global $minlevel ;
add_management_page ( 'pageMash page order' , 'pageMash' , $minlevel , __FILE__ , 'pageMash_main' );
}
add_action ( 'admin_menu' , 'pageMash_add_pages' ); //add admin menu under management tab
add_action ( 'admin_head' , 'pageMash_head' ); //add css styles and JS code to head
2008-03-16 23:25:12 +00:00
add_filter ( 'wp_list_pages_excludes' , 'pageMash_add_excludes' ); //add exclude pages to wp_list_pages funct
2008-02-20 14:40:54 +00:00
2008-02-10 12:57:07 +00:00
?>