/**
  * Returns the number of posts for a given post_type, date and language combination that is published.
  *
  * @param string       $lang language code to check
  * @param null|int     $year
  * @param null|int     $month
  * @param null|int     $day
  * @param string|array $post_type
  *
  * @return bool
  *
  * @used-by \WPML_Languages::add_date_or_cpt_url_to_ls_lang to determine what languages to show in the Language Switcher
  */
 public function archive_query_has_posts($lang, $year = null, $month = null, $day = null, $post_type = 'post')
 {
     $cache_args = array();
     $cache_args['lang'] = $lang;
     $cache_args['year'] = $year;
     $cache_args['month'] = $month;
     $cache_args['day'] = $day;
     $cache_args['post_type'] = $post_type;
     $cache_key = md5(json_encode($cache_args));
     $cache_group = 'archive_query_has_posts';
     $cache = new WPML_WP_Cache($cache_group);
     $found = false;
     $result = $cache->get($cache_key, $found);
     if (!$found) {
         $post_status_snippet = $this->wp_api->current_user_can('read') ? "p.post_status IN (" . wpml_prepare_in(array('publish', 'private')) . ") " : "p.post_status = 'publish'";
         $post_type_snippet = is_array($post_type) ? " AND post_type IN (" . wpml_prepare_in($post_type) . ") " : $this->wpdb->prepare(' AND p.post_type = %s ', $post_type);
         $year_snippet = (bool) $year === true ? $this->wpdb->prepare(' AND year(p.post_date) = %d ', $year) : '';
         $month_snippet = (bool) $month === true ? $this->wpdb->prepare(' AND month(p.post_date) = %d ', $month) : '';
         $day_snippet = (bool) $day === true ? $this->wpdb->prepare(' AND day(p.post_date) = %d ', $day) : '';
         $lang_snippet = $this->wpdb->prepare(' AND t.language_code = %s ', $lang);
         $result = $this->wpdb->get_var("\n                        SELECT p.ID FROM {$this->wpdb->posts} p\n\t\t\t\t\t\tJOIN {$this->wpdb->prefix}icl_translations t\n\t\t\t\t\t\t\tON p.ID = t.element_id AND t.element_type = CONCAT('post_', p.post_type)\n\t\t\t\t\t\tWHERE " . $post_status_snippet . $year_snippet . $month_snippet . $day_snippet . $post_type_snippet . $lang_snippet . "\n\t\t\t\t\t\tLIMIT 1");
         $cache->set($cache_key, $result);
     }
     return (bool) $result;
 }
Пример #2
0
/**
 * @package wpml-core
 */
function icl_reset_language_data()
{
    global $wpdb, $sitepress;
    $active = $wpdb->get_col("SELECT code FROM {$wpdb->prefix}icl_languages WHERE active = 1");
    $wpdb->query("TRUNCATE TABLE `{$wpdb->prefix}icl_languages`");
    SitePress_Setup::fill_languages();
    $wpdb->query("TRUNCATE TABLE `{$wpdb->prefix}icl_languages_translations`");
    SitePress_Setup::fill_languages_translations();
    $wpdb->query("TRUNCATE TABLE `{$wpdb->prefix}icl_flags`");
    SitePress_Setup::fill_flags();
    //restore active
    $wpdb->query("UPDATE {$wpdb->prefix}icl_languages SET active=1 WHERE code IN(" . wpml_prepare_in($active) . ")");
    $wpdb->update($wpdb->prefix . 'icl_flags', array('from_template' => 0), null);
    $codes = $wpdb->get_col("SELECT code FROM {$wpdb->prefix}icl_languages");
    foreach ($codes as $code) {
        if (!$code || $wpdb->get_var($wpdb->prepare("SELECT lang_code FROM {$wpdb->prefix}icl_flags WHERE lang_code = %s", $code))) {
            continue;
        }
        if (!file_exists(ICL_PLUGIN_PATH . '/res/flags/' . $code . '.png')) {
            $file = 'nil.png';
        } else {
            $file = $code . '.png';
        }
        $wpdb->insert($wpdb->prefix . 'icl_flags', array('lang_code' => $code, 'flag' => $file, 'from_template' => 0));
    }
    $last_default_language = $sitepress !== null ? $sitepress->get_default_language() : 'en';
    if (!in_array($last_default_language, $codes)) {
        $allowed_langs = array_intersect(array_keys($sitepress->get_active_languages()), $codes);
        $sitepress->set_default_language(array_pop($allowed_langs));
    }
    icl_cache_clear();
}
Пример #3
0
 /**
  * @param array|string $post_type
  * @param WP_User      $author_data
  * @param array        $lang
  *
  * @return int
  */
 public function author_query_has_posts($post_type, $author_data, $lang)
 {
     global $wpdb;
     $post_types = (array) $post_type;
     $post_type_snippet = (bool) $post_types ? " AND post_type IN (" . wpml_prepare_in($post_types) . ") " : "";
     return $wpdb->get_var($wpdb->prepare("\n                        SELECT COUNT(p.ID) FROM {$wpdb->posts} p\n\t\t\t\t\t\tJOIN {$wpdb->prefix}icl_translations t\n\t\t\t\t\t\t\tON p.ID=t.element_id AND t.element_type = CONCAT('post_', p.post_type)\n\t\t\t\t\t\tWHERE p.post_author=%d\n\t\t\t\t\t\t  " . $post_type_snippet . "\n\t\t\t\t\t\t  AND post_status='publish'\n\t\t\t\t\t\t  AND language_code=%s", $author_data->ID, $lang['code']));
 }
 /**
  * Returns the number of posts for a given post_type, date and language combination that is published.
  *
  * @param string   $lang language code to check
  * @param  int     $year
  * @param null|int $month
  * @param null|int $day
  * @param string   $post_type
  *
  * @return null|string
  *
  * @used-by \WPML_Languages::add_date_or_cpt_url_to_ls_lang to determine what languages to show in the Language Switcher
  */
 public function archive_query_has_posts($lang, $year = null, $month = null, $day = null, $post_type = 'post')
 {
     $post_types = (array) $post_type;
     $post_type_snippet = (bool) $post_types ? " AND post_type IN (" . wpml_prepare_in($post_types) . ") " : "";
     $year_snippet = (bool) $year === true ? $this->wpdb->prepare(' AND year(p.post_date) = %d ', $year) : '';
     $month_snippet = (bool) $month === true ? $this->wpdb->prepare(' AND month(p.post_date) = %d ', $month) : '';
     $day_snippet = (bool) $day === true ? $this->wpdb->prepare(' AND day(p.post_date) = %d ', $day) : '';
     return $this->wpdb->get_var($this->wpdb->prepare("\n                        SELECT COUNT(p.ID) FROM {$this->wpdb->posts} p\n\t\t\t\t\t\tJOIN {$this->wpdb->prefix}icl_translations t\n\t\t\t\t\t\t\tON p.ID = t.element_id AND t.element_type = CONCAT('post_', p.post_type)\n\t\t\t\t\t\tWHERE post_status='publish'\n\t\t\t\t\t\t\t" . $year_snippet . $month_snippet . $day_snippet . $post_type_snippet . "\n\t\t\t\t\t\t  AND language_code = %s", $lang));
 }
 private function get_new_terms_just_duplicated($duplicate_ids, $taxonomies)
 {
     if ((bool) $duplicate_ids === false || (bool) $taxonomies === false) {
         return array();
     }
     $duplicate_ids_in = wpml_prepare_in($duplicate_ids, '%d');
     $taxonomies_in = wpml_prepare_in($taxonomies);
     $terms = $this->wpdb->get_results("SELECT tt.term_taxonomy_id, tt.taxonomy\n\t\t\t FROM {$this->wpdb->term_taxonomy} tt\n\t\t\t JOIN {$this->wpdb->term_relationships} tr\n\t\t\t\tON tt.term_taxonomy_id = tr.term_taxonomy_id\n\t\t\t JOIN {$this->wpdb->postmeta} pm\n\t\t\t    ON pm.post_id = tr.object_id\n\t\t\t JOIN {$this->wpdb->terms} t_duplicate\n\t\t\t    ON t_duplicate.term_id = tt.term_id\n\t\t\t JOIN  {$this->wpdb->terms} t_original\n\t\t\t    ON t_original.name = t_duplicate.name\n\t\t\t JOIN {$this->wpdb->term_taxonomy} tt_master\n\t\t\t    ON tt_master.term_id = t_original.term_id\n\t\t\t JOIN {$this->wpdb->term_relationships} tr_master\n\t\t\t    ON tt_master.term_taxonomy_id = tr_master.term_taxonomy_id\n\t\t\t LEFT JOIN {$this->wpdb->term_relationships} tr_other\n\t\t\t    ON tt.term_taxonomy_id = tr_other.term_taxonomy_id\n\t\t\t      AND tr_other.object_id != tr.object_id\n\t\t\t      AND tr_other.object_id NOT IN ({$duplicate_ids_in})\n\t\t      LEFT JOIN {$this->wpdb->postmeta} pm_other\n\t\t        ON pm_other.post_id = tr_other.object_id\n\t\t          AND NOT (pm_other.meta_key = '_icl_lang_duplicate_of'\n\t\t                    AND  pm_other.meta_value IN ({$duplicate_ids_in}))\n\t\t     WHERE pm.meta_key = '_icl_lang_duplicate_of'\n\t\t        AND tr_other.object_id IS NULL\n\t\t        AND pm_other.post_id IS NULL\n\t\t        AND pm.meta_value IN ({$duplicate_ids_in})\n\t\t        AND tr_master.object_id IN ({$duplicate_ids_in})\n\t\t        AND tt.taxonomy IN ({$taxonomies_in})");
     return $terms;
 }
 /**
  * Filters the active languages to include all languages in which strings exist.
  *
  * @param array[] $source_langs
  *
  * @return array[]
  */
 public function filter_tm_source_langs($source_langs)
 {
     $string_lang_codes = $this->wpdb->get_col("\tSELECT DISTINCT(s.language)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tFROM {$this->wpdb->prefix}icl_strings s\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tWHERE s.language\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tNOT IN (" . wpml_prepare_in(array_keys($source_langs)) . ")");
     foreach ($string_lang_codes as $lang_code) {
         $language = $this->sitepress->get_language_details($lang_code);
         if ((bool) $language === true) {
             $source_langs[$lang_code] = $language;
         }
     }
     return $source_langs;
 }
 protected function extra_conditions_snippet()
 {
     $extra_conditions = "";
     if (!empty($this->post_status)) {
         $status_snippet = " AND post_status IN (" . wpml_prepare_in($this->post_status) . ") ";
         $extra_conditions .= apply_filters('_icl_posts_language_count_status', $status_snippet);
     }
     $extra_conditions .= $this->post_status != array('trash') ? " AND post_status <> 'trash'" : '';
     $extra_conditions .= " AND post_status <> 'auto-draft' ";
     $extra_conditions .= parent::extra_conditions_snippet();
     return $extra_conditions;
 }
Пример #8
0
 private function migrate_old_translated_values($form_id)
 {
     global $wpdb;
     $st_context = $this->tm_api->get_st_context($form_id);
     $form_strings = array_keys($this->tm_api->get_form_strings($form_id));
     foreach ($form_strings as &$string_name) {
         $string_name = "{$form_id}_" . $string_name;
     }
     $s_name_in = wpml_prepare_in($form_strings);
     $id_s_needing_update = $wpdb->get_results($wpdb->prepare("SELECT st.id AS id, cs.id AS right_id\n                 FROM {$wpdb->prefix}icl_strings s\n                 JOIN {$wpdb->prefix}icl_strings cs\n                  ON CONCAT(%s,cs.title) = s.name\n                 JOIN {$wpdb->prefix}icl_string_translations st\n                  ON s.id = st.string_id\n                 LEFT JOIN {$wpdb->prefix}icl_string_translations cst\n                  ON cs.id = cst.string_id AND st.language = cst.language\n                 WHERE s.context = 'gravity_form'\n                  AND cs.context = %s\n                  AND cst.language IS NULL\n                  AND s.name IN ({$s_name_in})", $form_id . '_', $st_context));
     foreach ($id_s_needing_update as $id_data) {
         $wpdb->update($wpdb->prefix . 'icl_string_translations', array('string_id' => $id_data->right_id), array('id' => $id_data->id));
     }
 }
 private function get_multiple_slug_adjusted_IDs($slugs)
 {
     global $wpdb;
     $pages_with_name = $wpdb->get_results("\n\t\t\t\tSELECT ID, post_name, post_parent\n\t\t\t\tFROM {$wpdb->posts} p\n\t\t\t\tJOIN {$wpdb->prefix}icl_translations t\n\t\t\t\tON p.ID = t.element_id AND element_type='post_page'\n\t\t\t\tWHERE p.post_name IN (" . wpml_prepare_in($slugs) . ")\n\t\t\t\t");
     $page_names = array();
     $page_objects = array();
     foreach ($pages_with_name as $page) {
         $page_names[$page->ID] = $page->post_name;
         $page_objects[$page->ID] =& $page;
     }
     array_pop($slugs);
     foreach ($pages_with_name as &$page) {
         $page = $this->remove_by_wrong_parent($page, $page->post_parent, $page_names, $page_objects, $slugs);
     }
     return array_filter($pages_with_name);
 }
    function cms_navigation_meta_box($post)
    {
        global $wpdb, $sitepress;
        if (!$sitepress->get_setting('setup_complete')) {
            return;
        }
        //if it's a new post copy some custom fields from the original post
        $cms_nav_section = false;
        if ($post->ID == 0 && isset($_GET['trid']) && $_GET['trid']) {
            $copied_custom_fields = array('_top_nav_excluded', '_cms_nav_minihome');
            foreach ($copied_custom_fields as $k => $v) {
                $copied_custom_fields[$k] = "'" . $v . "'";
            }
            $res_prepared = $wpdb->prepare("\r\r\n                SELECT meta_key, meta_value FROM {$wpdb->prefix}icl_translations tr\r\r\n                JOIN {$wpdb->postmeta} pm ON tr.element_id = pm.post_id\r\r\n                WHERE tr.trid=%d AND (source_language_code IS NULL OR source_language_code='')\r\r\n                    AND meta_key IN (" . wpml_prepare_in($copied_custom_fields) . ")\r\r\n            ", $_GET['trid']);
            $res = $wpdb->get_results($res_prepared);
            foreach ($res as $r) {
                $post_custom[$r->meta_key][0] = $r->meta_value;
            }
        } else {
            // get sections
            global $sitepress;
            $current_language = $sitepress->get_current_language();
            $sql = $wpdb->prepare("\r\r\n\t\t\t\t\tSELECT\r\r\n\t\t\t\t\t  DISTINCT meta_value\r\r\n\t\t\t\t\tFROM {$wpdb->postmeta} pm\r\r\n\t\t\t\t\tINNER JOIN {$wpdb->prefix}icl_translations t\r\r\n\t\t\t\t\tON t.element_id = pm.post_id\r\r\n\t\t\t\t\tWHERE meta_key='_cms_nav_section'\r\r\n\t\t\t\t\tAND t.element_type = 'post_page'\r\r\n\t\t\t\t\tAND t.language_code = %s\r\r\n\t\t\t\t\t", $current_language);
            $sections = $wpdb->get_col($sql);
            $post_custom = get_post_custom($post->ID);
            $cms_nav_section = isset($post_custom['_cms_nav_section'][0]) ? $post_custom['_cms_nav_section'][0] : '';
        }
        $top_nav_excluded = isset($post_custom['_top_nav_excluded'][0]) ? $post_custom['_top_nav_excluded'][0] : '';
        $cms_nav_minihome = isset($post_custom['_cms_nav_minihome'][0]) ? $post_custom['_cms_nav_minihome'][0] : '';
        $cms_nav_offsite_url = isset($post_custom['_cms_nav_offsite_url'][0]) ? $post_custom['_cms_nav_offsite_url'][0] : '';
        if ($top_nav_excluded) {
            $top_nav_excluded = 'checked="checked"';
        }
        if ($cms_nav_minihome) {
            $cms_nav_minihome = 'checked="checked"';
        }
        ?>

        <p>
        <label><input type="checkbox" value="1" name="exclude_from_top_nav" <?php 
        echo $top_nav_excluded;
        ?>
 />&nbsp; <?php 
        echo __('Exclude from the top navigation', 'wpml-cms-nav');
        ?>
</label> &nbsp;
        <label><input type="checkbox" value="1" name="cms_nav_minihome" <?php 
        echo $cms_nav_minihome;
        ?>
 />&nbsp; <?php 
        echo __('Mini home (don\'t list child pages for this page)', 'wpml-cms-nav');
        ?>
</label>
        </p>
        <p>
        <?php 
        echo __('Section', 'wpml-cms-nav');
        ?>

        <?php 
        if (!empty($sections)) {
            ?>

            <select name="cms_nav_section">    
            <option value=''><?php 
            echo __('--none--', 'wpml-cms-nav');
            ?>
</option>
            <?php 
            foreach ($sections as $s) {
                ?>

            <option <?php 
                if ($s == $cms_nav_section) {
                    echo 'selected="selected"';
                }
                ?>
><?php 
                echo $s;
                ?>
</option>
            <?php 
            }
            ?>
        
            </select>
        <?php 
        }
        ?>
    
        <input type="text" name="cms_nav_section_new" value="" <?php 
        if (!empty($sections)) {
            ?>
style="display:none"<?php 
        }
        ?>
 />
        <?php 
        if (!empty($sections)) {
            ?>

        <a href="javascript:" id="cms_nav_add_section"><?php 
            echo __('enter new', 'wpml-cms-nav');
            ?>
</a>
        <?php 
        }
        ?>
    
        </p>
        <p>
        <label><?php 
        echo __('Offsite page address', 'wpml-cms-nav');
        ?>
 <input type="text" style="width:100%" name="_cms_nav_offsite_url" value="<?php 
        echo esc_attr($cms_nav_offsite_url);
        ?>
" /></label>
        </p>
        <?php 
    }
 /**
  * @param string|array $terms_ids
  *
  * @return array
  */
 private function adjust_taxonomies_terms_ids($terms_ids)
 {
     /** @var  wpdb $wpdb */
     global $wpdb;
     $terms_ids = array_unique($this->explode_and_trim($terms_ids));
     if (empty($terms_ids)) {
         return $terms_ids;
     }
     // in_statement added two times to limit size of inner query
     $in_statement = wpml_prepare_in($terms_ids, '%d');
     $sql = $wpdb->prepare("SELECT a.term_id AS original, b.translated AS translated, a.taxonomy AS taxonomy\r\n                                     FROM {$wpdb->term_taxonomy} a LEFT OUTER JOIN\r\n                                                (SELECT t.term_id translated, o.term_id\r\n                                                 FROM {$wpdb->term_taxonomy} o, {$wpdb->term_taxonomy} t\r\n                                                 WHERE o.term_id IN ({$in_statement})\r\n                                                 AND t.term_id = (\tSELECT tt.term_id\r\n                                                                        FROM {$wpdb->term_taxonomy} tt\r\n                                                                        WHERE tt.term_taxonomy_id\r\n                                                                            = (\tSELECT element_id\r\n                                                                                FROM {$wpdb->prefix}icl_translations el\r\n                                                                                WHERE el.trid = (\tSELECT tr.trid\r\n                                                                                                FROM {$wpdb->prefix}icl_translations tr\r\n                                                                                                WHERE tr.element_id = o.term_taxonomy_id\r\n                                                                                                    AND tr.element_type LIKE 'tax%%' LIMIT 1)\r\n                                                                                    AND el.language_code = %s\r\n                                                                        LIMIT 1)\r\n                                                 LIMIT 1)) b on a.term_id=b.term_id\r\n                                     WHERE a.term_id IN ({$in_statement})\r\n                                                 ", $this->get_current_language());
     $adjusted_ids = $wpdb->get_results($sql);
     $translated_ids = array();
     foreach ($adjusted_ids as $adjusted_term) {
         if (!$this->is_translated_taxonomy($adjusted_term->taxonomy)) {
             $translated_ids[] = $adjusted_term->original;
             continue;
         }
         if (!is_null($adjusted_term->translated)) {
             $translated_ids[] = $adjusted_term->translated;
         }
     }
     return $translated_ids;
 }
 public function sync_with_translations($post_id, $post_vars = false)
 {
     global $wpdb;
     $term_count_update = new WPML_Update_Term_Count();
     $post = get_post($post_id);
     $translated_ids = $this->post_translation->get_element_translations($post_id, false, true);
     $post_format = $this->sync_post_format ? get_post_format($post_id) : null;
     $ping_status = $this->sync_ping_status ? pings_open($post_id) ? 'open' : 'closed' : null;
     $comment_status = $this->sync_comment_status ? comments_open($post_id) ? 'open' : 'closed' : null;
     $post_password = $this->sync_password ? $post->post_password : null;
     $post_status = $this->sync_private_flag && get_post_status($post_id) === 'private' ? 'private' : null;
     $menu_order = $this->sync_menu_order && !empty($post->menu_order) ? $post->menu_order : null;
     $page_template = $this->sync_page_template && get_post_type($post_id) === 'page' ? get_page_template_slug($post_id) : null;
     $post_date = $this->sync_post_date ? $wpdb->get_var($wpdb->prepare("SELECT post_date FROM {$wpdb->posts} WHERE ID=%d LIMIT 1", $post_id)) : null;
     if ((bool) $post_vars === true) {
         $this->sync_sticky_flag($this->post_translation->get_element_trid($post_id), $post_vars);
     }
     foreach ($translated_ids as $lang_code => $translated_pid) {
         $this->sync_custom_fields($post_id, $translated_pid);
         if ($post_format !== null) {
             set_post_format($translated_pid, $post_format);
         }
         if ($post_date !== null) {
             $post_date_gmt = get_gmt_from_date($post_date);
             $data = array('post_date' => $post_date, 'post_date_gmt' => $post_date_gmt);
             $now = gmdate('Y-m-d H:i:59');
             if (mysql2date('U', $post_date_gmt, false) > mysql2date('U', $now, false)) {
                 $post_status = 'future';
             } else {
                 $post_status = 'publish';
             }
             $data['post_status'] = $post_status;
             $wpdb->update($wpdb->posts, $data, array('ID' => $translated_pid));
         }
         if ($post_password !== null) {
             $wpdb->update($wpdb->posts, array('post_password' => $post_password), array('ID' => $translated_pid));
         }
         if ($post_status !== null && !in_array(get_post_status($translated_pid), array('auto-draft', 'draft', 'inherit', 'trash'))) {
             $wpdb->update($wpdb->posts, array('post_status' => $post_status), array('ID' => $translated_pid));
             $term_count_update->update_for_post($translated_pid);
         }
         if ($post_status == null && $this->sync_private_flag && get_post_status($translated_pid) == 'private') {
             $wpdb->update($wpdb->posts, array('post_status' => get_post_status($post_id)), array('ID' => $translated_pid));
             $term_count_update->update_for_post($translated_pid);
         }
         if ($ping_status !== null) {
             $wpdb->update($wpdb->posts, array('ping_status' => $ping_status), array('ID' => $translated_pid));
         }
         if ($comment_status !== null) {
             $wpdb->update($wpdb->posts, array('comment_status' => $comment_status), array('ID' => $translated_pid));
         }
         if ($page_template !== null) {
             update_post_meta($translated_pid, '_wp_page_template', $page_template);
         }
         $this->sync_with_translations($translated_pid);
     }
     if ($this->sync_parent) {
         $this->maybe_fix_translated_parent(get_post_type($post_id));
     }
     if ($menu_order !== null && (bool) $translated_ids !== false) {
         $wpdb->query("UPDATE {$wpdb->posts}\n\t\t\t\t   SET menu_order={$menu_order}\n\t\t\t\t   WHERE ID IN (" . wpml_prepare_in($translated_ids, '%d') . ")");
     }
 }
Пример #13
0
function icl_st_get_pending_string_translations_stats()
{
    global $wpdb, $sitepress, $sitepress_settings;
    $current_user = $sitepress->get_current_user();
    $user_lang_pairs = get_user_meta($current_user->ID, $wpdb->prefix . 'language_pairs', true);
    $stats = array();
    if (!empty($user_lang_pairs[$sitepress_settings['st']['strings_language']])) {
        $results = $wpdb->get_results($wpdb->prepare("\r\n            SELECT COUNT(id) AS c, language \r\n            FROM {$wpdb->prefix}icl_string_translations \r\n            WHERE status=%d AND language IN (" . wpml_prepare_in(array_keys($user_lang_pairs[$sitepress_settings['st']['strings_language']])) . ")\r\n                    AND (translator_id IS NULL or translator_id > 0)\r\n            GROUP BY language\r\n            ORDER BY c DESC\r\n            ", ICL_TM_WAITING_FOR_TRANSLATOR));
        foreach ($results as $r) {
            $_stats[$r->language] = $r->c;
        }
        foreach ($user_lang_pairs[$sitepress_settings['st']['strings_language']] as $lang => $one) {
            $stats[$lang] = isset($_stats[$lang]) ? $_stats[$lang] : 0;
        }
    }
    return $stats;
}
Пример #14
0
function icl_upgrade_2_0_0_steps($step, $stepper)
{
    global $wpdb, $sitepress, $wp_post_types, $sitepress_settings;
    if (!isset($sitepress)) {
        $sitepress = new SitePress();
    }
    $TranslationManagement = new TranslationManagement();
    $default_language = $sitepress->get_default_language();
    define('ICL_TM_DISABLE_ALL_NOTIFICATIONS', true);
    // make sure no notifications are being sent
    //if(defined('icl_upgrade_2_0_0_runonce')){
    //  return;
    //}
    //define('icl_upgrade_2_0_0_runonce', true);
    // fix source_language_code
    // assume that the lowest element_id is the source language
    ini_set('max_execution_time', 300);
    $post_types = array_keys($wp_post_types);
    foreach ($post_types as $pt) {
        $types[] = 'post_' . $pt;
    }
    $temp_upgrade_data = get_option('icl_temp_upgrade_data', array('step' => 0, 'offset' => 0));
    switch ($step) {
        case 1:
            // if the tables are missing, call the plugin activation routine
            $table_name = $wpdb->prefix . 'icl_translation_status';
            if ($wpdb->get_var("SHOW TABLES LIKE '{$table_name}'") != $table_name) {
                icl_sitepress_activate();
            }
            $wpdb->query("ALTER TABLE `{$wpdb->prefix}icl_translations` CHANGE `element_type` `element_type` VARCHAR( 32 ) NOT NULL DEFAULT 'post_post'");
            $wpdb->query("ALTER TABLE `{$wpdb->prefix}icl_translations` CHANGE `element_id` `element_id` BIGINT( 20 ) NULL DEFAULT NULL ");
            // fix source_language_code
            // all source documents must have null
            if (isset($types)) {
                $wpdb->query($wpdb->prepare("UPDATE {$wpdb->prefix}icl_translations SET source_language_code = NULL\n\t\t\t\t\tWHERE element_type IN('" . join("','", $types) . "') AND source_language_code = '' AND language_code=%s", $default_language));
                // get translated documents with missing source language
                $res = $wpdb->get_results($wpdb->prepare("\n\t\t\t\t\tSELECT translation_id, trid, language_code\n\t\t\t\t\tFROM {$wpdb->prefix}icl_translations\n\t\t\t\t\tWHERE (source_language_code = '' OR source_language_code IS NULL)\n\t\t\t\t\t\tAND element_type IN('" . join("','", $types) . "')\n\t\t\t\t\t\tAND language_code <> %s\n\t\t\t\t\t\t", $default_language));
                foreach ($res as $row) {
                    $wpdb->query($wpdb->prepare("UPDATE {$wpdb->prefix}icl_translations SET source_language_code = %s WHERE translation_id=%d", $default_language, $row->translation_id));
                }
            }
            $temp_upgrade_data['step'] = 2;
            update_option('icl_temp_upgrade_data', $temp_upgrade_data);
            return array('message' => __('Processing translations...', 'sitepress'));
            break;
        case 2:
            $limit = 100;
            $offset = $temp_upgrade_data['offset'];
            $processing = FALSE;
            //loop existing translations
            if (isset($types)) {
                $res = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->prefix}icl_translations\n                                 WHERE element_type IN(" . wpml_prepare_in($types) . " )\n                                    AND source_language_code IS NULL LIMIT %d  OFFSET %d", array($limit, $offset)));
                foreach ($res as $row) {
                    $processing = TRUE;
                    // grab translations
                    $translations = $sitepress->get_element_translations($row->trid, $row->element_type);
                    $md5 = 0;
                    $table_name = $wpdb->prefix . 'icl_node';
                    if ($wpdb->get_var("SHOW TABLES LIKE '{$table_name}'") == $table_name) {
                        list($md5, $links_fixed) = $wpdb->get_row($wpdb->prepare("\n\t\t\t\t\t\t\tSELECT md5, links_fixed FROM {$wpdb->prefix}icl_node\n\t\t\t\t\t\t\tWHERE nid = %d\n\t\t\t\t\t\t", $row->element_id), ARRAY_N);
                    }
                    if (!$md5) {
                        $md5 = $TranslationManagement->post_md5($row->element_id);
                    }
                    $translation_package = $TranslationManagement->create_translation_package($row->element_id);
                    foreach ($translations as $lang => $t) {
                        if (!$t->original) {
                            // determine service and status
                            $service = 'local';
                            $needs_update = 0;
                            list($rid, $status, $current_md5) = $wpdb->get_row($wpdb->prepare("\n\t\t\t\t\t\t\t\tSELECT c.rid, n.status , c.md5\n\t\t\t\t\t\t\t\tFROM {$wpdb->prefix}icl_content_status c\n\t\t\t\t\t\t\t\t\tJOIN {$wpdb->prefix}icl_core_status n ON c.rid = n.rid\n\t\t\t\t\t\t\t\tWHERE c.nid = %d AND target = %s\n\t\t\t\t\t\t\t\tORDER BY rid DESC\n\t\t\t\t\t\t\t\tLIMIT 1\n\t\t\t\t\t\t\t", $row->element_id, $lang), ARRAY_N);
                            $translator_id = false;
                            if ($rid) {
                                if ($current_md5 != $md5) {
                                    $needs_update = 1;
                                }
                                if ($status == 3) {
                                    $status = 10;
                                } else {
                                    $status = 2;
                                }
                                $service = 'icanlocalize';
                                foreach ($sitepress_settings['icl_lang_status'] as $lpair) {
                                    if ($lpair['from'] == $row->language_code && $lpair['to'] == $lang && isset($lpair['translators'][0]['id'])) {
                                        $translator_id = $lpair['translators'][0]['id'];
                                        break;
                                    }
                                }
                            } else {
                                $status = 10;
                                $translator_id = $wpdb->get_var($wpdb->prepare("SELECT post_author FROM {$wpdb->posts} WHERE ID=%d", $t->element_id));
                                $tlp = get_user_meta($translator_id, $wpdb->prefix . 'language_pairs', true);
                                $tlp[$row->language_code][$lang] = 1;
                                $TranslationManagement->edit_translator($translator_id, $tlp);
                            }
                            // add translation_status record
                            list($newrid) = $TranslationManagement->update_translation_status(array('translation_id' => $t->translation_id, 'status' => $status, 'translator_id' => $translator_id, 'needs_update' => $needs_update, 'md5' => $md5, 'translation_service' => $service, 'translation_package' => serialize($translation_package), 'links_fixed' => intval(isset($links_fixed) ? $links_fixed : 0)));
                            $job_id = $TranslationManagement->add_translation_job($newrid, $translator_id, $translation_package);
                            if ($job_id && $status == 10) {
                                $post = get_post($t->element_id);
                                $TranslationManagement->save_job_fields_from_post($job_id, $post);
                            }
                        }
                    }
                }
            }
            if ($processing) {
                update_option('icl_temp_upgrade_data', array('step' => 2, 'offset' => intval($offset + 100)));
                $stepper->setNextStep(2);
            } else {
                update_option('icl_temp_upgrade_data', array('step' => 3, 'offset' => 1.0E+20));
            }
            $message = $processing ? __('Processing translations...', 'sitepress') : __('Finalizing upgrade...', 'sitepress');
            return array('message' => $message);
            break;
        case 3:
            // removing the plugins text table; importing data into a Sitepress setting
            $results = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}icl_plugins_texts");
            if (!empty($results)) {
                foreach ($results as $row) {
                    $cft[$row->attribute_name] = $row->translate + 1;
                }
                if (isset($cft)) {
                    $iclsettings['translation-management']['custom_fields_translation'] = $cft;
                    $sitepress->save_settings($iclsettings);
                }
                $wpdb->query("DROP TABLE {$wpdb->prefix}icl_plugins_texts");
            }
            $iclsettings['language_selector_initialized'] = 1;
            if (get_option('_force_mp_post_http')) {
                $iclsettings['troubleshooting_options']['http_communication'] = intval(get_option('_force_mp_post_http'));
                delete_option('_force_mp_post_http');
            }
            // set default translators
            if (isset($sitepress_settings['icl_lang_status'])) {
                foreach ($sitepress_settings['icl_lang_status'] as $lpair) {
                    if (!empty($lpair['translators'])) {
                        $iclsettings['default_translators'][$lpair['from']][$lpair['to']] = array('id' => $lpair['translators'][0]['id'], 'type' => 'icanlocalize');
                    }
                }
            }
            $sitepress->save_settings($iclsettings);
            $iclsettings['migrated_2_0_0'] = 1;
            $sitepress->save_settings($iclsettings);
            delete_option('icl_temp_upgrade_data');
            return array('message' => __('Done', 'sitepress'), 'completed' => 1);
            break;
        default:
            return array('error' => __('Missing step', 'sitepress'), 'stop' => 1);
    }
}
Пример #15
0
 function add_posts_management_column($columns)
 {
     global $posts, $wpdb, $__management_columns_posts_translations;
     $element_type = isset($_REQUEST['post_type']) ? 'post_' . $_REQUEST['post_type'] : 'post_post';
     if (count($this->get_active_languages()) <= 1 || get_query_var('post_status') == 'trash') {
         return $columns;
     }
     if (isset($_POST['action']) && $_POST['action'] == 'inline-save' && $_POST['post_ID']) {
         $p = new stdClass();
         $p->ID = $_POST['post_ID'];
         $posts = array($p);
     } elseif (empty($posts)) {
         return $columns;
     }
     if (is_null($__management_columns_posts_translations)) {
         $post_ids = array();
         foreach ($posts as $p) {
             $post_ids[] = $p->ID;
         }
         // get posts translations
         // get trids
         $trid_array = $wpdb->get_col($wpdb->prepare("\n\t\t\t\tSELECT trid FROM {$wpdb->prefix}icl_translations\n\t\t\t\tWHERE element_type = %s AND element_id IN (" . wpml_prepare_in($post_ids, '%d') . ")\n\t\t\t", $element_type));
         $elements_translations = $wpdb->get_results("\n\t\t\t\tSELECT trid, element_id, language_code, source_language_code\n\t\t\t\tFROM {$wpdb->prefix}icl_translations\n\t\t\t\tWHERE trid IN (" . wpml_prepare_in($trid_array, '%d') . ")\n\t\t\t");
         foreach ($elements_translations as $v) {
             $by_trid[$v->trid][] = $v;
         }
         foreach ($elements_translations as $v) {
             if (in_array($v->element_id, $post_ids)) {
                 $el_trid = $v->trid;
                 foreach ($elements_translations as $val) {
                     if ($val->trid == $el_trid) {
                         $__management_columns_posts_translations[$v->element_id][$val->language_code] = $val;
                     }
                 }
             }
         }
     }
     $active_languages = $this->get_active_languages();
     $languages = array();
     foreach ($active_languages as $v) {
         if ($v['code'] == $this->get_current_language()) {
             continue;
         }
         $languages[] = $v['code'];
     }
     $res = $wpdb->get_results($wpdb->prepare("\n\t\t\tSELECT f.lang_code, f.flag, f.from_template, l.name\n\t\t\tFROM {$wpdb->prefix}icl_flags f\n\t\t\t\tJOIN {$wpdb->prefix}icl_languages_translations l ON f.lang_code = l.language_code\n\t\t\tWHERE l.display_language_code = %s AND f.lang_code IN(" . wpml_prepare_in($languages) . ")\n\t\t", $this->admin_language));
     foreach ($res as $r) {
         if ($r->from_template) {
             $wp_upload_dir = wp_upload_dir();
             $flag_path = $wp_upload_dir['baseurl'] . '/flags/';
         } else {
             $flag_path = ICL_PLUGIN_URL . '/res/flags/';
         }
         $flags[$r->lang_code] = '<img src="' . $flag_path . $r->flag . '" width="18" height="12" alt="' . $r->name . '" title="' . $r->name . '" />';
     }
     $flags_column = '';
     foreach ($active_languages as $v) {
         if (isset($flags[$v['code']])) {
             $flags_column .= $flags[$v['code']];
         }
     }
     $new_columns = array();
     foreach ($columns as $k => $v) {
         $new_columns[$k] = $v;
         if ($k == 'title') {
             $new_columns['icl_translations'] = $flags_column;
         }
     }
     return $new_columns;
 }
 private function duplicate_custom_fields($master_post_id, $lang)
 {
     $duplicate_post_id = false;
     $post_type = get_post_field('post_type', $master_post_id);
     $trid = $this->sitepress->get_element_trid($master_post_id, 'post_' . $post_type);
     if ($trid) {
         $translations = $this->sitepress->get_element_translations($trid, 'post_' . $post_type);
         if (isset($translations[$lang])) {
             $duplicate_post_id = $translations[$lang]->element_id;
         } else {
             return false;
             // translation not found!
         }
     }
     $default_exceptions = WPML_Config::get_custom_fields_translation_settings();
     $exceptions = apply_filters('wpml_duplicate_custom_fields_exceptions', array());
     $exceptions = array_merge($exceptions, $default_exceptions);
     $exceptions = array_unique($exceptions);
     $exceptions_in = !empty($exceptions) ? 'AND meta_key NOT IN ( ' . wpml_prepare_in($exceptions) . ') ' : '';
     $from_where_string = "FROM {$this->wpdb->postmeta} WHERE post_id = %d " . $exceptions_in;
     $post_meta_master = $this->wpdb->get_results("SELECT meta_key, meta_value " . $this->wpdb->prepare($from_where_string, $master_post_id));
     $this->wpdb->query("DELETE " . $this->wpdb->prepare($from_where_string, $duplicate_post_id));
     foreach ($post_meta_master as $post_meta) {
         $is_serialized = is_serialized($post_meta->meta_value);
         $meta_data = array('context' => 'custom_field', 'attribute' => 'value', 'key' => $post_meta->meta_key, 'is_serialized' => $is_serialized, 'post_id' => $duplicate_post_id, 'master_post_id' => $master_post_id);
         /**
          * @deprecated use 'wpml_duplicate_generic_string' instead, with the same arguments
          */
         $icl_duplicate_generic_string = apply_filters('icl_duplicate_generic_string', $post_meta->meta_value, $lang, $meta_data);
         $post_meta->meta_value = $icl_duplicate_generic_string;
         $wpml_duplicate_generic_string = apply_filters('wpml_duplicate_generic_string', $post_meta->meta_value, $lang, $meta_data);
         $post_meta->meta_value = $wpml_duplicate_generic_string;
         if (!is_serialized($post_meta->meta_value)) {
             $post_meta->meta_value = maybe_serialize($post_meta->meta_value);
         }
         $this->wpdb->insert($this->wpdb->postmeta, array('post_id' => $duplicate_post_id, 'meta_key' => $post_meta->meta_key, 'meta_value' => $post_meta->meta_value), array('%d', '%s', '%s'));
     }
     return true;
 }
 /**
  * Filter the MLA_List_Table columns
  *
  * Inserts the language columns just after the item thumbnail column.
  * Defined as static because it is called before the List_Table object is created.
  * Added as a filter when the file is loaded.
  *
  * @since 2.11
  *
  * @param	array	$columns An array of columns.
  *					format: column_slug => Column Label
  *
  * @return	array	updated array of columns.
  */
 public static function mla_list_table_get_columns($columns)
 {
     global $sitepress, $wpdb;
     if (is_null(self::$language_columns) && $sitepress->is_translated_post_type('attachment')) {
         /*
          * Build language management columns
          */
         $show_language = 'checked' == MLACore::mla_get_option('language_column', false, false, MLA_WPML::$mla_language_option_definitions);
         $current_language = $sitepress->get_current_language();
         $languages = $sitepress->get_active_languages();
         $view_status = isset($_REQUEST['status']) ? $_REQUEST['status'] : '';
         if (1 < count($languages) && $view_status != 'trash') {
             $show_translations = 'checked' == MLACore::mla_get_option('translations_column', false, false, MLA_WPML::$mla_language_option_definitions);
         } else {
             $show_translations = false;
         }
         self::$language_columns = array();
         if ($show_language && 'all' == $current_language) {
             self::$language_columns['language'] = __('Language', 'wpml-media');
         }
         if ($show_translations) {
             $language_codes = array();
             foreach ($languages as $language) {
                 if ($current_language != $language['code']) {
                     $language_codes[] = $language['code'];
                 }
             }
             $results = $wpdb->get_results($wpdb->prepare("\n\t\t\t\t\tSELECT f.lang_code, f.flag, f.from_template, l.name\n\t\t\t\t\tFROM {$wpdb->prefix}icl_flags f\n\t\t\t\t\t\tJOIN {$wpdb->prefix}icl_languages_translations l ON f.lang_code = l.language_code\n\t\t\t\t\tWHERE l.display_language_code = %s AND f.lang_code IN(" . wpml_prepare_in($language_codes) . ")", $sitepress->get_admin_language()));
             $wp_upload_dir = wp_upload_dir();
             foreach ($results as $result) {
                 if ($result->from_template) {
                     $flag_path = $wp_upload_dir['baseurl'] . '/flags/';
                 } else {
                     $flag_path = ICL_PLUGIN_URL . '/res/flags/';
                 }
                 $flags[$result->lang_code] = '<img src="' . $flag_path . $result->flag . '" width="18" height="12" alt="' . $result->name . '" title="' . $result->name . '" />';
             }
             $flags_column = '';
             foreach ($languages as $language) {
                 if (isset($flags[$language['code']])) {
                     $flags_column .= $flags[$language['code']];
                 }
             }
             self::$language_columns['icl_translations'] = $flags_column;
         }
         // multi-language not trash
     }
     // add columns
     if (!empty(self::$language_columns)) {
         $end = array_slice($columns, 2);
         $columns = array_slice($columns, 0, 2);
         $columns = array_merge($columns, self::$language_columns, $end);
     }
     return $columns;
 }
 /**
  * Add missing language to taxonomies
  *
  * @param array $post_types
  */
 private function add_missing_language_to_taxonomies($post_types)
 {
     global $sitepress, $wpdb;
     $taxonomy_types = array();
     foreach ($post_types as $post_type) {
         $taxonomy_types = array_merge($sitepress->get_translatable_taxonomies(true, $post_type), $taxonomy_types);
     }
     $taxonomy_types = array_unique($taxonomy_types);
     $taxonomies = $wpdb->get_results("SELECT taxonomy, term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy IN (" . wpml_prepare_in($taxonomy_types) . ")");
     if ($taxonomies) {
         foreach ($taxonomies as $taxonomy) {
             $this->add_missing_language_to_taxonomy($taxonomy);
         }
     }
 }
 /**
  * @param int    $post_id
  * @param string $taxonomy
  * @param array  $changed_ttids
  * @param bool   $bulk
  * Running this function will remove certain issues arising out of bulk adding of terms to posts of various languages.
  * This case can result in situations in which the WP Core functionality adds a term to a post, before the language assignment
  * operations of WPML are triggered. This leads to states in which terms can be assigned to a post even though their language
  * differs from that of the post.
  * This function behaves between hierarchical and flag taxonomies. Hierarchical terms from the wrong taxonomy are simply removed
  * from the post. Flat terms are added with the same name but in the correct language.
  * For flat terms this implies either the use of the existing term or the creation of a new one.
  * This function uses wpdb queries instead of the WordPress API, it is therefore save to be run out of
  * any language setting.
  */
 public static function quick_edited_post_terms($post_id, $taxonomy, $changed_ttids = array(), $bulk = false)
 {
     global $wpdb, $sitepress, $wpml_post_translations;
     if (!$sitepress->is_translated_taxonomy($taxonomy) || !($post_lang = $wpml_post_translations->get_element_lang_code($post_id))) {
         return;
     }
     $query_for_allowed_ttids = $wpdb->prepare("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE language_code = %s AND element_type = %s", $post_lang, 'tax_' . $taxonomy);
     $allowed_ttids = $wpdb->get_col($query_for_allowed_ttids);
     $new_ttids = array();
     foreach ($changed_ttids as $ttid) {
         if (!in_array($ttid, $allowed_ttids)) {
             $wrong_term_where = array('object_id' => $post_id, 'term_taxonomy_id' => $ttid);
             if (is_taxonomy_hierarchical($taxonomy)) {
                 // Hierarchical terms are simply deleted if they land on the wrong language
                 $wpdb->delete($wpdb->term_relationships, array('object_id' => $post_id, 'term_taxonomy_id' => $ttid));
             } else {
                 /* Flat taxonomy terms could also be given via their names and not their ttids
                  * In this case we append the ttids resulting from these names to the $changed_ttids array,
                  * we do this only in the case of these terms actually being present in another but the
                  * posts' language.
                  */
                 $query_for_term_name = $wpdb->prepare("SELECT t.name FROM {$wpdb->terms} AS t JOIN {$wpdb->term_taxonomy} AS tt ON t.term_id = tt.term_id WHERE tt.term_taxonomy_id=%d", $ttid);
                 $term_name = $wpdb->get_var($query_for_term_name);
                 $ttid_in_correct_lang = false;
                 if (!empty($allowed_ttids)) {
                     $in = wpml_prepare_in($allowed_ttids, "%d");
                     // Try to get the ttid of a term in the correct language, that has the same
                     $ttid_in_correct_lang = $wpdb->get_var($wpdb->prepare("SELECT tt.term_taxonomy_id\n\t\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\t\t{$wpdb->terms} AS t\n\t\t\t\t\t\t\t\tJOIN {$wpdb->term_taxonomy} AS tt\n\t\t\t\t\t\t\t\t\tON t.term_id = tt.term_id\n\t\t\t\t\t\t\tWHERE t.name=%s AND tt.taxonomy=%s AND tt.term_taxonomy_id IN ({$in})", $term_name, $taxonomy));
                 }
                 if (!$ttid_in_correct_lang) {
                     /* If we do not have a term by this name in the given taxonomy and language we have to create it.
                      * In doing so we must avoid interactions with filtering by wpml on this functionality and ensure uniqueness for the slug of the newly created term.
                      */
                     $new_term = wp_insert_term($term_name, $taxonomy, array('slug' => self::term_unique_slug(sanitize_title($term_name), $taxonomy, $post_lang)));
                     if (isset($new_term['term_taxonomy_id'])) {
                         $ttid_in_correct_lang = $new_term['term_taxonomy_id'];
                         $trid = $bulk ? $sitepress->get_element_trid($ttid, 'tax_' . $taxonomy) : false;
                         $sitepress->set_element_language_details($ttid_in_correct_lang, 'tax_' . $taxonomy, $trid, $post_lang);
                     }
                 }
                 if (!in_array($ttid_in_correct_lang, $changed_ttids)) {
                     $wpdb->update($wpdb->term_relationships, array('term_taxonomy_id' => $ttid_in_correct_lang), $wrong_term_where);
                     $new_ttids[] = $ttid_in_correct_lang;
                 } else {
                     $wpdb->delete($wpdb->term_relationships, array('object_id' => $post_id, 'term_taxonomy_id' => $ttid));
                 }
             }
         }
     }
     // Update term counts manually here, since using sql, will not trigger the updating of term counts automatically.
     wp_update_term_count(array_merge($changed_ttids, $new_ttids), $taxonomy);
 }
Пример #20
0
 function _get_lang_info()
 {
     global $wpdb;
     // get the attachment languages.
     //if query-attachments need display all attachments
     if (isset($_POST['action']) && $_POST['action'] == 'query-attachments') {
         $results_prepared = $wpdb->prepare("SELECT ID, post_parent FROM {$wpdb->posts} WHERE post_type=%s", array('attachment'));
         $results = $wpdb->get_results($results_prepared);
     } else {
         //don't display attachments auto-draft posts
         $results_prepared = $wpdb->prepare("SELECT p.ID, p.post_parent FROM {$wpdb->posts} AS p LEFT JOIN {$wpdb->posts} AS p1 ON p.post_parent = p1.id WHERE p1.post_status <> %s AND p.post_type=%s", array('auto-draft', 'attachment'));
         $results = $wpdb->get_results($results_prepared);
     }
     $this->parents = array();
     $this->unattached = array();
     foreach ($results as $result) {
         $this->parents[$result->ID] = $result->post_parent;
         if (!$result->post_parent) {
             $this->unattached[] = $result->ID;
         }
     }
     if (isset($_POST['action']) && $_POST['action'] == 'query-attachments') {
         //don't display attachments auto-draft posts
         $results_prepared = $wpdb->prepare("\n\t\t\t\t\t\t\t\t\t\t\tSELECT p.id, t.language_code\n\t\t\t\t\t\t\t\t\t\t\tFROM {$wpdb->posts} AS p\n\t\t\t\t\t\t\t\t\t\t\t\tLEFT JOIN {$wpdb->posts} AS p1 ON p.post_parent = p1.id\n\t\t\t\t\t\t\t\t\t\t\t\tINNER JOIN {$wpdb->prefix}icl_translations AS t ON p.id = t.element_id\n\t\t\t\t\t\t\t\t\t\t\tWHERE p1.post_status <> %s\n\t\t\t\t\t\t\t\t\t\t\t\tAND t.element_type=%s\n\t\t\t\t\t\t\t\t\t\t", array('auto-draft', 'post_attachment'));
         $results = $wpdb->get_results($results_prepared);
     } else {
         $results_prepared = $wpdb->prepare("\n\t\t\t\t\t\t\t\t\t\t\tSELECT p.id, t.language_code\n\t\t\t\t\t\t\t\t\t\t\tFROM {$wpdb->posts} AS p\n\t\t\t\t\t\t\t\t\t\t\t\tINNER JOIN {$wpdb->prefix}icl_translations AS t ON p.id = t.element_id\n\t\t\t\t\t\t\t\t\t\t\tWHERE t.element_type=%s\n\t\t\t\t\t\t\t\t\t\t", array('post_attachment'));
         $results = $wpdb->get_results($results_prepared);
     }
     $this->languages = array();
     foreach ($results as $result) {
         $this->languages[$result->id] = $result->language_code;
     }
     // determine list of att without language set (with their parents)
     foreach ($this->parents as $att_id => $parent_id) {
         if (!isset($this->languages[$att_id]) && isset($parent_languages[$parent_id])) {
             $missing_languages[$att_id] = $parent_id;
         }
     }
     // get language of their parents
     if (!empty($missing_languages)) {
         $results_prepared = "\n                SELECT p.ID, t.language_code\n                FROM {$wpdb->posts} p JOIN {$wpdb->prefix}icl_translations t ON p.ID = t.element_id AND t.element_type = CONCAT('post_', p.post_type)\n                WHERE p.ID IN(" . wpml_prepare_in($missing_languages, '%d') . ")";
         $results = $wpdb->get_results($results_prepared);
         foreach ($results as $row) {
             $parent_languages[$row->ID] = $row->language_code;
         }
     }
     // set language of their parents
     if (isset($parent_languages)) {
         foreach ($this->parents as $att_id => $parent_id) {
             if (!isset($this->languages[$att_id])) {
                 $this->languages[$att_id] = $parent_languages[$parent_id];
             }
         }
     }
 }
Пример #21
0
function icl_get_tax_children_recursive($id, $taxonomy = 'category')
{
    global $wpdb;
    $id = (array) $id;
    $children = $wpdb->get_col($wpdb->prepare("SELECT term_id\n                                               FROM {$wpdb->term_taxonomy} x\n                                               WHERE x.taxonomy=%s\n                                                AND parent IN (" . wpml_prepare_in($id, '%d') . ")", $taxonomy));
    if (!empty($children)) {
        $children = array_merge($children, icl_get_tax_children_recursive($children));
    }
    return $children;
}
 /**
  * Formats term data retrieved from the database.
  *
  * @param $data array
  *
  * @return array
  */
 private function format_term_elements($data)
 {
     global $wpdb;
     $terms = array();
     foreach ($data as $element) {
         $term_translation = base64_decode($element->field_data_translated);
         if (!$term_translation) {
             $post_fields = isset($_POST['fields']) ? $_POST['fields'] : null;
             $current_element_in_post_fields = $post_fields ? $post_fields[$element->field_type] : null;
             if ($current_element_in_post_fields && $current_element_in_post_fields['tid'] == $element->tid) {
                 $term_translation = $current_element_in_post_fields['data'];
             }
         }
         $terms[substr($element->field_type, 2)] = array('original' => base64_decode($element->field_data), 'translation' => $term_translation, 'tid' => $element->tid, 'ttid_string' => $element->field_type);
     }
     $return = array();
     $ttids = array_keys($terms);
     if (!empty($ttids)) {
         $ttid_in_query_fragment = "term_taxonomy_id IN (" . wpml_prepare_in($ttids, '%d') . ")";
         $query = "SELECT taxonomy, term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE " . $ttid_in_query_fragment;
         $res = $wpdb->get_results($query);
         foreach ($res as $term) {
             if (!isset($return[$term->taxonomy])) {
                 $return[$term->taxonomy] = array();
             }
             $return[$term->taxonomy][] = $terms[$term->term_taxonomy_id];
         }
     }
     return $return;
 }
Пример #23
0
 public function set_locale_file_names($locale_file_names_pairs)
 {
     $lfn = $this->get_locale_file_names();
     $new = array_diff(array_keys($locale_file_names_pairs), array_keys($lfn));
     if (!empty($new)) {
         foreach ($new as $code) {
             $this->wpdb->insert($this->wpdb->prefix . 'icl_locale_map', array('code' => $code, 'locale' => $locale_file_names_pairs[$code]));
         }
     }
     $remove = array_diff(array_keys($lfn), array_keys($locale_file_names_pairs));
     if (!empty($remove)) {
         $this->wpdb->query("DELETE FROM {$this->wpdb->prefix}icl_locale_map\n                           WHERE code IN (" . wpml_prepare_in($remove) . ")");
     }
     $update = array_diff($locale_file_names_pairs, $lfn);
     foreach ($update as $code => $locale) {
         $this->wpdb->update($this->wpdb->prefix . 'icl_locale_map', array('locale' => $locale), array('code' => $code));
     }
     return true;
 }
Пример #24
0
 $active = $wpdb->get_col("SELECT code FROM {$wpdb->prefix}icl_languages WHERE active = 1");
 $wpdb->query("TRUNCATE TABLE `{$wpdb->prefix}icl_languages`");
 // @since 3.1.5 - mysql_* function deprecated in php 5.5+
 $wpdb->query("TRUNCATE TABLE `{$wpdb->prefix}icl_languages_translations`");
 $wpdb->query("TRUNCATE TABLE `{$wpdb->prefix}icl_flags`");
 foreach ($langs_names as $key => $val) {
     if (strpos($key, 'Norwegian Bokm') === 0) {
         $key = 'Norwegian Bokmål';
         $lang_codes[$key] = 'nb';
     }
     // exception for norwegian
     $default_locale = isset($lang_locales[$lang_codes[$key]]) ? $lang_locales[$lang_codes[$key]] : '';
     @$wpdb->insert($wpdb->prefix . 'icl_languages', array('english_name' => $key, 'code' => $lang_codes[$key], 'major' => $val['major'], 'active' => 0, 'default_locale' => $default_locale));
 }
 //restore active
 $wpdb->query("UPDATE {$wpdb->prefix}icl_languages SET active=1 WHERE code IN(" . wpml_prepare_in($active) . ")");
 foreach ($langs_names as $lang => $val) {
     if (strpos($lang, 'Norwegian Bokm') === 0) {
         $lang = 'Norwegian Bokmål';
         $lang_codes[$lang] = 'nb';
     }
     foreach ($val['tr'] as $k => $display) {
         if (strpos($k, 'Norwegian Bokm') === 0) {
             $k = 'Norwegian Bokmål';
         }
         if (!trim($display)) {
             $display = $lang;
         }
         if (!$wpdb->get_var($wpdb->prepare("SELECT id FROM {$wpdb->prefix}icl_languages_translations\n                                    WHERE language_code=%s\n                                      AND display_language_code=%s", $lang_codes[$lang], $lang_codes[$k]))) {
             $wpdb->insert($wpdb->prefix . 'icl_languages_translations', array('language_code' => $lang_codes[$lang], 'display_language_code' => $lang_codes[$k], 'name' => $display));
         }
 function delete_language($lang_id)
 {
     global $wpdb, $sitepress;
     $lang = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}icl_languages WHERE id=%d", $lang_id));
     if ($lang) {
         if (in_array($lang->code, $this->built_in_languages)) {
             $error = __("Error: This is a built in language. You can't delete it.", 'sitepress');
         } else {
             $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}icl_languages WHERE id=%d", $lang_id));
             $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}icl_languages_translations WHERE language_code=%s", $lang->code));
             $translation_ids = $wpdb->get_col($wpdb->prepare("SELECT translation_id FROM {$wpdb->prefix}icl_translations WHERE language_code=%s", $lang->code));
             if ($translation_ids) {
                 $rids = $wpdb->get_col("SELECT rid FROM {$wpdb->prefix}icl_translation_status WHERE translation_id IN (" . wpml_prepare_in($translation_ids, '%d') . ")");
                 if ($rids) {
                     $job_ids = $wpdb->get_col("SELECT job_id FROM {$wpdb->prefix}icl_translate_job WHERE rid IN (" . wpml_prepare_in($rids, '%d') . ")");
                     if ($job_ids) {
                         $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translate WHERE job_id IN (" . wpml_prepare_in($job_ids, '%d') . ")");
                     }
                 }
             }
             // delete posts
             $post_ids = $wpdb->get_col($wpdb->prepare("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type LIKE %s AND language_code=%s", array(wpml_like_escape('post_') . '%', $lang->code)));
             remove_action('delete_post', array($sitepress, 'delete_post_actions'));
             foreach ($post_ids as $post_id) {
                 wp_delete_post($post_id, true);
             }
             add_action('delete_post', array($sitepress, 'delete_post_actions'));
             // delete terms
             remove_action('delete_term', array($sitepress, 'delete_term'), 1, 3);
             $tax_ids = $wpdb->get_col($wpdb->prepare("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type LIKE %s AND language_code=%s", array(wpml_like_escape('tax_') . '%', $lang->code)));
             foreach ($tax_ids as $tax_id) {
                 $row = $wpdb->get_row($wpdb->prepare("SELECT term_id, taxonomy FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d", $tax_id));
                 if ($row) {
                     wp_delete_term($row->term_id, $row->taxonomy);
                 }
             }
             add_action('delete_term', array($sitepress, 'delete_term'), 1, 3);
             // delete comments
             global $IclCommentsTranslation;
             remove_action('delete_comment', array($IclCommentsTranslation, 'delete_comment_actions'));
             foreach ($post_ids as $post_id) {
                 wp_delete_post($post_id, true);
             }
             add_action('delete_comment', array($IclCommentsTranslation, 'delete_comment_actions'));
             $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}icl_translations WHERE language_code=%s", $lang->code));
             $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}icl_strings WHERE language=%s", $lang->code));
             $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}icl_string_translations WHERE language=%s", $lang->code));
             $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}icl_locale_map WHERE code=%s", $lang->code));
             $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}icl_flags WHERE lang_code=%s", $lang->code));
             icl_cache_clear(false);
             $sitepress->icl_translations_cache->clear();
             $sitepress->clear_flags_cache();
             $sitepress->icl_language_name_cache->clear();
             $this->message(sprintf(__("The language %s was deleted.", 'sitepress'), '<strong>' . $lang->code . '</strong>'));
         }
     } else {
         $error = __('Error: Language not found.', 'sitepress');
     }
     if (!empty($error)) {
         $this->error($error);
     }
 }
 public function prefetch_ids($element_ids)
 {
     $element_ids = (array) $element_ids;
     $element_ids = array_diff($element_ids, array_keys($this->element_trids));
     if ((bool) $element_ids === false) {
         return;
     }
     $trid_snippet = " tridt.element_id IN (" . wpml_prepare_in($element_ids, '%d') . ")";
     $sql = $this->build_sql($trid_snippet);
     $elements = $this->wpdb->get_results($sql, ARRAY_A);
     $this->group_and_populate_cache($elements);
 }
 function option_nav_menu_options($val)
 {
     global $wpdb, $sitepress;
     // special case of getting menus with auto-add only in a specific language
     $debug_backtrace = $sitepress->get_backtrace(5);
     //Ignore objects and limit to first 5 stack frames, since 4 is the highest index we use
     if (isset($debug_backtrace[4]) && $debug_backtrace[4]['function'] == '_wp_auto_add_pages_to_menu' && !empty($val['auto_add'])) {
         $post_lang = isset($_POST['icl_post_language']) ? $_POST['icl_post_language'] : (isset($_POST['lang']) ? $_POST['lang'] : false);
         //$val['auto_add'] = false;
         if ($post_lang) {
             $val['auto_add'] = $wpdb->get_col($wpdb->prepare("\n\t\t\t\t\tSELECT element_id\n\t\t\t\t\tFROM {$wpdb->prefix}icl_translations\n\t\t\t\t\tWHERE element_type='tax_nav_menu'\n\t\t\t\t\t\tAND element_id IN (" . wpml_prepare_in($val['auto_add'], '%d') . ")\n\t\t\t\t\t\tAND language_code = %s", $post_lang));
         }
     }
     return $val;
 }
function presscore_wpml_parse_query_filter($q)
{
    global $wpdb, $sitepress;
    $current_language = $sitepress->get_current_language();
    $default_language = $sitepress->get_default_language();
    if ($current_language != $default_language) {
        $cat_array = array();
        // cat
        if (isset($q->query_vars['cat']) && !empty($q->query_vars['cat'])) {
            $cat_array = array_map('intval', array_map('trim', explode(',', $q->query_vars['cat'])));
        }
        // category_name
        if (isset($q->query_vars['category_name']) && !empty($q->query_vars['category_name'])) {
            $categories = explode(",", $q->query_vars['category_name']);
            $cat_array = array();
            foreach ($categories as $category) {
                $category = trim($category);
                if ($category == "") {
                    // it happens for category_name = "some-cat,some-cat-2,", with comma at end
                    continue;
                }
                $cat = get_term_by('slug', preg_replace('#((.*)/)#', '', $category), 'category');
                if (!$cat) {
                    $cat = get_term_by('name', $category, 'category');
                }
                if (isset($cat) && is_object($cat) && $cat->term_id) {
                    $cat_array[] = $cat->term_id;
                }
            }
            if (empty($cat_array)) {
                $q->query_vars['p'] = -1;
            }
        }
        // category_and
        if (isset($q->query_vars['category__and']) && !empty($q->query_vars['category__and'])) {
            $cat_array = $q->query_vars['category__and'];
        }
        // category_in
        if (isset($q->query_vars['category__in']) && !empty($q->query_vars['category__in'])) {
            $cat_array = array_unique(array_merge($cat_array, array_map('intval', $q->query_vars['category__in'])));
        }
        // category__not_in
        if (isset($q->query_vars['category__not_in']) && !empty($q->query_vars['category__not_in'])) {
            $__cats = array();
            foreach ($q->query_vars['category__not_in'] as $key => $val) {
                $__cats[$key] = -1 * intval($val);
            }
            $cat_array = array_unique(array_merge($cat_array, $__cats));
        }
        if (!empty($cat_array)) {
            $translated_ids = array();
            foreach ($cat_array as $c) {
                if (intval($c) < 0) {
                    $sign = -1;
                } else {
                    $sign = 1;
                }
                $translated_ids[] = $sign * intval(icl_object_id(abs($c), 'category', true));
            }
            //cat
            if (isset($q->query_vars['cat']) && !empty($q->query_vars['cat'])) {
                $q->query_vars['cat'] = join(',', $translated_ids);
            }
            // category_name
            if (isset($q->query_vars['category_name']) && !empty($q->query_vars['category_name'])) {
                $_ctmp = get_term_by('id', $translated_ids[0], 'category');
                $q->query_vars['category_name'] = $_ctmp->slug;
            }
            // category__and
            if (isset($q->query_vars['category__and']) && !empty($q->query_vars['category__and'])) {
                $q->query_vars['category__and'] = $translated_ids;
            }
            // category__in
            if (isset($q->query_vars['category__in']) && !empty($q->query_vars['category__in'])) {
                $__translated_in = array();
                foreach ($translated_ids as $key => $t_id) {
                    if ($t_id > 0) {
                        $__translated_in[$key] = $t_id;
                    }
                }
                $q->query_vars['category__in'] = $__translated_in;
            }
            // category__not_in
            if (isset($q->query_vars['category__not_in']) && !empty($q->query_vars['category__not_in'])) {
                $__translated_not_in = array();
                foreach ($translated_ids as $key => $t_id) {
                    if ($t_id < 0) {
                        $__translated_not_in[$key] = $t_id;
                    }
                }
                $q->query_vars['category__not_in'] = $__translated_not_in;
            }
        }
        // TAGS
        $tag_array = array();
        // tag
        $tag_glue = '';
        if (isset($q->query_vars['tag']) && !empty($q->query_vars['tag'])) {
            if (false !== strpos($q->query_vars['tag'], ' ')) {
                $tag_glue = '+';
                $exp = explode(' ', $q->query_vars['tag']);
            } else {
                $tag_glue = ',';
                $exp = explode(',', $q->query_vars['tag']);
            }
            foreach ($exp as $e) {
                $tag_array[] = $wpdb->get_var($wpdb->prepare("SELECT x.term_id FROM {$wpdb->terms} t\r\n                    JOIN {$wpdb->term_taxonomy} x ON t.term_id=x.term_id WHERE x.taxonomy='post_tag' AND t.slug=%s", $e));
            }
            $_tmp = array_unique($tag_array);
            if (count($_tmp) == 1 && empty($_tmp[0])) {
                $tag_array = array();
            }
        }
        // tag_id
        if (isset($q->query_vars['tag_id']) && !empty($q->query_vars['tag_id'])) {
            $tag_array = array_map('trim', explode(',', $q->query_vars['tag_id']));
        }
        // tag__and
        if (isset($q->query_vars['tag__and']) && !empty($q->query_vars['tag__and'])) {
            $tag_array = $q->query_vars['tag__and'];
        }
        // tag__in
        if (isset($q->query_vars['tag__in']) && !empty($q->query_vars['tag__in'])) {
            $tag_array = $q->query_vars['tag__in'];
        }
        // tag__not_in
        if (isset($q->query_vars['tag__not_in']) && !empty($q->query_vars['tag__not_in'])) {
            $tag_array = $q->query_vars['tag__not_in'];
        }
        // tag_slug__in
        if (isset($q->query_vars['tag_slug__in']) && !empty($q->query_vars['tag_slug__in'])) {
            foreach ($q->query_vars['tag_slug__in'] as $t) {
                if ($tg = $wpdb->get_var($wpdb->prepare("\r\n                            SELECT x.term_id FROM {$wpdb->terms} t\r\n                            JOIN {$wpdb->term_taxonomy} x ON t.term_id=x.term_id\r\n                            WHERE x.taxonomy='post_tag' AND t.slug=%s", $t))) {
                    $tag_array[] = $tg;
                }
            }
        }
        // tag_slug__and
        if (isset($q->query_vars['tag_slug__and']) && !empty($q->query_vars['tag_slug__and'])) {
            foreach ($q->query_vars['tag_slug__and'] as $t) {
                $tag_array[] = $wpdb->get_var($wpdb->prepare("SELECT x.term_id FROM {$wpdb->terms} t\r\n                    JOIN {$wpdb->term_taxonomy} x ON t.term_id=x.term_id WHERE x.taxonomy='post_tag' AND t.slug=%s", $t));
            }
        }
        if (!empty($tag_array)) {
            $translated_ids = array();
            foreach ($tag_array as $c) {
                if (intval($c) < 0) {
                    $sign = -1;
                } else {
                    $sign = 1;
                }
                $_tid = intval(icl_object_id(abs($c), 'post_tag', true));
                $translated_ids[] = $sign * $_tid;
            }
        }
        if (!empty($translated_ids)) {
            //tag
            if (isset($q->query_vars['tag']) && $q->query_vars['tag'] !== "") {
                $slugs = $wpdb->get_col("SELECT slug\r\n                                                           FROM {$wpdb->terms}\r\n                                                           WHERE term_id IN (" . wpml_prepare_in($translated_ids, '%d') . ")");
                $q->query_vars['tag'] = join($tag_glue, $slugs);
            }
            //tag_id
            if (isset($q->query_vars['tag_id']) && !empty($q->query_vars['tag_id'])) {
                $q->query_vars['tag_id'] = join(',', $translated_ids);
            }
            // tag__and
            if (isset($q->query_vars['tag__and']) && !empty($q->query_vars['tag__and'])) {
                $q->query_vars['tag__and'] = $translated_ids;
            }
            // tag__in
            if (isset($q->query_vars['tag__in']) && !empty($q->query_vars['tag__in'])) {
                $q->query_vars['tag__in'] = $translated_ids;
            }
            // tag__not_in
            if (isset($q->query_vars['tag__not_in']) && !empty($q->query_vars['tag__not_in'])) {
                $q->query_vars['tag__not_in'] = array_map('abs', $translated_ids);
            }
            // tag_slug__in
            if (isset($q->query_vars['tag_slug__in']) && !empty($q->query_vars['tag_slug__in'])) {
                $q->query_vars['tag_slug__in'] = $wpdb->get_col("SELECT slug\r\n                                                           FROM {$wpdb->terms}\r\n                                                           WHERE term_id IN (" . wpml_prepare_in($translated_ids, '%d') . ")");
            }
            // tag_slug__and
            if (isset($q->query_vars['tag_slug__and']) && !empty($q->query_vars['tag_slug__and'])) {
                $q->query_vars['tag_slug__and'] = $wpdb->get_col("SELECT slug\r\n                                                           FROM {$wpdb->terms}\r\n                                                           WHERE term_id IN (" . wpml_prepare_in($translated_ids, '%d') . ")");
            }
        }
        // POST & PAGES
        $post_type = !empty($q->query_vars['post_type']) ? $q->query_vars['post_type'] : 'post';
        if (!is_array($post_type)) {
            $post_type = (array) $post_type;
        }
        // page_id
        if (isset($q->query_vars['page_id']) && !empty($q->query_vars['page_id'])) {
            $q->query_vars['page_id'] = icl_object_id($q->query_vars['page_id'], 'page', true);
            $q->query = preg_replace('/page_id=[0-9]+/', 'page_id=' . $q->query_vars['page_id'], $q->query);
        }
        // Adjust included IDs adjusting them with translated element, if present
        if (isset($q->query_vars['include']) && !empty($q->query_vars['include'])) {
            $include_arr = is_array($q->query_vars['include']) ? $q->query_vars['include'] : explode(',', $q->query_vars['include']);
            $include_arr_adjusted = array();
            foreach ($include_arr as $include_arr_id) {
                $include_arr_adjusted[] = icl_object_id($include_arr_id, get_post_type($include_arr_id), true);
            }
            $q->query_vars['include'] = is_array($q->query_vars['include']) ? $include_arr_adjusted : implode(',', $include_arr_adjusted);
        }
        // Adjust excluded IDs adjusting them with translated element, if present
        if (isset($q->query_vars['exclude']) && !empty($q->query_vars['exclude'])) {
            $exclude_arr = is_array($q->query_vars['exclude']) ? $q->query_vars['exclude'] : explode(',', $q->query_vars['exclude']);
            $exclude_arr_adjusted = array();
            foreach ($exclude_arr as $exclude_arr_id) {
                $exclude_arr_adjusted[] = icl_object_id($exclude_arr_id, get_post_type($exclude_arr_id), true);
            }
            $q->query_vars['exclude'] = is_array($q->query_vars['exclude']) ? $exclude_arr_adjusted : implode(',', $exclude_arr_adjusted);
        }
        // Adjust post id
        if (isset($q->query_vars['p']) && !empty($q->query_vars['p'])) {
            $q->query_vars['p'] = icl_object_id($q->query_vars['p'], $post_type[0], true);
        }
        // Adjust name
        if ($sitepress->is_translated_post_type($post_type[0]) && isset($q->query_vars['name']) && !empty($q->query_vars['name'])) {
            $pid_prepared = $wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE post_name=%s AND post_type=%s", array($q->query_vars['name'], $post_type[0]));
            $pid = $wpdb->get_var($pid_prepared);
            if (!empty($pid)) {
                $q->query_vars['p'] = icl_object_id($pid, $post_type[0], true);
                unset($q->query_vars['name']);
            }
        }
        // Adjust page name
        if (isset($q->query_vars['pagename']) && !empty($q->query_vars['pagename'])) {
            // find the page with the page name in the current language.
            $pid = $wpdb->get_var($wpdb->prepare("\r\n                            SELECT ID\r\n                            FROM {$wpdb->posts} p\r\n                            JOIN {$wpdb->prefix}icl_translations t\r\n                            ON p.ID = t.element_id AND element_type='post_page'\r\n                            WHERE p.post_name=%s AND t.language_code = %s\r\n                            ", $q->query_vars['pagename'], $current_language));
            if ($pid) {
                $q->query_vars['page_id'] = $pid;
                // We have found the page id
                unset($q->query_vars['pagename']);
                if ($q->query_vars['page_id'] == get_option('page_for_posts')) {
                    // it's the blog page.
                    $q->is_page = false;
                    // $wp_query->is_page       = false;
                    $q->is_home = true;
                    // $wp_query->is_home       = true;
                    $q->is_posts_page = true;
                    // $wp_query->is_posts_page = true;
                }
            }
        }
        // post__in
        if (isset($q->query_vars['post__in']) && !empty($q->query_vars['post__in'])) {
            $pid = array();
            foreach ($q->query_vars['post__in'] as $p) {
                if ($post_type) {
                    foreach ($post_type as $pt) {
                        $pid[] = icl_object_id($p, $pt, true);
                    }
                }
            }
            $q->query_vars['post__in'] = $pid;
        }
        // post__not_in
        if (isset($q->query_vars['post__not_in']) && !empty($q->query_vars['post__not_in'])) {
            $pid = array();
            foreach ($q->query_vars['post__not_in'] as $p) {
                if ($post_type) {
                    foreach ($post_type as $pt) {
                        $pid[] = icl_object_id($p, $pt, true);
                    }
                }
            }
            $q->query_vars['post__not_in'] = $pid;
        }
        // post_parent
        if (isset($q->query_vars['post_parent']) && !empty($q->query_vars['post_parent']) && $q->query_vars['post_type'] != 'attachment') {
            if ($post_type) {
                $_parent_type = $wpdb->get_var($wpdb->prepare("SELECT post_type FROM {$wpdb->posts} WHERE ID=%d", $q->query_vars['post_parent']));
                $q->query_vars['post_parent'] = icl_object_id($q->query_vars['post_parent'], $_parent_type, true);
            }
        }
        // custom taxonomies
        if (isset($q->query_vars['taxonomy']) && $q->query_vars['taxonomy']) {
            $tax_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->terms} WHERE slug=%s", $q->query_vars['term']));
            if ($tax_id) {
                $translated_tax_id = icl_object_id($tax_id, $q->query_vars['taxonomy'], true);
            }
            if (isset($translated_tax_id)) {
                $q->query_vars['term'] = $wpdb->get_var($wpdb->prepare("SELECT slug FROM {$wpdb->terms} WHERE term_id = %d", $translated_tax_id));
                $q->query[$q->query_vars['taxonomy']] = $q->query_vars['term'];
            }
        }
        //TODO: [WPML 3.3] Discuss this. Why WP assumes it's there if query vars are altered? Look at wp-includes/query.php line #2468 search: if ( $this->query_vars_changed ) {
        if (!isset($q->query_vars['meta_query'])) {
            $q->query_vars['meta_query'] = array();
        }
        if (isset($q->query_vars['tax_query']) && is_array($q->query_vars['tax_query'])) {
            foreach ($q->query['tax_query'] as $num => $fields) {
                if (!isset($fields['terms'])) {
                    continue;
                }
                if (is_array($fields['terms'])) {
                    foreach ($fields['terms'] as $term) {
                        $taxonomy = get_term_by($fields['field'], $term, $fields['taxonomy']);
                        if (is_object($taxonomy)) {
                            if ($fields['field'] == 'id') {
                                $field = isset($taxonomy->term_id) ? $taxonomy->term_id : null;
                            } else {
                                $field = isset($taxonomy->{$fields['field']}) ? $taxonomy->{$fields['field']} : null;
                            }
                            $tmp = $q->query['tax_query'][$num]['terms'];
                            $tmp = array_diff((array) $tmp, array($term));
                            // removes from array element with original value
                            $tmp[] = $field;
                            //Reindex array
                            $q->query['tax_query'][$num]['terms'] = array_values($tmp);
                            if (isset($q->tax_query->queries[$num]['terms'])) {
                                $tmp = $q->tax_query->queries[$num]['terms'];
                            } else {
                                $tmp = array();
                                // clean $tmp variable
                            }
                            $tmp = array_diff((array) $tmp, array($term));
                            // see above
                            $tmp[] = $field;
                            //Reindex array
                            $q->tax_query->queries[$num]['terms'] = array_values($tmp);
                            $tmp = $q->query_vars['tax_query'][$num]['terms'];
                            $tmp = array_diff((array) $tmp, array($term));
                            // see above
                            $tmp[] = $field;
                            //Reindex array
                            $q->query_vars['tax_query'][$num]['terms'] = array_values($tmp);
                            unset($tmp);
                        }
                    }
                } else {
                    if (is_string($fields['terms'])) {
                        $taxonomy = get_term_by($fields['field'], $fields['terms'], $fields['taxonomy']);
                        if (is_object($taxonomy)) {
                            $field = isset($taxonomy->{$fields['field']}) ? $taxonomy->{$fields['field']} : null;
                            $q->query['tax_query'][$num]['terms'] = $field;
                            $q->tax_query->queries[$num]['terms'][0] = $field;
                            $q->query_vars['tax_query'][$num]['terms'] = $field;
                        }
                    }
                }
            }
        }
    }
    return $q;
}
Пример #29
0
     foreach ($wp_taxonomies as $t => $v) {
         $orphans = $wpdb->get_col("\r\n                SELECT t.translation_id \r\n                FROM {$wpdb->prefix}icl_translations t \r\n                LEFT JOIN {$wpdb->term_taxonomy} p \r\n                ON t.element_id = p.term_taxonomy_id \r\n                WHERE t.element_type = 'tax_{$t}' \r\n                AND p.taxonomy <> '{$t}'\r\n                    ");
         if (!empty($orphans)) {
             $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translations\r\n                                       WHERE translation_id IN (" . wpml_prepare_in($orphans, '%d') . ")");
         }
     }
 }
 // remove ghost translations
 // get unlinked rids
 $rids = $wpdb->get_col("SELECT rid FROM {$wpdb->prefix}icl_translation_status WHERE translation_id NOT IN (SELECT translation_id FROM {$wpdb->prefix}icl_translations)");
 if ($rids) {
     $jids = $wpdb->get_col("SELECT job_id FROM {$wpdb->prefix}icl_translate_job WHERE rid IN (" . wpml_prepare_in($rids, '%d') . ")");
     if ($jids) {
         $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translate WHERE job_id IN (" . wpml_prepare_in($jids, '%d') . ")");
         $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translate_job WHERE job_id IN (" . wpml_prepare_in($jids, '%d') . ")");
         $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translation_status WHERE rid IN (" . wpml_prepare_in($rids, '%d') . ")");
     }
 }
 // remove any duplicates in icl_translations
 $trs = $wpdb->get_results("SELECT element_id, GROUP_CONCAT(translation_id) AS tids FROM {$wpdb->prefix}icl_translations\r\n                WHERE element_id > 0 AND element_type LIKE 'post\\_%' GROUP BY element_id");
 foreach ($trs as $r) {
     $exp = explode(',', $r->tids);
     if (count($exp) > 1) {
         $maxtid = max($exp);
         foreach ($exp as $e) {
             if ($e != $maxtid) {
                 $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->prefix}icl_translations WHERE translation_id=%d", $e));
             }
         }
     }
 }
    public function render($domains)
    {
        $all_languages = $this->sitepress->get_languages($this->sitepress->get_admin_language());
        ?>
			<div id="wpml-change-domain-language-dialog"
				 class="wpml-change-language-dialog"
				 title="<?php 
        _e('Language of domains', 'wpml-string-translation');
        ?>
"
				 style="display:none"
				 data-button-text="<?php 
        _e('Apply', 'wpml-string-translation');
        ?>
" 
				 data-cancel-text="<?php 
        _e('Cancel', 'wpml-string-translation');
        ?>
" >
				<label for="wpml-domain-select">
					<?php 
        _e('Select for which domain to set the language: ', 'wpml-string-translation');
        ?>
				</label>
				<select id="wpml-domain-select">
					<option value="" selected="selected"><?php 
        _e('-- Please select --', 'wpml-string-translation');
        ?>
</option>
					<?php 
        foreach ($domains as $domain) {
            $results = $this->wpdb->get_results($this->wpdb->prepare("\r\n\t\t\t\t\t\t\t\tSELECT language, COUNT(language) AS count\r\n\t\t\t\t\t\t\t\tFROM {$this->wpdb->prefix}icl_strings s\r\n\t\t\t\t\t\t\t\tWHERE context = %s\r\n\t\t\t\t\t\t\t\t\tAND language IN (" . wpml_prepare_in(array_keys($all_languages)) . ")\r\n\t\t\t\t\t\t\t\tGROUP BY language\r\n\t\t\t\t\t\t\t\t", $domain->context), ARRAY_A);
            foreach ($results as &$result) {
                $result['display_name'] = $all_languages[$result['language']]['display_name'];
            }
            $domain_lang = $this->language_of_domain->get_language($domain->context);
            if ($domain_lang) {
                $domain_data = 'data-domain_lang="' . $domain_lang . '" ';
            } else {
                $domain_data = 'data-domain_lang="" ';
            }
            echo '<option value="' . $domain->context . '" data-langs="' . esc_attr(wp_json_encode($results)) . '"' . $domain_data . '>' . $domain->context . '</option>';
        }
        ?>
				
				</select>
				<div class="js-summary wpml-cdl-summary" style="display:none" >
					<p class="wpml-cdl-info">
						<?php 
        _e('This domain currently has the following strings:', 'wpml-string-translation');
        ?>
					</p>
					<table class="widefat striped wpml-cdl-table">
						<thead>
							<tr>
								<td class="manage-column column-cb check-column"><input class="js-all-check" type="checkbox" value="all" /></td>
								<th><?php 
        _e('Current source language', 'wpml-string-translation');
        ?>
</th>
								<th class="num"><?php 
        _e('Number of strings', 'wpml-string-translation');
        ?>
</th>
							</tr>
						</thead>
						<tbody>
						</tbody>
					</table>
					<div class="js-lang-select-area wpml-cdl-info">
						<label for="wpml-source-domain-language-change"><?php 
        _e('Set the source language of these strings to:', 'wpml-string-translation');
        ?>
</label>
						<?php 
        $lang_selector = new WPML_Simple_Language_Selector($this->sitepress);
        echo $lang_selector->render(array('id' => 'wpml-source-domain-language-change'));
        ?>
						<label for="wpml-cdl-set-default">
							<input id="wpml-cdl-set-default" type="checkbox" class="js-default" value="use-as-default" checked="checked" />
							<?php 
        _e('Use this language as the default language for new strings in this domain', 'wpml-string-translation');
        ?>
						</label>
					</div>
				</div>
				<img src="<?php 
        echo ICL_PLUGIN_URL . '/res/img/ajax-loader.gif';
        ?>
" alt="loading" height="16" width="16" class="wpml_tt_spinner"/>
				<?php 
        wp_nonce_field('wpml_change_string_domain_language_nonce', 'wpml_change_string_domain_language_nonce');
        ?>
			</div>
		<?php 
    }