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
- Azdigi: Giá rẻ thì dùng gói Pro Gold Hosting còn chất lượng hơn thì em khuyên dùng Business Hosting. Có điều kiện thì lên VPS nhé
- Tino hosting
- iNet
- Nước ngoài thì Vultr
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!
- Bình luận