Sửa lỗi hasMerchantReturnPolicy và shippingDetails cho Woo

Cập nhật lần cuối 29/03/2024 by trong WordPress vào 18/01/2024 có 1248 Views

Vào hồi T4.2023 google có update và yêu cầu các website bán hàng cần thêm thông tin về việc vận chuyển và trả lại hàng trên các kết quả tìm kiếm. Cụ thể là thuộc tính hasMerchantReturnPolicy và shippingDetails trong schema offer của sản phẩm. Nó không bắt buộc nhưng gây cảnh báo khá khó chịu trên Search Console

Thông tin xem tại: https://developers.google.com/search/blog/2023/04/shipping-and-returns-information?hl=vi

Mình đã thêm schema này trong plugin “DevVN Woocommerce Reviews” nhưng gần đây nhiều người hỏi nên mình tách riêng chức năng này ra cho mọi người cùng dùng nhé

Để duy trì blog nên mình có làm aff cho 1 số bên hosting. Nhưng dù aff mình cũng chọn 1 số nhà cung cấp uy tín về chất lượng và support nên các bạn cứ yên tâm nhé.

Nếu có mua hosting mà có trong list dưới đây các bạn click vào link trước khi mua để ủng hộ mình nhé. Mình cảm ơn nhiều

Code dưới đây hỗ trợ cho:

  • Schema woo mặc định
  • Yoast seo
  • Rank math
  • Schema Pro: nhớ update lại setting mới áp dụng schema mới nhé

Cách sửa lỗi hasMerchantReturnPolicy và shippingDetails cho Woo

Chèn code đoạn code dưới đây vào wp-content/themes/{your-theme}/functions.php nhé

/*
 * Sửa lỗi hasMerchantReturnPolicy và shippingDetails
 * Author: levantoan.com
 * */

add_filter( 'woocommerce_structured_data_product_offer', 'devvn_woocommerce_structured_data_product_offer' );
add_filter( 'wpseo_schema_product', 'devvn_wpseo_schema_product' );
add_filter( 'rank_math/snippet/rich_snippet_product_entity', 'devvn_rich_snippet_product_entity', 99 );
add_filter( 'wp_schema_pro_schema_product', 'devvn_wp_schema_pro_schema_product' );

function get_hasMerchantReturnPolicy(){
    return '{
	"@type": "MerchantReturnPolicy",
	"applicableCountry": "vi",
	"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
	"merchantReturnDays": "7",
	"returnMethod": "https://schema.org/ReturnByMail",
	"returnFees": "https://schema.org/FreeReturn"
}';
}

function get_shippingDetails(){
    return '{
  "@type": "OfferShippingDetails",
  "shippingRate": {
    "@type": "MonetaryAmount",
    "value": "0",
    "currency": "VND"
  },
  "deliveryTime": {
    "@type": "ShippingDeliveryTime",
    "businessDays": {
        "@type": "OpeningHoursSpecification",
         "dayOfWeek": [
            "https://schema.org/Monday",
            "https://schema.org/Tuesday",
            "https://schema.org/Wednesday",
            "https://schema.org/Thursday",
            "https://schema.org/Friday"
        ]
    },
    "handlingTime": {
      "@type": "QuantitativeValue",
      "minValue": "0",
      "maxValue": "3",
      "samedaydelivery" : "Yes",
      "unitCode": "DAY"
      
    },
    "transitTime": {
      "@type": "QuantitativeValue",
      "minValue": "0",
      "maxValue": "3",
      "samedaydelivery" : "Yes",
      "unitCode": "DAY"
    }					
  },
  "shippingDestination": [
    {
      "@type": "DefinedRegion",
      "addressCountry": "VN",
      "addressRegion": ["VN"]
    }
  ]
}';
}

function devvn_wpseo_schema_product($data){
    if(isset($data['offers'])){
        $hasMerchantReturnPolicy = get_hasMerchantReturnPolicy();
        $shippingDetails = get_shippingDetails();
        foreach ($data['offers'] as $key => $offer){
            if(!isset($offers['hasMerchantReturnPolicy']) && $hasMerchantReturnPolicy){
                $data['offers'][$key]['hasMerchantReturnPolicy'] = json_decode($hasMerchantReturnPolicy, true);
            }
            if(!isset($offers['shippingDetails']) && $shippingDetails){
                $data['offers'][$key]['shippingDetails'] = json_decode($shippingDetails, true);
            }
        }
    }
    return $data;
}

function devvn_rich_snippet_product_entity($entity){
    global $product;
    if(!is_singular('product') || !$product || is_wp_error($product)) return $entity;
    $hasMerchantReturnPolicy = get_hasMerchantReturnPolicy();
    $shippingDetails = get_shippingDetails();
    if(!isset($entity['offers']['hasMerchantReturnPolicy']) && $hasMerchantReturnPolicy){
        $entity['offers']['hasMerchantReturnPolicy'] = json_decode($hasMerchantReturnPolicy, true);
    }
    if(!isset($entity['offers']['shippingDetails']) && $shippingDetails){
        $entity['offers']['shippingDetails'] = json_decode($shippingDetails, true);
    }
    //Fix Rankmath pro
    if(isset($entity['hasVariant']) && $entity['hasVariant']){
        foreach ($entity['hasVariant'] as $k=>$productList){
            if(!isset($productList['offers']['hasMerchantReturnPolicy']) && $hasMerchantReturnPolicy){
                $entity['hasVariant'][$k]['offers']['hasMerchantReturnPolicy'] = json_decode($hasMerchantReturnPolicy, true);
            }
            if(!isset($productList['offers']['shippingDetails']) && $shippingDetails){
                $entity['hasVariant'][$k]['offers']['shippingDetails'] = json_decode($shippingDetails, true);
            }
        }
    }
    return $entity;
}

function devvn_wp_schema_pro_schema_product($schema){
    if(isset($schema['offers']) && apply_filters( 'wp_schema_pro_remove_product_offers', true )) {
        $hasMerchantReturnPolicy = get_hasMerchantReturnPolicy();
        $shippingDetails = get_shippingDetails();
        if (!isset($schema['offers']['hasMerchantReturnPolicy']) && $hasMerchantReturnPolicy) {
            $schema['offers']['hasMerchantReturnPolicy'] = json_decode($hasMerchantReturnPolicy, true);
        }
        if (!isset($schema['offers']['shippingDetails']) && $shippingDetails) {
            $schema['offers']['shippingDetails'] = json_decode($shippingDetails, true);
        }
    }
    return $schema;
}

function devvn_woocommerce_structured_data_product_offer($offers){

    $hasMerchantReturnPolicy = get_hasMerchantReturnPolicy();
    $shippingDetails = get_shippingDetails();

    if(!isset($offers['hasMerchantReturnPolicy']) && $hasMerchantReturnPolicy){
        $offers['hasMerchantReturnPolicy'] = json_decode($hasMerchantReturnPolicy, true);
    }

    if(!isset($offers['shippingDetails']) && $shippingDetails){
        $offers['shippingDetails'] = json_decode($shippingDetails, true);
    }

    return $offers;
}

Trong đoạn code trên bạn cần chú ý các tham số sau. Nhớ đổi cho phù hợp hoặc dùng luôn cũng được nha

  • Trong hàm get_hasMerchantReturnPolicy có:
    merchantReturnDays: là số ngày đổi trả hàng
    returnFees: Phí đổi trả
    returnMethod: Phương thức đổi trả
    => Như mặc định của code là đổi trả qua email, đổi trả trong 7 ngày và miễn phí đổi trả nhé
  • Trong hàm get_shippingDetails có:
    shippingRate > value: là giá tiền ship
    shippingRate > currency: đơn vị tiền ship
    deliveryTime: Các ngày vận chuyển sẽ hoạt động
    shippingDestination: Quốc gia giao hàng

Các bạn nhớ đọc để thay lại giá trị cho phù hợp. Hoặc dùng luôn giá trị trên cũng được nhé

Chúc các bạn thành công!

4.8/5 - (5 votes)
Từ khóa: ,
  • Bình luận
Sản phẩm nổi bật của Toản
x