How to build custom queries that respect the multilingual structure of your site.
Basic Language-Filtered Query
php
// Get all English posts
$english_posts = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 10,
'meta_query' => [
[
'key' => '_lf_language',
'value' => 'en',
],
],
]);Querying Posts in the Current Language
php
// The main query is automatically filtered by Lang Forge.
// For secondary queries, add the language filter manually:
$current_lang = lf_get_current_language();
$args = [
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => get_query_var('paged', 1),
'meta_query' => [
'relation' => 'OR',
[
'key' => '_lf_language',
'value' => $current_lang,
],
[
'key' => '_lf_language',
'compare' => 'NOT EXISTS',
],
],
];
$query = new WP_Query($args);Querying Posts in All Languages
php
// If you need a query that returns posts in ALL languages,
// use a custom query parameter and remove Lang Forge's filter:
add_action('pre_get_posts', function ($query) {
if ($query->get('all_languages')) {
$meta_query = $query->get('meta_query');
if (is_array($meta_query)) {
foreach ($meta_query as $key => $clause) {
if (is_array($clause) && isset($clause['key']) && $clause['key'] === '_lf_language') {
unset($meta_query[$key]);
}
}
$query->set('meta_query', array_values($meta_query));
}
}
}, 99);
// Usage:
$all_posts = new WP_Query([
'post_type' => 'post',
'all_languages' => true,
'posts_per_page' => -1,
]);Querying Posts Without a Language
php
// Find posts that have no language assigned
$unassigned = new WP_Query([
'post_type' => 'any',
'meta_query' => [
[
'key' => '_lf_language',
'compare' => 'NOT EXISTS',
],
],
]);php
// archive-portfolio.php
$lang = lf_get_current_language();
$portfolio = new WP_Query([
'post_type' => 'portfolio',
'posts_per_page' => 12,
'meta_query' => [
[
'key' => '_lf_language',
'value' => $lang,
],
],
'orderby' => 'menu_order',
'order' => 'ASC',
]);
echo '<div class="portfolio-grid">';
while ($portfolio->have_posts()) {
$portfolio->the_post();
$translations = lf_get_post_translations(get_the_ID());
$trans_count = count($translations);
echo '<div class="portfolio-item">';
echo '<a href="' . esc_url(get_permalink()) . '">';
if (has_post_thumbnail()) {
the_post_thumbnail('medium');
}
echo '<h3>' . get_the_title() . '</h3>';
if ($trans_count > 1) {
echo '<span class="lang-count">' . $trans_count . ' languages</span>';
}
echo '</a>';
echo '</div>';
}
echo '</div>';
wp_reset_postdata();—