We've been using this plug-in for a while. But we've just recently found out that this plug-in does not work with WPMU. When you try to update it goes to an error page that says: "Error! Options page not found."
So I reworked the code to work w/ WP & WPMU to follow the 2.8 method of registering options, based off this article: http://planetozh.com/blog/2009/05/handling-plugins-options-in-wordpress-28-with-register_setting/
This has no legacy support cause I was to lazy to write a few if statements. Just replace these lines with the new content:
line 32 - 37
add_action('admin_init', 'classy_wp_list_pages_init' );
function classy_wp_list_pages_init() {
global $c_wp_lp_options;
if( function_exists( 'register_setting' ) ) {
foreach ( $c_wp_lp_options as $k => $v ) {
register_setting( 'classy-wp-list-pages' , $k );
}
}
}
line 194 - 196 (the stuff after the form tag)
<?php settings_fields('classy-wp-list-pages'); ?>
that's it. hope this helps other people as this is a very useful plug-in.
the whole thing looks like:
<?php
/*
Plugin Name: Classy wp_list_pages
Plugin URI: http://code.dunae.ca/classy_wp_list_pages
Description: Adds a uniqe class or ID attribute to each LI tag generated by wp_list_pages() allowing them to be individually styled with CSS.
Author: Alex Dunae
Version: 1.3.1
Author URI: http://dunae.ca/
*/
/**************************************
Hooks and configuration
***************************************/
/*add_filter('page_css_class', 'abcde', 10, 2);
function abcde ($css_class, $page) {
var_dump($css_class);
var_dump($page);
die;
}*/
add_filter('wp_list_pages','c_wp_lp_filter');
add_action('admin_menu', 'c_wp_lp_add_menus');
$c_wp_lp_options = array('c_wp_lp_prefix' => 'Class prefix',
'c_wp_lp_sep' => 'Class separator',
'c_wp_lp_attr' => 'Attribute',
'c_wp_lp_first_class' => 'Class to add to first element',
'c_wp_lp_last_class' => 'Class to add to last element');
// for WordPress 2.7 and MU
add_action('admin_init', 'classy_wp_list_pages_init' );
function classy_wp_list_pages_init() {
global $c_wp_lp_options;
if( function_exists( 'register_setting' ) ) {
foreach ( $c_wp_lp_options as $k => $v ) {
register_setting( 'classy-wp-list-pages' , $k );
}
}
}
$c_wp_lp_values = array();
/**************************************
wp_list_pages() filter
***************************************/
function c_wp_lp_filter_callback($matches) {
global $c_wp_lp_values;
$prefix = (strlen($c_wp_lp_values['c_wp_lp_prefix'])) > 0 ?
$c_wp_lp_values['c_wp_lp_prefix'] . $c_wp_lp_values['c_wp_lp_sep'] :
'';
// build the identifier
// - strip trailing and preceding slashes
// - replace the remaining slashes with the separator (from get_options())
$identifier = '';
if( $matches[4] && !empty($matches[4]) ) {
$identifier = preg_replace('/(^\/|\/$)/', '', $matches[4]);
$identifier = str_replace('/', $c_wp_lp_values['c_wp_lp_sep'], $identifier);
} else { // if the url is blank, this is the homepage
$identifier = 'frontpage';
}
$identifier = $prefix . $identifier;
$filtered = '';
if( $c_wp_lp_values['c_wp_lp_attr'] == 'id' ) {
$filtered = sprintf("<li id=\"%s\"%s><a href=\"%s\"", $identifier, $matches[1], get_option('home') . '/' . $matches[4]);
} else {
// append any existing classes and trim out extra spaces
$class = $identifier . ' ' . trim($matches[2]);
$class = preg_replace('/[ ]+/', ' ', $class);
$filtered = sprintf("<li class=\"%s\"><a href=\"%s\"", $class, get_option('home') . '/' . $matches[4]);
}
return $filtered;
}
function c_wp_lp_filter($content) {
global $c_wp_lp_values;
// load plugin options from the database
$c_wp_lp_values = c_wp_lp_get_values();
// escape the blog's base URL
$url = preg_replace(array('/\//', '/\./', '/\-/'), array('\/', '\.', '\-'), get_option('home'));
$pattern = '/<li( class=\"([\w\s_\-]+)\")?><a href=\"' . $url . '(\/([\w\-_\/]+))?"/i';
$content = preg_replace_callback($pattern, "c_wp_lp_filter_callback", $content);
// add class to first list item
if ( !empty($c_wp_lp_values['c_wp_lp_first_class']) ) {
$content = preg_replace('/(<ul>|^)[\s]*<li([\s]*id=("[\w_-]+"|\'[\w_-]+\')[\s]*)? class="/i',
"$1<li$2 class=\"" . $c_wp_lp_values['c_wp_lp_first_class'] . ' ',
$content,
-1);
}
// add class to last list item; reverses and tokenizes the string
if ( !empty($c_wp_lp_values['c_wp_lp_last_class']) ) {
$rev_class = strrev($c_wp_lp_values['c_wp_lp_last_class']);
// add spaces between tags and reverse
$content = strrev( preg_replace( '/><(\/?(ul|li))/i', '> <$1', $content ) );
$out = '';
$list_depth = 0;
$t = strtok( $content, " \n\t" );
while ($t !== false) {
if ( $list_depth > 0) {
// detected <code>page_item</code> class in the first LI before the UL
if ( $t == 'meti_egap' ) {
$t .= " $rev_class";
$list_depth -= 1;
}
}
// increase depth after encountering a closing UL
if ( strcasecmp( $t, '>lu/<' ) == 0 ) {
$list_depth += 1;
$t .= "\n";
}
$out .= $t . ' ';
$t = strtok( " \n\t" );
}
$out = str_replace( '<li', "\n<li", strrev( $out ) );
$content = $out;
}
return $content;
}
/**************************************
Menu functions
***************************************/
function c_wp_lp_add_menus() {
add_options_page('Classy wp_list_pages Options', 'Classy wp_list_pages', 8, 'c_wp_lp_options', 'c_wp_lp_options_page');
}
// read this plugin's options from the database
function c_wp_lp_get_values() {
global $c_wp_lp_options;
$opt_values = array();
foreach( $c_wp_lp_options as $k => $v )
$opt_values[$k] = get_option($k);
// default value for separator is an underscore
if(strlen(trim($opt_values['c_wp_lp_sep'])) < 1)
$opt_values['c_wp_lp_sep'] = '_';
// default value for attribute is ID
if(strlen(trim($opt_values['c_wp_lp_attr'])) < 1)
$opt_values['c_wp_lp_attr'] = 'id';
return $opt_values;
}
function c_wp_lp_options_page() {
global $c_wp_lp_options;
echo '<div class="wrap">';
echo "<h2>" . __( 'Classy wp_list_pages Options', 'c_wp_lp_trans_domain' ) . "</h2>";
// options form
?>
<form method="post" action="options.php">
<?php settings_fields('classy-wp-list-pages'); ?>
<p>Should the identifier be applied to the class or ID attribute?<br /><br />
<?php _e("Attribute:", 'c_wp_lp_trans_domain' ); ?>
<select name="c_wp_lp_attr">
<option value="id"<?php echo get_option('c_wp_lp_attr') == 'id' ? ' selected="selected"' : ''; ?>>ID</option>
<option value="class"<?php echo get_option('c_wp_lp_attr') == 'class' ? ' selected="selected"' : ''; ?>>Class</option>
</select>
</p><hr />
<p>An optional string appended to the beginning of the generated identifier (letters and numbers only).<br /><br />
<?php _e("Prefix:", 'c_wp_lp_trans_domain' ); ?>
<input type="text" name="c_wp_lp_prefix" value="<?php echo get_option('c_wp_lp_prefix'); ?>" size="5">
</p><hr />
<p>What character should separate each token in the identifier?<br /><br />
<?php _e("Token separator:", 'c_wp_lp_trans_domain' ); ?>
<select name="c_wp_lp_sep">
<option value="-"<?php echo $opt_values['c_wp_lp_sep'] == '-' ? ' selected="selected"' : ''; ?>>Dash (-)</option>
<option value="_"<?php echo $opt_values['c_wp_lp_sep'] == '_' ? ' selected="selected"' : ''; ?>>Underscore (_)</option>
</select>
</p><hr />
<p> <?php _e("Class to add to the first list item:", 'c_wp_lp_trans_domain' ); ?>
<input type="text" name="c_wp_lp_first_class" value="<?php echo get_option('c_wp_lp_first_class'); ?>" size="25">
</p><hr />
<p> <?php _e("Class to add to the last list item:", 'c_wp_lp_trans_domain' ); ?>
<input type="text" name="c_wp_lp_last_class" value="<?php echo get_option('c_wp_lp_last_class'); ?>" size="25">
</p><hr />
<p class="submit">
<input type="submit" name="Submit" value="<?php _e('Update Options ยป', 'c_wp_lp_trans_domain' ) ?>" />
</p>
</form>
</div>
<?php } ?>