* * * Plugin name: Menu Item Custom Fields Example * Plugin URI: https://github.com/kucrut/wp-menu-item-custom-fields * Description: Example usage of Menu Item Custom Fields in plugins/themes * Version: 0.2.0 * Author: Dzikri Aziz * Author URI: http://kucrut.org/ * License: GPL v2 * Text Domain: menu-item-custom-fields-example */ /** * Sample menu item metadata * * This class demonstrate the usage of Menu Item Custom Fields in plugins/themes. * * @since 0.1.0 */ class LawCarta_Menu_Item_Custom_Fields { /** * Holds our custom fields * * @var array * @access protected * @since Menu_Item_Custom_Fields_Example 0.2.0 */ protected static $fields = array(); protected static $templates = [ 'text' => '', ]; /** * Initialize plugin */ public static function init() { add_action( 'wp_nav_menu_item_custom_fields', array( __CLASS__, '_fields' ), 10, 4 ); add_action( 'wp_update_nav_menu_item', array( __CLASS__, '_save' ), 10, 3 ); self::$fields = array( 'a-classes' => [ 'label' => __('Anchor Classes', 'lawcarta'), 'type' => 'text' ], 'icon-classes' => [ 'label' => __('Icon Classes', 'lawcarta'), 'type' => 'text' ], ); } /** * Save custom field value * * @wp_hook action wp_update_nav_menu_item * * @param int $menu_id Nav menu ID * @param int $menu_item_db_id Menu item ID * @param array $menu_item_args Menu item data */ public static function _save( $menu_id, $menu_item_db_id, $menu_item_args ) { if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { return; } check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' ); foreach ( self::$fields as $field => $config ) { $key = sprintf( 'menu-item-%s', $field ); // Sanitize if ( ! empty( $_POST[ $key ][ $menu_item_db_id ] ) ) { $value = $_POST[ $key ][ $menu_item_db_id ]; if ($config['type'] === 'checkbox') { $value = (bool) $value; } } else { $value = null; } // Update if ( ! is_null( $value ) ) { update_post_meta( $menu_item_db_id, $key, $value ); } else { delete_post_meta( $menu_item_db_id, $key ); } } } /** * Print field * * @param object $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param array $args Menu item args. * @param int $id Nav menu ID. * * @return string Form fields */ public static function _fields( $id, $item, $depth, $args ) { foreach ( self::$fields as $field => $config ) : $key = sprintf( 'menu-item-%s', $field ); $id = sprintf( 'edit-%s-%s', $key, $item->ID ); $name = sprintf( '%s[%s]', $key, $item->ID ); $value = get_post_meta( $item->ID, $key, true ); $class = sprintf( 'field-%s', $field ); $extra = ''; if ($config['type'] === 'checkbox') { if ($value) { $extra = 'checked="checked"'; } $value = 1; } ?>

$config ) { $key = sprintf( 'menu-item-%s', $field ); $value = get_post_meta( $item->ID, $key, true ); if (!empty($value)) { if ($config['type'] === 'checkbox') { $value = (bool) $value; } $meta[$field] = $value; } } return $meta; } } LawCarta_Menu_Item_Custom_Fields::init();