$lang) $languages[$key] = $polylang->get_language($lang)->term_id; // invert the array return array_diff($polylang->get_languages_list(array('fields' => 'ids')), $languages); } function pre_get_posts($query) { $qvars = $query->query_vars; if (is_admin() || !isset($qvars['lang']) /*|| (isset($qvars['pagename']) && $qvars['pagename'])*/) return; $query->set('tax_query', array(array( 'taxonomy' => 'language', 'fields' => 'ids', 'terms' => $this->invert_languages_ids($qvars['lang']), 'operator' => 'NOT IN' ))); $this->curlang = $qvars['lang']; // remember the queried language unset ($query->query_vars['lang']); // to allow querying posts with no language $query->is_tax = false; // to avoid lot of errors } // so that Polylang knows the language to load function wp() { if (isset($this->curlang)) set_query_var('lang', $this->curlang); } function posts_where($sql) { global $polylang, $wpdb; foreach (array('getarchives', 'get_previous_post', 'get_next_post') as $filter) foreach (array('_join', '_where') as $clause) remove_filter($filter.$clause, array(&$polylang, 'posts'.$clause)); $p = current_filter() == 'getarchives_where' ? $wpdb->posts : 'p'; $ids = implode(',', $this->invert_languages_ids($polylang->get_current_language())); return $sql . $wpdb->prepare(" AND ($p.ID NOT IN ( SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id IN ($ids) ))"); } function terms_clauses($clauses) { preg_match('#pll_tm.meta_value IN \(([0-9]+)\)#', $clauses['where'], $matches); if (!empty($matches)) { global $wpdb; $where_lang = $wpdb->prepare("pll_tm.meta_key = '_language' AND pll_tm.meta_value IN (%d)", $matches[1]); // terms in the right language $where_none = $wpdb->prepare("t.term_id NOT IN (SELECT term_id FROM $wpdb->termmeta WHERE meta_key IN ('_language'))"); // terms with no language set $clauses['where'] = str_replace($where_lang, "(($where_lang) OR ($where_none))", $clauses['where']); } return $clauses; } } new pll_no_lang(); ?>