Skip to content

Instantly share code, notes, and snippets.

@llakewood
Created February 9, 2021 18:00
Show Gist options
  • Save llakewood/aacf202432ba4c2b3645146e3f4ebf9c to your computer and use it in GitHub Desktop.
Save llakewood/aacf202432ba4c2b3645146e3f4ebf9c to your computer and use it in GitHub Desktop.
We had a network wide nav in Blog 1 that would not translate to French. WPML Translation Management must be installed for this to work.
<?php
/* Problem: We had a network wide nav in Blog 1 that would not translate to French.
WPML Translation Management must be installed for this to work. */
//Determine which menu to serve (sql or codex)
function serve_wpml_menu($term_taxonomy_id, $post_parent, $callback) {
if($callback) {
if(ICL_LANGUAGE_CODE === 'en') {
$callback();
} else {
get_wpml_nav($term_taxonomy_id, $post_parent);
}
} else {
get_wpml_nav($term_taxonomy_id, $post_parent);
}
}
//Gather menu objects to put them into a list
function get_wpml_nav($term_taxonomy_id, $post_parent) {
$objects = get_wpml_nav_items($term_taxonomy_id, $post_parent);
if($objects) {
$menu = "<ul>";
foreach($objects as $item) {
$menu .= get_wpml_nav_item($term_taxonomy_id, $item);
}
$menu .= "</ul>";
}
print_r($menu);
}
//SQL query builds array for each level of menu
function get_wpml_nav_items($term_taxonomy_id, $post_parent) {
global $wpdb;
$objects = $wpdb -> get_results("SELECT
wp_posts.ID, wp_posts.post_parent, wp_posts.post_title, wp_posts.post_name, wp_posts.guid, wp_posts.menu_order
FROM wp_term_relationships
INNER JOIN wp_icl_translations
INNER JOIN wp_postmeta
INNER JOIN wp_posts
WHERE wp_icl_translations.element_id = wp_term_relationships.object_id
AND wp_term_relationships.term_taxonomy_id = $term_taxonomy_id
AND wp_postmeta.post_id = wp_term_relationships.object_id
AND wp_posts.ID = wp_postmeta.meta_value
AND wp_posts.post_parent = $post_parent
AND wp_posts.post_status = 'publish'
AND wp_postmeta.meta_key = '_menu_item_object_id'
ORDER BY wp_posts.menu_order ASC");
return $objects;
}
//SQL query builds array for postmeta, used to get classes
function get_wpml_nav_meta($post_id) {
global $wpdb,
$meta_val;
$meta = $wpdb -> get_results("SELECT
wp_postmeta.meta_key, wp_postmeta.meta_value
FROM wp_postmeta
WHERE wp_postmeta.post_id = $post_id");
foreach ($meta as $key) {
if($key->meta_key === "_menu_item_classes") {
$meta_val = unserialize($key->meta_value);
}
}
return $meta_val[0];
}
//For each nav item, build html markup
function get_wpml_nav_item ($term_taxonomy_id, $item) {
$classes = get_wpml_nav_meta($item->ID);
$menu_item = "<li class='".$classes." menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children'>";
$menu_item .= "<a href='/fr/".$item->post_name."'>";
$menu_item .= $item->post_title;
$menu_item .= "</a>";
if($item->post_parent == 0) {
$children = get_wpml_nav_items($term_taxonomy_id, $item->ID);
if($children) {
$menu_item .= "<ul class='sub-menu'>";
foreach($children as $child) {
$menu_item .= get_wpml_nav_item($term_taxonomy_id, $child);
}
$menu_item .= "</ul>";
}
}
$menu_item .= "</li>";
return $menu_item;
}
/* End Functions to work around WPML menus not translating */
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment