ค้นหาว่า Grouped Product จาก Simple Product ID
function getGroupedProductURL( $product_id ){
$display = '';
return $display;
}
เริ่มต้นจาก ออกแบบ function ก่อนนะครับ รับค่า $product_id เข้ามา กำหนด $display ไว้ แล้วก็ return $display กลับไป
function getGroupedProductURL( $product_id ){
$product = wc_get_product( $product_id ); //ตรวจสอบว่าเป็น Product รึป่าว
if(!$product) return; //ไม่ใช่ก็ส่งค่าว่างๆ กลับไป
$display = '';
return $display;
}
จากนั้น เพิ่มการตรวจสอบก่อนครับว่า ค่า $product_id ที่ส่งเข้ามาเป็น Product ID จริงรึป่าวโดยใช้ wc_get_product() ครับ
function getGroupedProductURL( $product_id ){
$product = wc_get_product( $product_id );
if(!$product) return;
$grouped_product_arr = array(); //เตรียมไว้ ถ้ามี grouped product หลายตัว
$display = '';
if( ! empty($grouped_product_arr) ){ //เช็คก่อนว่าหา grouped product เจอสักตัวไหม
$display = implode(', ', $grouped_product_arr); //ถ้าเจอ เอามาคั่นด้วย ',' จัดให้สวยงาม
}
return $display;
}
เนื่องจาก Simple Product อาจจะมีอยู่ในหลายๆ Grouped Product เราก็จะเอามาเก็บไว้ใน Array ก่อน แล้วค่อยจัดเป็น String ให้สวยงามแล้วส่งค่ากลับไป
function getGroupedProductURL( $product_id ){
$product = wc_get_product( $product_id );
if(!$product) return;
global $wpdb; //จะดึงข้อมูลจาก DB นะ อย่าลืมๆ
$grouped_product_arr = array();
$display = '';
$res = $wpdb->get_results("
SELECT post_id
FROM {$wpdb->prefix}postmeta
WHERE meta_key = '_children' AND meta_value LIKE '%{$product_id}%'
"); //SQL ดึงข้อมูลขึ้นมา
if($res){
foreach ($res as $obj) { // loop หน่อย ดูว่าได้ grouped product มาเท่าไร
$html = sprintf(
'<a href="%s" target="_blank">%s</a>',
get_the_permalink($obj->post_id), get_the_title($obj->post_id)
); //จัดแสดง link และ title ให้สวยงาม
array_push($grouped_product_arr, $html); //เอาเก็บไว้ใน Array ก่อน เดี๋ยวค่อยมารวมผลแสดง
}
}
if( ! empty($grouped_product_arr) ){
$display = implode(', ', $grouped_product_arr);
}
return $display;
}
จากนั้นเราจะทำการดึงข้อมูลจาก Database โดยข้อมูลที่เราจะไปดึงจะอยู่ที่ post_meta ครับ โดยปกติแล้ว Grouped Product จากเก็บข้อมูลของ Product ID ต่างๆ เอาไว้ที่ meta_key ที่มีชื่อว่า ‘_children’ ครับ เมื่อเราได้ข้อมูล Grouped Product ID มาแล้วเราก็จะเอามาใส่ทำการแสดง link และ ชื่อของ Grouped Product นั้น
function getGroupedProductURL( $product_id ){
$product = wc_get_product( $product_id );
if(!$product) return;
global $wpdb;
$grouped_product_arr = array();
$display = '';
$res = $wpdb->get_results("
SELECT post_id
FROM {$wpdb->prefix}postmeta
WHERE meta_key = '_children' AND meta_value LIKE '%{$product_id}%'
");
if($res){
foreach ($res as $obj) {
if( get_post_status($obj->post_id) == 'publish' ){
$html = sprintf(
'<a href="%s" target="_blank">%s</a>',
get_the_permalink($obj->post_id), get_the_title($obj->post_id)
);
array_push($grouped_product_arr, $html);
}
}
}
if( ! empty($grouped_product_arr) ){
$display = implode(', ', $grouped_product_arr);
}
return $display;
}
เสร็จแล้ว! เพียงเท่านี้เราก็จะได้ function สำหรับการค้นหา Grouped Product จาก Product ID เรียบร้อย
เพิ่มเติมอีกนิดครับ
ถ้าอยากให้เพื่อนคนอื่นๆ มาจัดการแสดงผลใหม่ก่อนที่จะ Return ค่ากลับไป เราจะต้องทำยังไง?
function getGroupedProductURL( $product_id ){
$product = wc_get_product( $product_id );
if(!$product) return;
global $wpdb;
$grouped_product_arr = array();
$display = '';
$res = $wpdb->get_results("
SELECT post_id
FROM {$wpdb->prefix}postmeta
WHERE meta_key = '_children' AND meta_value LIKE '%{$product_id}%'
");
if($res){
foreach ($res as $obj) {
if( get_post_status($obj->post_id) == 'publish' ){
$html = sprintf(
'<a href="%s" target="_blank">%s</a>',
get_the_permalink($obj->post_id), get_the_title($obj->post_id)
);
array_push($grouped_product_arr, $html);
}
}
}
if( ! empty($grouped_product_arr) ){
$display = implode(', ', $grouped_product_arr);
}
// นี่ๆ ตรงนี้ เราส่ง array ไปให้เอาไปจัดการเองนะ
return apply_filters("display_grouped_product", $display, $grouped_product_arr);
}
ง่ายมาก ก็ใช้ Filter ของ WordPress ไง ก่อนส่งค่ากลับไป ใส่ข้อมูลตาม code ด้านบนได้เลย
