Question:
I’m trying to add a custom field to the “Menu Settings” section in the WordPress menu editor (/wp-admin/nav-menus.php). Specifically, I want to add a dropdown to select a language for each menu. This custom field should appear alongside the existing “Auto add pages” and “Display location” settings.
I’ve tried various hooks like wp_nav_menu, but I can’t get the custom field to appear in the correct location. Here is the area where I want to add the field (denoted by the red arrow in the image):
What I Want to Achieve:
Add a dropdown in the “Menu Settings” section.
Save the selected value when the menu is saved.
Retrieve and use the selected value in my theme.
Code I’ve Tried:
add_action('wp_nav_menu', 'add_language_field_to_menu_settings', 10, 2);
function add_language_field_to_menu_settings($nav_menu_selected_id) {
$menu_id = $nav_menu_selected_id;
$selected_language = get_option('menu_language_' . $menu_id, '');
$available_languages = get_theme_available_languages();
wp_nonce_field('save_menu_language_meta_box_data', 'menu_language_meta_box_nonce');
echo '<div class="menu-settings">';
echo '<h2>' . __('Menu Language') . '</h2>';
echo '<label for="menu_language">' . __('Select Language') . '</label>';
echo '<select name="menu_language" id="menu_language">';
echo '<option value="" ' . selected($selected_language, '', false) . '>No Language Selected</option>';
foreach ($available_languages as $lang_code => $first_line) {
echo '<option value="' . esc_attr($lang_code) . '" ' . selected($selected_language, $lang_code, false) . '>' . esc_html($first_line) . '</option>';
}
echo '</select>';
echo '</div>';
}
add_action('wp_update_nav_menu', 'save_menu_language_meta_box_data');
function save_menu_language_meta_box_data($menu_id) {
if (!isset($_POST['menu_language_meta_box_nonce']) || !wp_verify_nonce($_POST['menu_language_meta_box_nonce'], 'save_menu_language_meta_box_data')) {
return;
}
if ($menu_id) {
$menu_language = isset($_POST['menu_language']) ? sanitize_text_field($_POST['menu_language']) : '';
update_option('menu_language_' . $menu_id, $menu_language);
}
}
function get_menu_language($menu_id) {
return get_option('menu_language_' . $menu_id, '');
}
function get_theme_available_languages() {
$languages = array();
$language_dir = get_template_directory() . '/languages';
if (is_dir($language_dir)) {
$files = scandir($language_dir);
foreach ($files as $file) {
if ($file !== '.' && $file !== '..' && preg_match('/^[a-zA-Z_-]+.po$/', $file)) {
$language_code = substr($file, 0, strpos($file, '.'));
$file_path = $language_dir . '/' . $file;
$first_line = '';
$handle = fopen($file_path, 'r');
if ($handle) {
$first_line = fgets($handle);
fclose($handle);
}
if (!empty($first_line)) {
$languages[$language_code] = trim($first_line);
}
}
}
}
$languages['en-US'] = 'English (United States)'; // Ensure en-US is included
return $languages;
}
What I Need Help With:
- Correctly adding the custom field to the “Menu Settings” section.
- Ensuring the selected value is saved and retrievable.
Any guidance or
solutions would be greatly appreciated!