Support Log in

14. Language-Aware Queries (WP_Query)

Developer Guide
Prefer video? Watch the Lang Forge tutorials 9 short guides covering every feature Watch

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',
        ],
    ],
]);
Example: Custom post type archive with language filter
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();

Forge AI Assistant Online

Hi! I'm the Lang Forge AI assistant. Ask me anything about the plugin — setup, features, troubleshooting, or development.

Just now
Powered by Forge AI · Browse docs