หา Grouped Product จาก Simple Product

ค้นหาว่า 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 ด้านบนได้เลย

Leave a Reply

Your email address will not be published. Required fields are marked *