function _icl_tax_has_objects_recursive($id, $term_id = -1, $rec = 0) { // based on the case where two categories were one the parent of another // eliminating the chance of infinite loops by letting this function calling itself too many times // 100 is the default limit in most of teh php configuration // // this limit this function to work only with categories nested up to 60 levels // should enough for most cases if ($rec > 60) { return false; } global $wpdb; if ($term_id === -1) { $term_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d", $id)); } $children = $wpdb->get_results($wpdb->prepare("\n SELECT term_taxonomy_id, term_id, count FROM {$wpdb->term_taxonomy} WHERE parent = %d\n ", $term_id)); $count = 0; foreach ($children as $ch) { $count += $ch->count; } if ($count) { return true; } else { foreach ($children as $ch) { if (_icl_tax_has_objects_recursive($ch->term_taxonomy_id, $ch->term_id, $rec + 1)) { return true; } } } return false; }
/** * @param int $trid * @param string $el_type Use comment, post, page, {custom post time name}, nav_menu, nav_menu_item, category, post_tag, etc. (prefixed with 'post_', 'tax_', or nothing for 'comment') * @param bool $skip_empty * @param bool $all_statuses * @param bool $skip_cache * * @return array|bool|mixed */ function get_element_translations($trid, $el_type = 'post_post', $skip_empty = false, $all_statuses = false, $skip_cache = false) { $cache_key_args = array_filter(array($trid, $el_type, $skip_empty, $all_statuses)); $cache_key = md5(json_encode($cache_key_args)); $cache_group = 'element_translations'; $temp_elements = $skip_cache ? false : wp_cache_get($cache_key, $cache_group); if ($temp_elements) { return $temp_elements; } global $wpdb; $translations = array(); $sel_add = ''; $where_add = ''; if ($trid) { if (0 === strpos($el_type, 'post_')) { $sel_add = ', p.post_title, p.post_status'; $join_add = " LEFT JOIN {$wpdb->posts} p ON t.element_id=p.ID"; $groupby_add = ""; if (!is_admin() && empty($all_statuses) && $el_type != 'post_attachment') { // the current user may not be the admin but may have read private post/page caps! if (current_user_can('read_private_pages') || current_user_can('read_private_posts')) { $where_add .= " AND (p.post_status = 'publish' OR p.post_status = 'private' OR p.post_status = 'pending')"; } else { $where_add .= " AND ("; $where_add .= "p.post_status = 'publish' OR p.post_status = 'pending' "; if ($uid = $this->get_current_user()->ID) { $where_add .= " OR (post_status in ('draft', 'private', 'pending') AND post_author = {$uid})"; } $where_add .= ") "; } } } elseif (preg_match('#^tax_(.+)$#', $el_type)) { $sel_add = ', tm.name, tm.term_id, COUNT(tr.object_id) AS instances'; $join_add = " LEFT JOIN {$wpdb->term_taxonomy} tt ON t.element_id=tt.term_taxonomy_id\r\n\t\t\t\t\t\t\t LEFT JOIN {$wpdb->terms} tm ON tt.term_id = tm.term_id\r\n\t\t\t\t\t\t\t LEFT JOIN {$wpdb->term_relationships} tr ON tr.term_taxonomy_id=tt.term_taxonomy_id\r\n\t\t\t\t\t\t\t "; $groupby_add = "GROUP BY tm.term_id"; } $where_add .= " AND t.trid='{$trid}'"; if (!isset($join_add)) { $join_add = ""; } if (!isset($groupby_add)) { $groupby_add = ""; } $query = "\r\n\t\t\t\tSELECT t.translation_id, t.language_code, t.element_id, t.source_language_code, NULLIF(t.source_language_code, '') IS NULL AS original {$sel_add}\r\n\t\t\t\tFROM {$wpdb->prefix}icl_translations t\r\n\t\t\t\t\t {$join_add}\r\n\t\t\t\tWHERE 1 {$where_add}\r\n\t\t\t\t{$groupby_add}\r\n\t\t\t"; $ret = $wpdb->get_results($query); foreach ($ret as $t) { if (preg_match('#^tax_(.+)$#', $el_type) && $t->instances == 0 && !_icl_tax_has_objects_recursive($t->element_id) && $skip_empty) { continue; } $cached_object_key = $t->element_id . '#' . $el_type . '#0#' . $t->language_code; wp_cache_set($cached_object_key, $cached_object_key, 'icl_object_id'); $translations[$t->language_code] = $t; } } if ($translations) { wp_cache_set($cache_key, $translations, $cache_group); } return $translations; }
function get_element_translations($trid, $el_type = 'post_post', $skip_empty = false) { global $wpdb; $translations = array(); $sel_add = ''; $where_add = ''; if ($trid) { if (0 === strpos($el_type, 'post_')) { $sel_add = ', p.post_title, p.post_status'; $join_add = " LEFT JOIN {$wpdb->posts} p ON t.element_id=p.ID"; $groupby_add = ""; if (!is_admin()) { $where_add .= " AND ("; $where_add .= "p.post_status = 'publish'"; if ($uid = get_current_user_id()) { $where_add .= " OR (post_status in ('draft', 'private') AND post_author = {$uid})"; } $where_add .= ") "; } } elseif (preg_match('#^tax_(.+)$#', $el_type)) { $sel_add = ', tm.name, tm.term_id, COUNT(tr.object_id) AS instances'; $join_add = " LEFT JOIN {$wpdb->term_taxonomy} tt ON t.element_id=tt.term_taxonomy_id\n LEFT JOIN {$wpdb->terms} tm ON tt.term_id = tm.term_id\n LEFT JOIN {$wpdb->term_relationships} tr ON tr.term_taxonomy_id=tt.term_taxonomy_id\n "; $groupby_add = "GROUP BY tm.term_id"; } $where_add .= " AND t.trid='{$trid}'"; $query = "\n SELECT t.translation_id, t.language_code, t.element_id, t.source_language_code IS NULL AS original {$sel_add}\n FROM {$wpdb->prefix}icl_translations t\n {$join_add}\n WHERE 1 {$where_add}\n {$groupby_add} \n "; $ret = $wpdb->get_results($query); foreach ($ret as $t) { if (preg_match('#^tax_(.+)$#', $el_type) && $t->instances == 0 && !_icl_tax_has_objects_recursive($t->element_id) && $skip_empty) { continue; } $translations[$t->language_code] = $t; } } return $translations; }
/** * @param stdClass $translation * * @return bool */ private function must_ignore_translation($translation) { return $this->wpml_element_type_is_taxonomy($translation->element_type) && $this->skip_empty && $translation->instances === 0 && (!$this->skip_recursions && !_icl_tax_has_objects_recursive($translation->element_id)); }