按 Polylang 语言过滤 WooCommerce 相关产品

Filter WooCommerce related products by Polylang language

我正在使用 polylang 插件来拥有多语言网站。

将 WooCommerce 与 polylang 结合使用需要为每种语言复制每个产品,因此假设我有希伯来语和英语,这意味着每个产品有 2 个重复。

它与 WooCommerce 插件配合使用时效果很好,但是当我在产品页面末尾显示“相关产品”时,它会将英语和希伯来语的产品混合在一起。

我希望通过网站当前语言过滤相关产品(if(get_locale() == 'en_US') - 检查网站当前语言环境状态,否则将代表希伯来语)。

Polylang functions

这是我尝试过的方法,但我卡在了按语言过滤产品的部分:

add_filter( 'woocommerce_product_related_posts', 'custom_related_products' );
function custom_related_products($product){
    global $woocommerce;
    // Meta query
    $meta_query = array();
    $meta_query[] = $woocommerce->query->visibility_meta_query();
    $meta_query[] = $woocommerce->query->stock_status_meta_query();
    $meta_query   = array_filter( $meta_query );
    // Get the posts
    $related_posts = get_posts( array(
            'orderby'        => 'rand',
            'posts_per_page' => '4',
            'post_type'      => 'product',
            'fields'         => 'ids',
            'meta_query'     => $meta_query
        ) );

        if ( $related_posts->have_posts() ) {
          while ( $related_posts->have_posts() ) : $related_posts->the_post();
            if(pll_get_post_language(get_the_ID())){
               //Not sure its the right approach for this..
            }
          endwhile;
        }
    $related_posts = array_diff( $related_posts, array( $product->id ), $product->get_upsells() );
    return $related_posts;
}

如何按语言过滤 Woocommerce 相关产品部分?

编辑

所以经过一些研究和评论中的帮助,我发现 'lang' => 'en' 参数确实存在,但即使我使用它,相关产品的语言显示也没有变化。 有什么想法吗?

您可以试试这个代码:

$related_posts = get_posts( array(
    'orderby'        => 'rand',
    'posts_per_page' => '4',
    'post_type'      => 'product',
    'meta_query'     => $meta_query,
    'lang'           => 'en'
) );

if ($related_posts) {
    foreach ($related_posts as $post) {
        setup_postdata($post);
        // something like <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    }
}

wp_reset_postdata();

此代码正确 returns 我网站上所选语言的代码

add_filter( 'woocommerce_product_related_posts', 'custom_related_products' );
function custom_related_products($product){
    global $woocommerce;
    // Meta query
    $meta_query = array();
    $meta_query[] = $woocommerce->query->visibility_meta_query();
    $meta_query[] = $woocommerce->query->stock_status_meta_query();
    $meta_query   = array_filter( $meta_query );
    // Get the posts
    $related_posts = get_posts( array(
            'orderby'        => 'rand',
            'posts_per_page' => '4',
            'post_type'      => 'product',
            'fields'         => 'ids',
            'meta_query'     => $meta_query,
            'suppress_filters' => false
        ) );

        if ( $related_posts->have_posts() ) {
          while ( $related_posts->have_posts() ) : $related_posts->the_post();
            if(pll_get_post_language(get_the_ID())){
               //Not sure its the right approach for this..
            }
          endwhile;
        }
    $related_posts = array_diff( $related_posts, array( $product->id ), $product->get_upsells() );
    return $related_posts;
}

suppress_filters有一种方法可以让get_posts缓存结果但是,suppress_filters选项默认是true,但是如果你把它设置为false,里面的缓存机制WordPress 将完成他们的工作,结果将被保存以备后用。

在使用自定义 WordPress REST Api 端点以通过所选语言或设备语言获取 post 时,此方法有效。看看能不能帮到你。

function mycustomplugin_posts($params) {
    // get the url params

    $page = $params->get_param('page') ? $params->get_param('page') : 0;
    $per_page = $params->get_param('per_page') ? $params->get_param('per_page') : 10;
    $offset = $params->get_param('offset') ? $params->get_param('offset') : 0;
    $order = $params->get_param('order') ? $params->get_param('order') : 'desc';
    $order_by = $params->get_param('order_by') ? $params->get_param('order_by') : 'date';
    $lang = array_search($params->get_param('lang'),polylang_json_api_languages(), true) ? $params->get_param('lang') : pll_default_language();
    
    $args = [
        'post_type' => 'post',
        'page' => $page,
        'numberposts' => $per_page,
        'offset' => $offset,
        'order' => $order,
        'orderby' => $order_by,
        'tax_query' => [
            [
                'taxonomy'  => 'language',
                'field'     => 'slug',
                'terms'     => $lang
            ]
        ]
    ];

    $posts = get_posts($args);
    $data = [];
    $i = 0;

    foreach($posts as $post) {
        
        // Extract the post data

        $data[$i]['id'] = $post->ID;
        $data[$i]['title'] = $post->post_title;
        $data[$i]['content'] = $post->post_content;
        $data[$i]['excerpt'] = e42_the_short_content($post->post_content, 300);
        $data[$i]['slug'] = $post->post_name;
        $data[$i]['date'] = $post->post_date;
        $data[$i]['link'] = get_permalink($post->ID);
        $data[$i]['author'] = get_the_author_meta('display_name', $post->post_author);
        $data[$i]['categories'] = array();
        $data[$i]['featured_image']['thumbnail'] = get_the_post_thumbnail_url($post->ID, 'thumbnail');
        $data[$i]['featured_image']['medium'] = get_the_post_thumbnail_url($post->ID, 'medium');
        $data[$i]['featured_image']['large'] = get_the_post_thumbnail_url($post->ID, 'large');
        
        foreach(get_the_category($post->ID) as $category){
            array_push($data[$i]['categories'],$category->term_id);
        }
        $i++;
    }
    
    // Create the response object

    $response = new WP_REST_Response( $data );

    // Add a custom status code

    $response->set_status( 200 );
    return $response;
}

/plugins/woocommerce/templates/single-product/related.php 将此移至子主题 yourtheme/woocommerce/single-product/related.php

并将以下行添加到 foreach 循环

if (pll_current_language()!=pll_get_post_language($post_object->ID)) {
    continue;
}

基本上,如果当前语言与产品语言不匹配,我们将跳过它。