Ask your WordPress questions! Pay money and get answers fast! Comodo Trusted Site Seal
Official PayPal Seal

add a checkbox in items of the menu-manager in wp WordPress

  • SOLVED

Hi,

i would add a checkbox in every item in the menu manager, like that :
[[LINK href="http://archiparmentier.com/menumanager.jpg"]]http://archiparmentier.com/menumanager.jpg[[/LINK]]

of course, i could return easily the value of the checkbox probably like that : $item->checkbox1 (in functions.php)


maybe can i transform the field xfn for example in a checkbox... but is it possible in function.php ?


in wp-admin/includes, i have modify function start_el(&$output, $item, $depth, $args) like that:
i have replace this

<p class="field-link-target description description-thin">
<label for="edit-menu-item-target-<?php echo $item_id; ?>">
<?php _e( 'Link Target' ); ?><br />
<select id="edit-menu-item-target-<?php echo $item_id; ?>" class="widefat edit-menu-item-target" name="menu-item-target[<?php echo $item_id; ?>]">
<option value="" <?php selected( $item->target, ''); ?>><?php _e('Same window or tab'); ?></option>
<option value="_blank" <?php selected( $item->target, '_blank'); ?>><?php _e('New window or tab'); ?></option>
</select>
</label>
</p>


by this

<p class="field-link-target description description-thin">
<label for="edit-menu-item-target-<?php echo $item_id; ?>">
My label<br />
<select id="edit-menu-item-target-<?php echo $item_id; ?>" class="widefat edit-menu-item-target" name="menu-item-target[<?php echo $item_id; ?>]">
<option value="no" <?php selected( $item->target, 'no'); ?>>No</option>
<option value="yes" <?php selected( $item->target, 'yes'); ?>>Yes</option>
</select>
</label>
</p>

and i can return the value with $item->target but <strong>it's an uggly solution :--( and i can't propose a plugin like that</strong>

Can i do the same thing via function.php ?

---

les réponses en français sont les bienvenues :-)

Answers (2)

2010-12-23

Nick Parsons answers:

Actually Peter is incorrect on this one. There's a filter called 'wp_edit_nav_menu_walker' that allows you to change the class that is called to display the Edit Menus page.

Here's the code that will do exactly what you need, the custom checkbox is marked by comments so you can change the label, etc.
<?php

add_action('wp_update_nav_menu', 'save_custom_menu_param');
add_filter('wp_edit_nav_menu_walker','register_nav_menu_class');

function save_custom_menu_param(){
foreach($_POST['menu-item-title'] as $item_id=>$value){
$checkboxes = $_POST['menu-item-checkbox'];
$value = ( isset($checkboxes[$item_id]) ) ? 'checked' : '';
update_post_meta($item_id, '_menu_item_checkbox', $value );
}
}


function register_nav_menu_class(){
class Custom_Walker_Nav_Menu_Edit extends Walker_Nav_Menu_Edit {
function start_el(&$output, $item, $depth, $args) {
global $_wp_nav_menu_max_depth;
$_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;

$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

ob_start();
$item_id = esc_attr( $item->ID );
$removed_args = array(
'action',
'customlink-tab',
'edit-menu-item',
'menu-item',
'page-tab',
'_wpnonce',
);

$original_title = '';
if ( 'taxonomy' == $item->type ) {
$original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
} elseif ( 'post_type' == $item->type ) {
$original_object = get_post( $item->object_id );
$original_title = $original_object->post_title;
}

$classes = array(
'menu-item menu-item-depth-' . $depth,
'menu-item-' . esc_attr( $item->object ),
'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive'),
);

$title = $item->title;

if ( isset( $item->post_status ) && 'draft' == $item->post_status ) {
$classes[] = 'pending';
/* translators: %s: title of menu item in draft status */
$title = sprintf( __('%s (Pending)'), $item->title );
}

$title = empty( $item->label ) ? $title : $item->label;

?>
<li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode(' ', $classes ); ?>">
<dl class="menu-item-bar">
<dt class="menu-item-handle">
<span class="item-title"><?php echo esc_html( $title ); ?></span>
<span class="item-controls">
<span class="item-type"><?php echo esc_html( $item->type_label ); ?></span>
<span class="item-order">
<a href="<?php
echo wp_nonce_url(
add_query_arg(
array(
'action' => 'move-up-menu-item',
'menu-item' => $item_id,
),
remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
),
'move-menu_item'
);
?>" class="item-move-up"><abbr title="<?php esc_attr_e('Move up'); ?>">&#8593;</abbr></a>
|
<a href="<?php
echo wp_nonce_url(
add_query_arg(
array(
'action' => 'move-down-menu-item',
'menu-item' => $item_id,
),
remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
),
'move-menu_item'
);
?>" class="item-move-down"><abbr title="<?php esc_attr_e('Move down'); ?>">&#8595;</abbr></a>
</span>
<a class="item-edit" id="edit-<?php echo $item_id; ?>" title="<?php _e('Edit Menu Item'); ?>" href="<?php
echo ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? admin_url( 'nav-menus.php' ) : add_query_arg( 'edit-menu-item', $item_id, remove_query_arg( $removed_args, admin_url( 'nav-menus.php#menu-item-settings-' . $item_id ) ) );
?>"><?php _e( 'Edit Menu Item' ); ?></a>
</span>
</dt>
</dl>

<div class="menu-item-settings" id="menu-item-settings-<?php echo $item_id; ?>">
<?php if( 'custom' == $item->type ) : ?>
<p class="field-url description description-wide">
<label for="edit-menu-item-url-<?php echo $item_id; ?>">
<?php _e( 'URL' ); ?><br />
<input type="text" id="edit-menu-item-url-<?php echo $item_id; ?>" class="widefat code edit-menu-item-url" name="menu-item-url[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->url ); ?>" />
</label>
</p>
<?php endif; ?>
<p class="description description-thin">
<label for="edit-menu-item-title-<?php echo $item_id; ?>">
<?php _e( 'Navigation Label' ); ?><br />
<input type="text" id="edit-menu-item-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->title ); ?>" />
</label>
</p>
<p class="description description-thin">
<label for="edit-menu-item-attr-title-<?php echo $item_id; ?>">
<?php _e( 'Title Attribute' ); ?><br />
<input type="text" id="edit-menu-item-attr-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->post_excerpt ); ?>" />
</label>
</p>
<p class="field-link-target description description-thin">
<label for="edit-menu-item-target-<?php echo $item_id; ?>">
<?php _e( 'Link Target' ); ?><br />
<select id="edit-menu-item-target-<?php echo $item_id; ?>" class="widefat edit-menu-item-target" name="menu-item-target[<?php echo $item_id; ?>]">
<option value="" <?php selected( $item->target, ''); ?>><?php _e('Same window or tab'); ?></option>
<option value="_blank" <?php selected( $item->target, '_blank'); ?>><?php _e('New window or tab'); ?></option>
</select>
</label>
</p>
<p class="field-css-classes description description-thin">
<label for="edit-menu-item-classes-<?php echo $item_id; ?>">
<?php _e( 'CSS Classes (optional)' ); ?><br />
<input type="text" id="edit-menu-item-classes-<?php echo $item_id; ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?php echo $item_id; ?>]" value="<?php echo esc_attr( implode(' ', $item->classes ) ); ?>" />
</label>
</p>
<p class="field-xfn description description-thin">
<label for="edit-menu-item-xfn-<?php echo $item_id; ?>">
<?php _e( 'Link Relationship (XFN)' ); ?><br />
<input type="text" id="edit-menu-item-xfn-<?php echo $item_id; ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->xfn ); ?>" />
</label>
</p>
<!---custom checkbox-->
<p class="field-checkbox description description-thin">
<label for="edit-menu-item-checkbox-<?php echo $item_id; ?>">
<input type="checkbox" id="edit-menu-item-checkbox-<?php echo $item_id; ?>" class="edit-menu-item-checkbox" name="menu-item-checkbox[<?php echo $item_id; ?>]"<?php echo get_post_meta( $item_id, '_menu_item_checkbox', true);?> value='Yes' />
<?php _e( 'Label of my checkbox' ); ?>
</label>
</p>
<!--end custom checkbox-->
<p class="field-description description description-wide">
<label for="edit-menu-item-description-<?php echo $item_id; ?>">
<?php _e( 'Description' ); ?><br />
<textarea id="edit-menu-item-description-<?php echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo $item_id; ?>]"><?php echo esc_html( $item->description ); ?></textarea>
<span class="description"><?php _e('The description will be displayed in the menu if the current theme supports it.'); ?></span>
</label>
</p>

<div class="menu-item-actions description-wide submitbox">
<?php if( 'custom' != $item->type ) : ?>
<p class="link-to-original">
<?php printf( __('Original: %s'), '<a href="' . esc_attr( $item->url ) . '">' . esc_html( $original_title ) . '</a>' ); ?>
</p>
<?php endif; ?>
<a class="item-delete submitdelete deletion" id="delete-<?php echo $item_id; ?>" href="<?php
echo wp_nonce_url(
add_query_arg(
array(
'action' => 'delete-menu-item',
'menu-item' => $item_id,
),
remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
),
'delete-menu_item_' . $item_id
); ?>"><?php _e('Remove'); ?></a> <span class="meta-sep"> | </span> <a class="item-cancel submitcancel" id="cancel-<?php echo $item_id; ?>" href="<?php echo add_query_arg( array('edit-menu-item' => $item_id, 'cancel' => time()), remove_query_arg( $removed_args, admin_url( 'nav-menus.php' ) ) );
?>#menu-item-settings-<?php echo $item_id; ?>"><?php _e('Cancel'); ?></a>
</div>

<input class="menu-item-data-db-id" type="hidden" name="menu-item-db-id[<?php echo $item_id; ?>]" value="<?php echo $item_id; ?>" />
<input class="menu-item-data-object-id" type="hidden" name="menu-item-object-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object_id ); ?>" />
<input class="menu-item-data-object" type="hidden" name="menu-item-object[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object ); ?>" />
<input class="menu-item-data-parent-id" type="hidden" name="menu-item-parent-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_item_parent ); ?>" />
<input class="menu-item-data-position" type="hidden" name="menu-item-position[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_order ); ?>" />
<input class="menu-item-data-type" type="hidden" name="menu-item-type[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->type ); ?>" />
</div><!-- .menu-item-settings-->
<ul class="menu-item-transport"></ul>
<?php
$output .= ob_get_clean();
}
}

return 'Custom_Walker_Nav_Menu_Edit';
}

2010-12-23

Peter Michael answers:

I don't think there's a way without modifying the core. I would highly recommend <strong>not</strong> to do that.

Maybe you can explain <em>why</em> you want a checkbox in there?


Sébastien | French WordpressDesigner comments:

maybe is it possible to deactivate the function function start_el(&$output, $item, $depth, $args) and re-code this function in functions.php ?


Peter Michael comments:

For the front end, yes. See [[LINK href="http://erikshosting.com/wordpress-tips-code/building-a-wordpress-walker-creating-custom-dynamic-menu-outputs/"]]http://erikshosting.com/wordpress-tips-code/building-a-wordpress-walker-creating-custom-dynamic-menu-outputs/[[/LINK]]


Sébastien | French WordpressDesigner comments:

Thanks Peter, but my question is for the backoffice.
I said about the function start_el(&$output, $item, $depth, $args) which is in wp-admin/includes/nav-menu.php


Peter Michael comments:

You can't via functions.php