• Trang chủ
  • Phần mềm
  • Demo
  • Bảng giá
  • Dịch vụ
    • Cấu hình chiến dịch
    • Hỗ trợ chuyên nghiệp
  • Add-ons
  • Tài liệu
  • Kiến thức
  • Tài khoản
    • Đăng nhập
    • Đăng ký
  • Trang chủ
  • Phần mềm
  • Demo
  • Bảng giá
  • Dịch vụ
    • Cấu hình chiến dịch
    • Hỗ trợ chuyên nghiệp
  • Add-ons
  • Tài liệu
  • Kiến thức
  • Tài khoản
    • Đăng nhập
    • Đăng ký
Trang chủ/Kiến thức/Nâng cao
Tìm kiếm phổ biến:leech tin tức, leech truyện, leech sản phẩm

Leech sản phẩm có biến thể WooCommerce – Phần 1 – Một loại biến thể với thuộc tính không có sẵn

1023 lượt xem 13 18/07/2019 28/10/2019

Chào bạn, trong bài viết này mình và bạn sẽ cùng đi tìm hiểu cách leech sản phẩm có biến thể trong WooCommerce như thế nào nhé. Trước khi đi vào chi tiết thì chúng ta cần phải "ôn tập" lại "tư tưởng" về plugin KDN Auto Leech như sau:

Plugin này không lập trình để gò bó theo bất cứ website mục tiêu nào mà nó được thiết kế các tính năng mở để bạn có thể tùy ý cấu hình chiến dịch tương ứng tới các trang mục tiêu. Từ những cấu hình đó, plugin sẽ lấy dữ liệu và đổ dữ liệu vào nơi mà bạn muốn!

Với trường hợp leech sản phẩm có biến thể trong WooCommerce cũng như vậy. Bạn cần phải hiểu được cơ chế lưu dữ liệu sản phẩm có biến thể là như thế nào trước, rồi sau đó mới tính đến phương án lấy dữ liệu và đổ dữ liệu theo đúng cái cơ chế đó. Và tất nhiên, mỗi site mục tiêu sẽ có những cách thức để lấy dữ liệu khác nhau, vì vậy hoàn toàn dựa vào khả năng quan sát, tinh ý và trình độ của bạn để có thể làm được điều kể trên.

WooCommerce khi lưu sản phẩm có biến thể  rất phức tạp!, và mình sẽ chia làm 4 phần như sau:

  • Phần 1: Một loại biến thể với thuộc tính không có sẵn.
  • Phần 2: Một loại biến thể với thuộc tính đã có sẵn.
  • Phần 3: Nhiều loại biến thể với thuộc tính không có sẵn.
  • Phần 4: Nhiều loại biến thể với thuộc tính đã có sẵn.

Mình chia 4 phần như vậy, tuy nhiên có thể gộp Phần 1 + 2 và Phần 3 + 4 hoặc 4 phần làm một. Đó là bài toán dài hơi và cần phải nghiên cứu nhiều thêm. Và trong bài này chúng ta sẽ đi tìm hiểu => Phần 1: Một loại biến thể với thuộc tính không có sẵn.


Biến thể được cấu thành như thế nào?

Có 2 khái niệm trong sản phẩm có biến thể WooCommerce đó là Thuộc tính và Chủng loại của thuộc tính. WooCommerce sẽ tạo biến thể cho sản phẩm từ các Thuộc tính và Chủng loại của thuộc tính này.

Ví dụ:

  • Thuộc tính: Màu
  • Chủng loại:
    1. Vàng
    2. Trắng
    3. Đen
  • Biến thể:
    1. Màu: Vàng
    2. Màu: Trắng
    3. Màu: Đen

Đó, sản phẩm cuối cùng sẽ có 3 biến thể là: Màu vàng, Màu trắng và Màu đen. Bạn có thể cài đặt giá cho 3 biến thể này.


Thuộc tính không có sẵn là như thế nào?

Bình thường, bạn sẽ truy vập vào Sản phẩm > Các thuộc tính và tạo ra các Thuộc tính và Chủng loại của thuộc tính trong đây, như thế này:

Đây chính là Thuộc tính đã có sẵn vì bạn đã chủ động tạo ra các Thuộc tính và Chủng loại của thuộc tính này. Sau đó, khi bạn tạo sản phẩm có biến thể bạn sẽ chọn và thêm được Thuộc tính: Màu – như thế này:

Và tiếp theo, bạn có thể chọn các Chủng loại đã tạo sẵn như thế này:

Còn đối với Thuộc tính không có sẵn, bạn sẽ Tạo các thuộc tính ngay tại phần Dữ liệu sản phẩm và phân tách các Chủng loại của thuộc tính bằng dấu sổ dọc "|" như thế này:

Đó là sự khác nhau cơ bản giữa Thuộc tính có sẵn và Thuộc tính không có sẵn.


Ưu điểm và nhược điểm

Ưu điểm:

  • Tạo Thuộc tính và Chủng loại của thuộc tính nhanh chóng.
  • Không lưu vào CSDL dưới dạng terms nên sẽ tiết kiệm dung lượng hơn.
  • Truy vấn nhanh hơn.

Nhược điểm:

  • Khó quản lý.
  • Không đồng bộ giữa các sản phẩm.

Những dữ liệu cần thiết

Đây chính là phần cốt lõi để tạo ra một sản phẩm có biến thể với Thuộc tính không có sẵn.

Trong trường hợp này, mình sẽ đưa ra 5 phần chính như sau:

Phần 1. Tạo các biến thể từ sản phẩm gốc

WooCommerce sẽ tạo ra các biến thể với post_type là product_variation và có post_parent là ID của sản phẩm gốc. Dữ liệu như sau:

$newVariationData = [
	'post_title' 	=> $data['post_title'] . ' - ' . $targetVariationData['label'],
	                // Tiêu đề sản phẩm gốc    -     Tên chủng loại
	'post_type'		=> 'product_variation',
	'post_status'	=> 'publish',
	'post_excerpt'	=> 'Màu: ' . $targetVariationData['label'],     // Thuộc tính: Tên chủng loại
	'post_parent'	=> $postId                                      // ID sản phẩm gốc
];

Phần 2. Gán post meta vào mỗi biến thể

Sau khi tạo ra được các biến thể, bây giờ cần phải gán các post meta sau vào mỗi biến thể:

$newVariationMeta = [
	'_variation_description'	=> '',
	'total_sales'				=> '0',
	'_tax_status'				=> 'taxable',
	'_tax_class'				=> 'parent',
	'_manage_stock'				=> 'no',
	'_backorders'				=> 'no',
	'_sold_individually'		=> 'no',
	'_virtual'					=> 'no',
	'_downloadable'				=> 'no',
	'_download_limit'			=> '-1',
	'_download_expiry'			=> '-1',
	'_stock'					=> null,
	'_stock_status'				=> 'instock',
	'_wc_average_rating'		=> '0',
	'_wc_review_count'			=> '0',
	'attribute_mau'				=> $targetVariationData['label'],   // Tên chủng loại
	'_product_version'			=> '3.6.4',
	'_regular_price'			=> $targetVariationData['price'],   // Giá của biến thể
	'_price'					=> $targetVariationData['price'],   // Giá của biến thể
	'_thumbnail_id'				=> $productImages[$targetVariationData['products'][0]]
	                            // ID ảnh đại diện của biến thể
];

Mỗi key sẽ là 1 post meta chứ không phải một post meta dưới dạng mảng đâu nhé!

Phần 3. Gán post meta "_product_attributes" cho sản phẩm gốc

Sau khi đã gán các post meta cho mỗi biến thể, bây giờ cần phải gán post meta "_product_attributes" cho sản phẩm gốc, dữ liệu như sau:

$parentProductAttributes = [
	'mau' => [
		'name'			=> 'Màu',                   // Thuộc tính
		'value' 		=> $parentProductColors,    // Tất cả chủng loại, phân tách bằng "|"
		'position' 		=> 0,
		'is_visible' 	=> 0,
		'is_variation' 	=> 1,
		'is_taxonomy' 	=> 0
	]
];

Phần 4. Gán taxonomy "product_type" với term là "variable" cho sản phẩm gốc

Đây chính là việc chuyển sản phẩm sang dạng có biến thể của WooCommerce. Thực hiện như sau:

// Lấy ID của term "variable" trong taxonomy "product_type".
$productVariableTermId = get_term_by('name', 'variable', 'product_type')->term_id;

// Gán taxonomy "product_type" với ID của term đó vào sản phẩm gốc.
wp_set_post_terms($postId, [$productVariableTermId], 'product_type');

Phần 5. Xóa dữ liệu tạm thời

WooCommerce sẽ tạo ra dữ liệu tạm thời cho sản phẩm mỗi khi lưu sản phẩm. Do việc tạo biến thể chúng ta thực hiện sau khi KDN Auto Leech tự động lưu sản phẩm gốc nên cần phải xóa dữ liệu tạm thời này đi để nó được khởi tạo lại kèm theo các biến thể.

delete_option('_transient_wc_var_prices_' . $postId);
delete_option('_transient_wc_product_children_' . $postId);

Leech sản phẩm có biến thể từ CellphoneS

Nếu các bạn để ý thì khi Ctrl + U sẽ thấy CellphoneS lưu dữ liệu của các biến thể ở dạng JSON như sau:

Và lưu dữ liệu của các Ảnh đại diện cho mỗi biến thể ở dạng JSON như sau:

Điểm chung của 2 dữ liệu này là chúng đều chứa ID biến thể gốc, hiểu như sau:

  • Ở JSON thứ nhất, ID biến thể gốc: XXX có price = 4990000.0000
  • Ở JSON thứ hai,   ID biến thể gốc: XXX có URL ảnh đại diện là: https://domain.com/image-1.jpg

Công việc cần làm ở đây là phải chế biến 2 dữ liệu này thành các biến thể và lưu ảnh đại diện vào đúng mỗi biến thể thông qua mỗi ID biến thể gốc.

Dưới đây là code Hook được sử dụng để lưu sản phẩm có biến thể được áp dụng khi leech sản phẩm từ CellphoneS. Bạn hãy đọc và nghiên cứu để áp dụng nó vào những trường hợp của riêng bạn. Code dưới đây chỉ leech các sản phẩm có biến thể và nó chưa phân biệt được khi nào leech sản phẩm có biến thể, khi nào leech sản phẩm đơn giản, vậy nên bạn cần chỉnh sửa lại nhé.


// Action
add_action('kdn/post/finished', 'kdn_post_finished', 10, 10);

// Callback
function kdn_post_finished($data, $postData, $postBot, $postSaver, $siteId, $postUrl, $urlTuple, $isRecrawl, $postId, $isFirstPage) {
	
	/**
	 * Chuẩn bị mảng chứa các ID ảnh đại diện của biến thể.
	 */
	
	// Lấy dữ liệu từ post meta "product_images" của sản phẩm gốc.
	$productImages = get_post_meta($postId, 'product_images', true);


	// Lúc này $productImages có dạng chuỗi JSON như sau:
	//
	//	{
	//	  "14361": "https://cdn.cellphones.com.vn/.../samsung-galaxy-m20-m205f-1_1_2.jpg",
	//	  "14389": "https://cdn.cellphones.com.vn/.../samsung-galaxy-m20-m205f-3_1_1.jpg",
	//	  "14714": "https://cdn.cellphones.com.vn/.../samsung-galaxy-m20-m205f-1_1_1.jpg"
	//	}
	//
	//	14361: 			ID sản phẩm gốc.
	// 	14389, 14714: 	ID của các biến thể gốc.


	// Lấy dữ liệu của các tệp đính kèm đã lưu về website.
	$attachmentData = $postData->getAttachmentData();
	
	// Khởi tạo biến để lưu dữ liệu các ảnh đại diện của biến thể sau khi xử lý.
	$variationImages = [];
	
	// Bắt đầu xử lý mỗi tệp đính kèm.
	foreach ($attachmentData as $mediaFile) {
		
		// Nếu đây là tệp trực tiếp thì mới tiếp tục xử lý.
		if ($mediaFile->isGalleryImage() === 'direct-file') {
			
			// Tạo ra mỗi item trong mảng dữ liệu các ảnh đại diện của biến thể
			$variationImages[$mediaFile->getMediaId()] = $mediaFile->getSourceUrl();
			
		}
		
	}


	// Lúc này $variationImages sẽ có dạng mảng như sau:
	//
	// 	[
	//		'2474'	=> 'https://cdn.cellphones.com.vn/.../samsung-galaxy-m20-m205f-3_1_1.jpg',
	//		'2475'	=> 'https://cdn.cellphones.com.vn/.../samsung-galaxy-m20-m205f-1_1_1.jpg'
	//	]
	//
	//	2474 và 2475 là ID của các tệp trực tiếp sau khi lưu về website.


	// Thay thế các URL ảnh đại diện mục tiêu của biến thể
	// thành các ID của tệp trực tiếp sau khi lưu về website.
	foreach ($variationImages as $mediaId => $sourceUrl) {
		$productImages = str_replace($sourceUrl, $mediaId, $productImages);
	}


	// Lúc này $productImages sẽ có dạng chuỗi JSON như sau:
	//
	//	{
	//	  "14361": "https://cdn.cellphones.com.vn/.../samsung-galaxy-m20-m205f-1_1_2.jpg",
	//	  "14389": "2474",
	//	  "14714": "2475"
	//	}
	//
	//	14389 và 14714 là ID của các biến thể theo web mục tiêu.
	// 	2474  và 2475  là ID ảnh đại diện cho mỗi biến thể (ID các tệp trực tiếp sau khi lưu).


	// Đưa $productImages sang dạng mảng.
	$productImages = json_decode($productImages, true);


	// Lúc này $productImages sẽ có dạng mảng như sau:
	//	[
	//		'14361' => 'https://cdn.cellphones.com.vn/.../samsung-galaxy-m20-m205f-1_1_2.jpg',
	//		'14389'	=> '2474',
	//		'14714'	=> '2475'
	//	]
	//
	// Như vậy là đã map được ID các biến thể gốc với ID các tệp trực tiếp
	// (hay nói cách khác là ID các ảnh đại diện của biến thể) tương ứng.





	/**
	 * Tạo các biến thể và gán post meta vào các biến thể.
	 */
	
	// Lấy dữ liệu của sản phẩm trong post meta "product_config".
	$productConfig = get_post_meta($postId, 'product_config', true);
	
	// Khởi tạo biến để lưu dữ liệu của tất cả biến thể gốc.
	$targetVariations = [];
	
	// Lưu dữ liệu của tất cả biến thể gốc.
	foreach ($productConfig as $productChildConfig) {
		$targetVariations = $productChildConfig['options'];
	}
	
	/**
	 * Xử lý mỗi dữ liệu biến thể gốc.
	 */
	
	// Khởi tại biến để lưu tất cả chủng loại dưới dạng chuỗi, phân tách bởi dấu sổ dọc "|".
	$parentProductColors = '';
	
	// Với mỗi dữ liệu biến thể gốc, tiến hành tạo ra các biến thể.
	foreach ($targetVariations as $targetVariationData) {
	    
	    /**
	     * PHẦN 1: Tạo các biến thể từ sản phẩm gốc.
	     */
		
		// Chuẩn bị dữ liệu cho biến thể.
		$newVariationData = [
			'post_title' 	=> $data['post_title'] . ' - ' . $targetVariationData['label'],
			'post_type'		=> 'product_variation',
			'post_status'	=> 'publish',
			'post_excerpt'	=> 'Màu: ' . $targetVariationData['label'],
			'post_parent'	=> $postId
		];
		
		// Tiến hành tạo biến thể.
		$newVariationId = wp_insert_post($newVariationData);
		
		// Lúc này, $newVariationId là ID của post vừa tạo.
		// Tiến hành cập nhật lại biến thể.
		$newVariationData['ID'] = $newVariationId;
		wp_update_post($newVariationData);





		/**
		 * PHẦN 2: Gán post_meta vào mỗi biến thể.
		 * 
		 * Gán các post meta cho mỗi biến thể.
		 * Tại đây chúng ta đã có $newVariationId là ID của mỗi biến thể được tạo.
		 */
		
		// Chuẩn bị các post meta cần thiết cho biến thể.
		$newVariationMeta = [
			'_variation_description'	=> '',
			'total_sales'				=> '0',
			'_tax_status'				=> 'taxable',
			'_tax_class'				=> 'parent',
			'_manage_stock'				=> 'no',
			'_backorders'				=> 'no',
			'_sold_individually'		=> 'no',
			'_virtual'					=> 'no',
			'_downloadable'				=> 'no',
			'_download_limit'			=> '-1',
			'_download_expiry'			=> '-1',
			'_stock'					=> null,
			'_stock_status'				=> 'instock',
			'_wc_average_rating'		=> '0',
			'_wc_review_count'			=> '0',
			'attribute_mau'				=> $targetVariationData['label'],
			'_product_version'			=> '3.6.4',
			'_regular_price'			=> $targetVariationData['price'],
			'_price'					=> $targetVariationData['price'],
			'_thumbnail_id'				=> $productImages[$targetVariationData['products'][0]]
		];
		
		// Tiến hành gán mỗi post meta vào biến thể.
		foreach ($newVariationMeta as $metaKey => $metaValue) {
			update_post_meta($newVariationId, $metaKey, $metaValue);
		}
		
		// Với mỗi biến thể được tạo, $parentProductColors sẽ được nối tiếp thành chuỗi như sau:
		// Vàng | Trắng | Đen |
		$parentProductColors .= $targetVariationData['label'] . ' | ';

	}





	/**
	 * PHẦN 3: Gán post_meta "_product_attributes" cho sản phẩm gốc.
	 * 
	 * Gán dữ liệu vào post meta "_product_attributes" của sản phẩm gốc.
	 */
	
	// Chuẩn bị dữ liệu.
	$parentProductAttributes = [
		'mau' => [
			'name'			=> 'Màu',
			'value' 		=> $parentProductColors,
			'position' 		=> 0,
			'is_visible' 	=> 0,
			'is_variation' 	=> 1,
			'is_taxonomy' 	=> 0
		]
	];
	
	// Gán dữ liệu vào post meta "_product_attributes" của sản phẩm gốc.
	update_post_meta($postId, '_product_attributes', $parentProductAttributes);





	/**
	 * PHẦN 4: Gán taxonomy "product_type" với term là "variable" cho sản phẩm gốc.
	 * 
	 * Gán ID term "variable" vào taxonomy "product_type" của sản phẩm gốc.
	 */
	
	// Lấy ra ID của term "variable" trong taxonomy "product_type".
	$productVariableTermId = get_term_by('name', 'variable', 'product_type')->term_id;
	
	// Gán ID term "variable" vào taxonomy "product_type" của sản phẩm gốc.
	wp_set_post_terms($postId, [$productVariableTermId], 'product_type');





	/**
	 * PHẦN 5: Xóa các dữ liệu tạm thời.
	 */
	
	delete_option('_transient_wc_var_prices_' . $postId);
	delete_option('_transient_wc_product_children_' . $postId);

}

Giải thích:

  • Dòng 101: $productConfig có dữ liệu như sau:

  • Dòng 107 – 109: $targetVariations có dữ liệu như sau:

  • Dòng 174: Dòng này sẽ thiết lập ID ảnh đại diện cho mỗi biến thể

TẢI VỀ CHIẾN DỊCH LEECH SẢN PHẨM CÓ BIẾN THỂ >>

Lời kết

Trên đây là những giải thích về sản phẩm có biến thể trong WooCommerce và hướng dẫn leech sản phẩm có biến thể trong WooCommerce. Hy vọng các bạn sẽ đọc kỹ để hiểu được bản chất của cơ chế lưu sản phẩm có biến thể là gì. Dù đây chỉ là một phần nhỏ, nhưng nó cũng là kiến thức cốt lõi để bạn có thể làm việc với WooCommerce. Nếu bài viết có thiếu sót hay sai lầm chỗ nào thì bạn hãy comment góp ý bên dưới nhé. Hy vọng chúng mình có thời gian để viết tiếp các phần sau và những điều hay ho nữa. Chúc bạn thành công!

Bạn có thích nội dung này?

13 Có  2 Không
Kiến thức liên quan
  • Vượt qua cơ chế anti-bot của CloudFlare – bypass cloudflare JS challenge
  • Callback chuyển đổi chữ hoa thành chữ thường và in hoa chữ cái đầu tiên
  • Không phân tích và lưu ảnh đại diện khi thu thập lại
  • Hướng dẫn sửa lỗi lưu tệp đính kèm khi chạy plugin trên localhost
  • Thay đổi post_modified và post_date khi cập nhật (thu thập lại) bài viết
  • Gán post meta cho bài viết con là ID của bài viết cha
Bình luận Hủy

Bạn phải đăng nhập để gửi phản hồi.

Nâng cao

  • Leech sản phẩm có biến thể WooCommerce – Phần 1 – Một loại biến thể với thuộc tính không có sẵn
  • Vượt qua cơ chế anti-bot của CloudFlare – bypass cloudflare JS challenge
  • Callback chuyển đổi chữ hoa thành chữ thường và in hoa chữ cái đầu tiên
  • Không phân tích và lưu ảnh đại diện khi thu thập lại
  • Hướng dẫn sửa lỗi lưu tệp đính kèm khi chạy plugin trên localhost
  • Thay đổi post_modified và post_date khi cập nhật (thu thập lại) bài viết
Tất cả: 11  

Kiến thức mới

  • Hướng dẫn import mã chiến dịch tự động lấy sản phẩm WooCommerce
  • Advanced DB Cleaner – Tối ưu website wordpress và dọn dẹp database
  • Tổng hợp các trường dữ liệu leech truyện với theme Madara
  • Vượt qua cơ chế anti-bot của CloudFlare – bypass cloudflare JS challenge
  • Callback chuyển đổi chữ hoa thành chữ thường và in hoa chữ cái đầu tiên

Chủ đề mới

  • Lỗi lặp ảnh trong bài viết.
  • Hỗ trợ cài đặt chiến dịch lấy video từ kênh youtube
  • Lazy load
  • Leech truyện không còn sử dụng được hả mọi người!
  • mình k muốn leech ảnh về thì làm như nào vậy b? vẫn để link ảnh ở trang gốc

Về chúng tôi

KDN Auto Leech là một phần mềm mở rộng được cài đặt và hoạt động trên website sử dụng mã nguồn mở WordPress. Với phần mềm này bạn hoàn toàn có thể tự động lấy nội dung từ bất cứ trang web nào trong bất kỳ lĩnh vực nào về website của bạn.

Thông tin

  • Giới thiệu
  • Liên hệ
  • Chính sách bảo mật
  • Điều khoản sử dụng
  • Hướng dẫn thanh toán

Danh mục

  • Add-ons
  • Bảng giá
  • Tài liệu sử dụng
  • Kiến thức mở rộng
  • Chương trình Affiliate

Tìm hiểu thêm

  • Blog tản mạn
  • Diễn đàn thảo luận
  • Câu hỏi thường gặp
  • Fanpage chính thức
  • Kênh Youtube chính thức
  • Phiên bản: 2.3.6
  • © 2020 - KDN Auto Leech

Tìm kiếm phổ biến:leech tin tức, leech truyện, leech sản phẩm