Created
February 21, 2019 20:28
-
-
Save BHEADRICK/249e103e9b255e3887e45e1f92253ff0 to your computer and use it in GitHub Desktop.
WC_Dropshipping_Orders wc3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class WC_Dropshipping_Orders { | |
public function __construct() { | |
$this->init(); | |
} | |
public function init() { | |
// order processing | |
add_filter('wc_dropship_manager_send_order_email_html',array($this,'send_order_email_html')); | |
add_filter('wc_dropship_manager_send_order_attachments',array($this,'send_order_attach_packingslip'),10,3); | |
add_action('woocommerce_order_actions',array( $this,'add_order_meta_box_order_processing')); | |
add_action('woocommerce_order_status_processing',array($this,'order_processing')); | |
add_action('woocommerce_order_action_resend_dropship_supplier_notifications',array($this,'order_processing')); | |
add_action('wc_dropship_manager_send_order',array($this,'send_order'),10, 2); | |
} | |
public function add_order_meta_box_order_processing( $actions ) { | |
$actions['resend_dropship_supplier_notifications'] = 'Resend Dropship Supplier Notifications'; | |
return $actions; | |
} | |
/* Notify Suppliers */ | |
// perform all tasks that happen once an order is set to processing | |
public function order_processing( $order_id ) { | |
$order = new WC_Order( $order_id ); // load the order from woocommerce | |
$this->notify_warehouse($order); // notify the warehouse to ship the order | |
} | |
// parse the order, build pdfs, and send orders to the correct suppliers | |
public function notify_warehouse( $order ) { | |
$order_info = $this->get_order_info($order); | |
$supplier_codes = $order_info['suppliers']; | |
// for each supplier code, loop and send email with product info | |
foreach($supplier_codes as $code => $supplier_info) { | |
do_action('wc_dropship_manager_send_order',$order_info,$supplier_info); | |
} | |
} | |
public function get_order_shipping_info($order) { | |
$keys = explode(',','shipping_first_name,shipping_last_name,shipping_address_1,shipping_address_2,shipping_city,shipping_state,shipping_postcode,shipping_country,billing_phone,shipping_company'); | |
$info = array(); | |
$info['name'] = $order->get_shipping_first_name().' '.$order->get_shipping_last_name(); | |
$info['phone'] = $this->formatPhone($order->get_billing_phone()); | |
$info['shipping_method'] = $order->get_shipping_method(); | |
foreach($keys as $key) { | |
if ( is_callable( array( $order, "get_{$key}" ) ) ) { | |
$info[$key] = $order->{'get_'.$key}(); | |
}else{ | |
$info[$key] = ''; | |
} | |
} | |
return $info; | |
} | |
/** | |
* @param $order WC_Order | |
* | |
* @return array | |
*/ | |
public function get_order_billing_info($order) { | |
$keys = explode(',','billing_first_name,billing_last_name,billing_address_1,billing_address_2,billing_city,billing_state,billing_postcode,billing_country,billing_phone,billing_email,billing_company'); | |
$info = array(); | |
$info['name'] = $order->get_billing_first_name().' '.$order->get_billing_last_name(); | |
$info['phone'] = $this->formatPhone($order->get_billing_phone()); | |
foreach($keys as $key) { | |
if ( is_callable( array( $order, "get_{$key}" ) ) ) { | |
$info[$key] = $order->{'get_'.$key}(); | |
}else{ | |
$info[$key] = ''; | |
} | |
} | |
return $info; | |
} | |
public function get_order_product_info($item,$product) { | |
$info = array(); | |
$info['sku'] = $product->get_sku(); | |
$info['qty'] = $item['qty']; | |
$info['name'] = $item['name']; | |
$product_attributes = maybe_unserialize( get_post_meta( $product->get_id(), '_product_attributes', true ) ); | |
$info['product_attribute_keys'] = array(); | |
if(is_array($product_attributes)) { | |
$info['product_attribute_keys'] = array_keys($product_attributes); | |
foreach($product_attributes as $key=>$data) { | |
$info[$key] = $data['value']; | |
} | |
} | |
// Product Variations | |
$info['variation_data'] = []; | |
if($product->is_type('variable')) | |
{ | |
$info['variation_data'] = $product->get_variation_attributes(); | |
} | |
// Product Add-Ons Plugin | |
//$info['order_item_meta'] = []; | |
$info['order_item_meta'] = $item->get_formatted_meta_data(); | |
if(function_exists('get_product_addons')) | |
{ | |
//$info['order_item_meta'] = $item->get_formatted_meta_data(); | |
$info['product_addons'] = get_product_addons($product); | |
/*for($i=0;$i<count($info['product_addons']);$i++) | |
{ | |
$addon = $info['product_addons'][$i]; | |
$addon['key'] = $this->get_addon_key_string($addon); | |
$info['product_addons'][$i] = $addon; | |
}*/ | |
foreach($info['order_item_meta'] as $key=>$item_meta) | |
{ | |
$info['order_item_meta'][$key]->display_label = $this->get_addon_display_label($info['order_item_meta'][$key]); | |
} | |
} | |
//$info['shipping_methods'] = $order->get_shipping_methods(); | |
//$info['meta_html'] = wc_display_item_meta($item); | |
//$info['item'] = $item; | |
//$info['product'] = $product; | |
return $info; | |
} | |
private function get_addon_display_label($item_meta) | |
{ | |
$d = $item_meta->display_key; | |
// remove the price from the meta display name | |
return trim(preg_replace('/\(\$\d.*\)/','',$d)); | |
} | |
/*private function get_addon_key_string($addon) | |
{ | |
$key = $addon['name']; | |
if ( $addon['price'] > 0 && apply_filters( 'woocommerce_addons_add_price_to_name', true ) ) { | |
$key .= ' (' . strip_tags( wc_price( get_product_addon_price_for_display( $addon['price'], $values['data'], true ) ) ) . ')'; | |
} | |
return $key; | |
}*/ | |
public function get_order_info($order) { | |
// gather some of the basic order info | |
$order_info = array(); | |
$order_info['id'] = $order->get_order_number(); | |
$order_info['number'] = $order->get_order_number(); | |
$order_info['options'] = get_option( 'wc_dropship_manager' ); | |
$order_info['shipping_info'] = $this->get_order_shipping_info($order); | |
$order_info['billing_info'] = $this->get_order_billing_info($order); | |
$order_info['order'] = $order; | |
// for each item determine what products go to what suppliers. | |
// Build product/supplier lists so we can send send out our order emails | |
$order_info['suppliers'] = array(); | |
$items = $order->get_items(); | |
if ( count( $items ) > 0 ) { | |
foreach( $items as $item_id => $item ) { | |
$ds = wc_dropshipping_get_dropship_supplier_by_product_id( intval( $item['product_id'] ) ); | |
if ($ds['id'] > 0) { | |
$product = $order->get_product_from_item( $item ); // get the product obj | |
$prod_info = $this->get_order_product_info($item,$product); | |
if(!array_key_exists($ds['slug'],$order_info['suppliers'])) | |
{ | |
$order_info['suppliers'][$ds['slug']] = $ds; // ...add newly found dropship_supplier to the supplier array | |
$order_info[$ds['slug']] = array(); // ... and create an empty array to store product info in | |
} | |
$order_info[$ds['slug']][] = $prod_info; | |
//$order_info[$ds['slug'].'_raw'][] = $product; | |
} | |
} | |
} else { | |
// how did we get here? | |
//$this->sendAlert('No Products found for order #'.$order_info['id'].'!'); | |
//die; | |
} | |
return $order_info; | |
} | |
public function formatPhone($pnum) { | |
return preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', '($1) $2-$3', $pnum); | |
} | |
public function get_from_name() { | |
return wp_specialchars_decode(get_option( 'woocommerce_email_from_name' )); | |
} | |
public function get_from_address() { | |
return get_option( 'woocommerce_email_from_address' ); | |
} | |
public function get_content_type() { | |
return " text/html"; | |
} | |
// for sending failure notifications | |
public function sendAlert($text) { | |
wp_mail( get_bloginfo('admin_email'), 'Alert from '.get_bloginfo('name'), $text ); | |
} | |
public function make_directory( $path ) { | |
$upload_dir = wp_upload_dir(); | |
$order_dir = $upload_dir['basedir'].'/'.$path; | |
if( ! file_exists( $order_dir ) ) | |
wp_mkdir_p( $order_dir ); | |
return $order_dir; | |
} | |
// generate packingslip PDF | |
public function make_pdf($order_info,$supplier_info,$html,$file_name) { | |
// Include TCPDF library | |
if (!class_exists('TCPDF')) { | |
require_once( wc_dropshipping_get_base_path() . '/lib/tcpdf_min/tcpdf.php' ); | |
} | |
$options = get_option( 'wc_dropship_manager' ); | |
// make a directory for the current order (if it doesn't already exist) | |
$pdf_path = $this->make_directory($order_info['id']); | |
// generate a pdf for the current order and the current supplier | |
$file = $pdf_path.'/'.$file_name; | |
// create new PDF document | |
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); | |
// set document information | |
$pdf->SetCreator(PDF_CREATOR); | |
// set default header data | |
$pdf->SetHeaderData($options['packing_slip_url_to_logo'], $options['packing_slip_url_to_logo_width'], get_option( 'woocommerce_email_from_name' ).' '.date('Y-m-d')); | |
// set header and footer fonts | |
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); | |
//$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); | |
// remove default header/footer | |
//$pdf->setPrintHeader(false); | |
$pdf->setPrintFooter(false); | |
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); // set default monospaced font | |
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); // set margins | |
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER); | |
//$pdf->SetFooterMargin(PDF_MARGIN_FOOTER); | |
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); // set auto page breaks | |
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); // set image scale factor | |
$pdf->AddPage(); | |
$pdf->writeHTML($html, true, false, true, false, ''); | |
$pdf->Output($file, 'F'); // save PDF | |
return $file; | |
} | |
// get HTML packingslip | |
public function get_packingslip_html($order_info,$supplier_info) { | |
$html = ''; | |
$filename = 'packingslip.html'; | |
if (file_exists(get_stylesheet_directory().'/woocommerce-dropshipping/'.$supplier_info['slug'].'_'.$filename)) | |
{ | |
/* User can create a custom supplier packingslip PDF by creating a "woocommerce-dropshipping" directory | |
inside their theme's directory and placing a custom SUPPLIERCODE_packingslip.html there */ | |
$templatepath = get_stylesheet_directory().'/woocommerce-dropshipping/'.$supplier_info['slug'].'_'.$filename; | |
} | |
else if (file_exists(get_stylesheet_directory().'/wc_dropship_manager/'.$supplier_info['slug'].'_'.$filename)) | |
{ | |
/* User can create a custom supplier packingslip PDF by creating a "dropship_manager" directory | |
inside their theme's directory and placing a custom SUPPLIERCODE_packingslip.html there */ | |
$templatepath = get_stylesheet_directory().'/wc_dropship_manager/'.$supplier_info['slug'].'_'.$filename; | |
} | |
else if (file_exists(get_stylesheet_directory().'/woocommerce-dropshipping/'.$filename)) | |
{ | |
/* User can override the default packingslip PDF by creating a "woocommerce-dropshipping" directory | |
inside their theme's directory and placing a custom packingslip.html there */ | |
$templatepath = get_stylesheet_directory().'/woocommerce-dropshipping/'.$filename; | |
} | |
else if (file_exists(get_stylesheet_directory().'/wc_dropship_manager/'.$filename)) | |
{ | |
/* User can override the default packingslip PDF by creating a "dropship_manager" directory | |
inside their theme's directory and placing a custom packingslip.html there */ | |
$templatepath = get_stylesheet_directory().'/wc_dropship_manager/'.$filename; | |
} | |
else | |
{ | |
$templatepath = wc_dropshipping_get_base_path() . $filename; | |
} | |
return $this->get_template_html($templatepath,$order_info,$supplier_info); | |
} | |
// get HTML packingslip | |
public function get_packingslip_text($order_info,$supplier_info) { | |
$html = ''; | |
$filename = 'packingslip_text.html'; | |
if (file_exists(get_stylesheet_directory().'/woocommerce-dropshipping/'.$supplier_info['slug'].'_'.$filename)) | |
{ | |
/* User can create a custom supplier packingslip PDF by creating a "woocommerce-dropshipping" directory | |
inside their theme's directory and placing a custom SUPPLIERCODE_packingslip.html there */ | |
$templatepath = get_stylesheet_directory().'/woocommerce-dropshipping/'.$supplier_info['slug'].'_'.$filename; | |
} | |
else if (file_exists(get_stylesheet_directory().'/wc_dropship_manager/'.$supplier_info['slug'].'_'.$filename)) | |
{ | |
/* User can create a custom supplier packingslip PDF by creating a "dropship_manager" directory | |
inside their theme's directory and placing a custom SUPPLIERCODE_packingslip.html there */ | |
$templatepath = get_stylesheet_directory().'/wc_dropship_manager/'.$supplier_info['slug'].'_'.$filename; | |
} | |
else if (file_exists(get_stylesheet_directory().'/woocommerce-dropshipping/'.$filename)) | |
{ | |
/* User can override the default packingslip PDF by creating a "woocommerce-dropshipping" directory | |
inside their theme's directory and placing a custom packingslip.html there */ | |
$templatepath = get_stylesheet_directory().'/woocommerce-dropshipping/'.$filename; | |
} | |
else if (file_exists(get_stylesheet_directory().'/wc_dropship_manager/'.$filename)) | |
{ | |
/* User can override the default packingslip PDF by creating a "dropship_manager" directory | |
inside their theme's directory and placing a custom packingslip.html there */ | |
$templatepath = get_stylesheet_directory().'/wc_dropship_manager/'.$filename; | |
} | |
else | |
{ | |
$templatepath = wc_dropshipping_get_base_path() . $filename; | |
} | |
return $this->get_template_html($templatepath,$order_info,$supplier_info); | |
} | |
public function get_template_html($templatepath,$order_info,$supplier_info) { | |
$html = ''; | |
ob_start(); | |
if (file_exists($templatepath)){ | |
include($templatepath); | |
} else { | |
echo '<b>Template '.$templatepath.' not found!</b>'; | |
} | |
$html = ob_get_clean(); | |
return $html; | |
} | |
// send the pdf to the supplier | |
public function send_order($order_info,$supplier_info) { | |
$attachments = array(); | |
$attachments = apply_filters('wc_dropship_manager_send_order_attachments',$attachments,$order_info,$supplier_info); // create a pdf packing slip file | |
$options = get_option( 'wc_dropship_manager' ); | |
$text = ''; | |
$encoded_attachment = chunk_split(base64_encode(file_get_contents($attachments['pdf_packingslip']))); | |
$hdrs = array(); | |
$hdrs['From'] = get_option( 'woocommerce_email_from_address' ); | |
$hdrs['To'] = $supplier_info['order_email_addresses'].','.get_option( 'woocommerce_email_from_address' ); | |
$hdrs['CC'] = get_option( 'woocommerce_email_from_address' ); | |
$hdrs['Subject'] = 'New Order #'.$order_info['id'].' From '.get_option( 'woocommerce_email_from_name' ); | |
$semi_rand = md5(time()); | |
$semi_rand_mixed = $semi_rand."11"; | |
$mime_boundary_alt = "{$semi_rand}"; | |
$mime_boundary_mixed = "{$semi_rand_mixed}"; | |
$headers = "From: ".wp_specialchars_decode(get_option( 'woocommerce_email_from_name' ))." <".get_option( 'woocommerce_email_from_address' ).">\r\n"; | |
$headers .= "MIME-Version: 1.0\n"; | |
$headers .= "CC: ".get_option( 'woocommerce_email_from_address' )."r\n"; | |
$headers .= "Content-Type: multipart/mixed;\n"; | |
$headers .= " boundary=\"{$mime_boundary_mixed}\""; | |
if (strlen($supplier_info['account_number']) > 0) | |
{ | |
$text .= get_option( 'woocommerce_email_from_name' ).' account number: '.$supplier_info['account_number'].'<br/>'; | |
} | |
$textPlain = $this->get_packingslip_text($order_info,$supplier_info); | |
$text = $this->get_packingslip_html($order_info,$supplier_info); | |
$text = $options['email_order_note'] . $text; | |
$html = apply_filters('wc_dropship_manager_send_order_email_html',$text); | |
$message = "This is a multi-part message in MIME format.\n\n"; | |
$message .= "--{$mime_boundary_mixed}\n"; | |
$message .= "Content-Type: multipart/alternative;\n"; | |
$message .= " boundary=\"{$mime_boundary_alt}\"\n\n"; // The space in front of boundary is crucial. | |
$email_message_text = strip_tags($html); | |
$email_message_html = $html; | |
// Add a multipart boundary above the plain message | |
$message .= "--{$mime_boundary_alt}\n" . | |
"Content-Type: text/plain; charset=\"iso-8859-1\"\n" . | |
"Content-Transfer-Encoding: 7bit\n\n" . | |
$textPlain."\n\n" . | |
"--{$mime_boundary_alt}\n" . | |
"Content-Type: text/html; charset=\"iso-8859-1\"\n" . | |
"Content-Transfer-Encoding: 7bit\n\n" . | |
$email_message_html . "\n\n" . | |
"--{$mime_boundary_alt}--\n"; // Must have 2 hyphens at the end. | |
$attachment_name = $order_info['id'].'_'.$supplier_info['slug'].'.pdf';; | |
$message .= "--{$mime_boundary_mixed}\n" . | |
"Content-Type: application/pdf; name=".$attachment_name."\n" . | |
"Content-Transfer-Encoding: base64\n\n" . | |
"Content-Disposition: attachment". | |
$encoded_attachment . "\n\n" ; | |
$message .= "--{$mime_boundary_mixed}--\n"; // Must have 2 hyphens at the en | |
mail($hdrs['To'], $hdrs['Subject'], $message, $headers); | |
} | |
public function send_order_email_html( $text ) { | |
return '<b>'.$text.'</b>'; | |
} | |
public function send_order_attach_packingslip($attachments,$order_info,$supplier_info) { | |
$html = $this->get_packingslip_html($order_info,$supplier_info); | |
$file_name = $order_info['id'].'_'.$supplier_info['slug'].'.pdf'; | |
$attachments['pdf_packingslip'] = $this->make_pdf($order_info,$supplier_info,$html,$file_name); // create a pdf packing slip file | |
return $attachments; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment