예제 #1
0
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;
}
예제 #2
0
 /**
  * @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;
 }
예제 #3
0
 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));
 }