Schedule email using wpMandrill to Wordpress - wordpress

Is that possible to schedule a message using wpMandrill plugin?
I saw in this post that we can use mandrill_payload filter to change anything in the structure (following Mandrill's API , /messages/send).
How can I change the send_at parameter so that I can schedule e-mails to be sent.
Would it be something like this:
function customFilterSendAt($send_at)
{
$send_at = "2016-01-23 14:00:00";
return $send_at;
}
add_filter('mandrill_payload', 'customFilterSendAt');
Then
wp_mail($email_adress, $subj, $body );
?

I found that it is possible to schedule emails using wpMandrill. This link (check aaroneight comments) helped me.
To schedule your email using wpMandrill:
$message = array(
'subject' => $subj,
'from_name' => 'From Name',
'from_email' => 'from_email#example.com',
'to' => 'to_email#example.com',
'html' => $body,
'async' => false,
'ip_pool' => null,
'send_at' => '2016-02-24 19:45:00'
);
$sendmessage = wpMandrill::sendEmail($message);
Debugging:
echo '<pre>'.print_r($sendmessage,true).'</pre>';
Output example:
Array
(
[0] => Array
(
[email] => to_email#example.com
[status] => scheduled
[_id] => db835dfe43cd5d67b3743a30e184f84d
[reject_reason] =>
)
)
At this time, scheduled emails may only be managed via Mandrill's API, so you won't find them within Mandrill's Dashboard.
to list your scheduled emails you can use:
$url = 'https://mandrillapp.com/api/1.0/messages/list-scheduled.json';
$key = 'Your API key';
//$to = ''; // optional
$args = array(
'body' => array(
'key' => $key
)
);
$results = wp_remote_post( $url, $args );
$results = json_decode($results['body']);
Output example:
Array
(
[0] => stdClass Object
(
[_id] => 1d0xe54f3b759a1153b7a53g3321f4b6
[created_at] => 2016-02-24 19:30:13
[send_at] => 2016-02-24 19:42:00
[from_email] => from_email#example.com
[to] => to_email#example.com
[subject] => Email Subject
)
[1] => stdClass Object
(
[_id] => 1272e526f6924ba096d23146e2dxad4c
[created_at] => 2016-02-24 19:31:12
[send_at] => 2016-02-24 19:45:00
[from_email] => from_email#example.com
[to] => to_email#example.com
[subject] => Email Subject
)
)

Related

How to attach media file to woocommerce order?

I want to attach media file after payment completion of order, for that I am using the filter "woocommerce_order_status_completed" with below snippet. But it is not attaching files to downloads tab of my account page.
add_filter( 'woocommerce_order_status_completed', 'attach_files' );
function attach_files($order_id){
$order = wc_get_order($order_id);
$md5_num = md5( 'http://localhost/wordpress/wp-content/uploads/abc.png');
$files[$md5_num] = array(
'download_url' => 'http://localhost/wordpress/wp-content/uploads/abc.png',
'download_name' => 'Download',
'downloads_remaining' => '1',
'access_expires' => NULL,
'download_id' => '7f7e4923ff94b7928c0b8b5e93fb4f89',
'product_id' => 17,
'order_id' => $order_id,
'order_key' => 'wc_order_5a382bef811e6',
'file' => array (
'name' => 'Download',
'file' => 'http://localhost/wordpress/wp-content/uploads/abc.png',
),
);
update_post_meta($order_id,'_files',$files);
}
Please help me to solve this.

Problem with custom taxonomies using wp_insert_post()

I have an array Im passing to the tax_input argument in wp_insert_post(). Below is a result of printing the wp_insert_post() arguments.
[tax_input] => Array
(
[knpvsoftcomp] => Array
(
[0] => 1530
)
[knpvfiletype] => Array
(
[0] => 1497
)
[product_cat] => Array <-- Woo Product Categories
(
[0] => 821
[1] => 829
[2] => 1530
[3] => 908
)
[pa_designer] => Array
(
[0] => 549
)
)
Here is the function inserting the new post.
$newpostargs = [
'post_type' => 'product',
'post_title' => sanitize_text_field($this->submission['fieldvalues']['product_title']),
'post_author' => $this->currentUser->ID,
'post_content' => $this->submission['fieldvalues']['description'],
'post_status' => 'draft',
'tax_input' => $this->knpv_tax_input(),
'meta_input' => $this->knpv_meta_input()
];
$newpost = wp_insert_post($newpostargs);
Here is the function being called to create the taxonomy array.
public function knpv_tax_input(){
$taxarray = [];
$productcategories = [];
foreach ($this->submission['fieldvalues'] as $key => $value) {
//For product_categories
if (strpos($key, 'cat-parent') !== false || strpos($key, 'catchild-') !== false) {
$productcategories[] = $value;
}
//Software version
if (strpos($key, 'software') !== false) {
$taxarray['knpvsoftcomp'] = [$value];
}
//File Types
if (strpos($key, 'file-compat') !== false) {
$taxarray['knpvfiletype'] = [$value];
}
}
//Add product categories to tax array
$productcategories[] = 908;
$taxarray['product_cat'] = $productcategories;
//Supplier (Vendor) Taxonomy
$taxarray['pa_designer'] = [$this->submission['vendor']['vendor_id']];
return $taxarray;
}
All of these are custom taxonomies expect for the Woo Product Categories. However, these are the only terms being assigned to the post. Any thoughts?
Im admin on the site so all permissions are set right.
Replace '$term_id' to your term ID Hope this help you.
// Creates woocommerce product
$product = array(
'post_title' => $name,
'post_content' => '',
'post_status' => 'publish',
'post_author' => $current_user->ID,
'post_type' =>'product'
);
// Insert the post into the database
$product_ID = wp_insert_post($product);
wp_set_object_terms($product_ID, $term_id, 'product_cat')
;
//you-want-multiple-cat
$categories = [ 'Some Category', 'Some other Category' ];
// Overwrite any existing term
wp_set_object_terms( $product_id, $categories, 'product_cat' );
// Or, set last argument to true to append to existing terms
wp_set_object_terms( $product_id, $categories, 'product_cat', true );

accessing shipping rates in order complete hook

The client has very specific shipping requirements so I built a shipping plugin that works perfectly. But I need to pull the chosen shipping info in a specific format to send a purchase order to a 3rd party provider.
In the shipping plugin I store these values as follows:
$rate1cfree = array(
'id' => 'shipping_method_courier_free',
'label' => 'Courier (free)',
'cost' => '0',
'calc_tax' => 'per_item',
'meta_data' => array(
'delivery_channel' => 'NAT',
'delivery_service' => 'EXP'
)
);
$this->add_rate( $rate1cfree );
The 2 meta values that I need in the order complete hook is 'delivery_channel' and 'delivery_service'.
Now in my woocommerce_payment_complete function I can pull most of the order data using:
$order = wc_get_order( $order_id );
$order_data = $order->get_data();
The problem is that the meta values comes through as follows:
[shipping_lines] => Array
(
[358] => WC_Order_Item_Shipping Object
(
[meta_data:protected] => Array
(
[0] => WC_Meta_Data Object
(
[current_data:protected] => Array
(
[id] => 2515
[key] => delivery_channel
[value] => NAT
)
[data:protected] => Array
(
[id] => 2515
[key] => delivery_channel
[value] => NAT
)
)
[1] => WC_Meta_Data Object
(
[current_data:protected] => Array
(
[id] => 2516
[key] => delivery_service
[value] => EXP
)
[data:protected] => Array
(
[id] => 2516
[key] => delivery_service
[value] => EXP
)
)
)
)
)
And no matter which ever methods I try and use I can't seem to access those values. I've tries using get_post_meta(), get_meta_data(), get_meta() and pretty much anything that looks like it could help on this page: https://docs.woocommerce.com/wc-apidocs/class-WC_Data.html
Any help would be greatly appreciated as I'm completely stuck. :)
OK, my co-working hero solved it as follows:
$order = wc_get_order( $order_id );
foreach( $order->get_items( 'shipping' ) as $item_id => $shipping_item_obj ){
$shipping_item_data = $shipping_item_obj->get_data();
$ship_info = $shipping_item_data['meta_data'];
foreach($ship_info as $ship_key => $ship_value){
$ship[$ship_key] = $ship_value->get_data();
}
}
print_r($ship);

Sanitize Array inside save_post

Let's say I have array like this :
Array (
[2066] => Array (
[images_id] => 2066
[title] => title one)
[2063] => Array (
[images_id] => 2063
[title] => title two )
[2022] => Array (
[images_id] => 2022
[title] => title three )
)
or in database format like this:
a:3:{i:2066;a:2:{s:8:"image_id";s:4:"2066";s:5:"title";s:9:"Title One";}i:2063;a:2:{s:8:"image_id";s:4:"2063";s:5:"title";s:9:"Title Two";}i:2022;a:2:{s:8:"image_id";s:4:"2022";s:5:"title";s:11:"Title Three";}}
How to sanitize with esc_attr or sanitize_text_field for images_id and title ?
Any help really appreciated :)
You can sanitize the images_id and the title fields of the array with Wordpress's esc_attr() and sanitize_text_field() functions using the PHP's array_walk() like below:
<?php
$arr = array(
2066 => array (
'images_id' => 2066,
'title' => 'title one'
),
2063 => array (
'images_id' => 2063,
'title' => 'title two'
),
2022 => array (
'images_id' => 2022,
'title' => 'title three'
)
);
//Sanitizing here:
array_walk($arr, function(&$value, &$key) {
$value['images_id'] = esc_attr($value['images_id']);
$value['title'] = esc_attr($value['title']);
//--AND/OR--
$value['images_id'] = sanitize_text_field($value['images_id']);
$value['title'] = sanitize_text_field($value['title']);
});
//Now check the new array:
echo '<pre>'; print_r($arr); echo '</pre>';
?>

Calculate different order status count and total cash for each order status in Woocommerce

I need to get the order total of a different status in between some days in woocommerce query. For it to loop through all orders in between some day I use the following query:
$args = array(
'post_type' => 'shop_order',
'post_status' => 'publish',
'posts_per_page' => -1,
'date_query' => array(
array(
'after' => array(
'year' => 2016,
'month' =>01,
'day' =>01,
),
'before' => array(
'year' => 2016,
'month' => 01,
'day' =>30,
),
'inclusive' => true,
),
),
);
$loop=new WP_Query($args);
By using this code I can loop through all the query and get the details correctly.
Now I need to get the details into following format
wc-shipped : Total order -> 10 total_cash -> 300$
wc- completed :
Totla order -> 34 total_cash -> 4580$
wc-cancelled : Total order ->
12 total_cash -> 100$
How can I get this detail in this format ?
I know how to get wc-shipped : Total order -> 10
For this I use:
$order_status_get[]=$order->post_status;
$order_status_get= array_count_values($order_status_get);
foreach ($order_status_get as $key => $value) {
echo $key.'->'.$value;
}
But I need the price also. For to get price I can use $order_total_array[]=$order->get_total();
But i don't know how to combine them and get the result in the desired format.
The easiest way I know...
using the WC_Admin_Report class... you can get the result array and manipulate it as you want... sample result is printed below...
include_once( WP_PLUGIN_DIR . '/woocommerce/includes/admin/reports/class-wc-admin-report.php');
$reports = new WC_Admin_Report();
$args = array(
'data' => array(
'_order_total' => array(
'type' => 'meta',
'function' => 'SUM',
'name' => 'total_cash'
),
'ID' => array(
'type' => 'post_data',
'function' => 'COUNT',
'name' => 'total_orders'
),
'post_status' => array(
'type' => 'post_data',
'function' => '',
'name' => 'status'
),
),
'where' => array(
array(
'key' => 'post_date',
'value' => date( 'Y-m-d', strtotime( '02/01/2016' ) ), // starting date
'operator' => '>'
),
array(
'key' => 'post_date',
'value' => date( 'Y-m-d', strtotime( '02/31/2016' ) ), // end date...
'operator' => '<'
),
),
'where_meta' => array(
array(
'meta_key' => 'who',
'meta_value' => 'manik',
'operator' => '='
)
),
'order_status' => array( 'cancelled', 'completed', 'shipped' ),
'group_by' => 'posts.post_status',
'query_type' => 'get_results',
);
$data = $reports->get_order_report_data($args);
print_r($data);
print something like
Array
(
[0] => stdClass Object
(
[total_cash] => 35
[total_orders] => 2
[status] => wc-cancelled
)
[1] => stdClass Object
(
[total_cash] => 315
[total_orders] => 21
[status] => wc-completed
)
[2] => stdClass Object
(
[total_cash] => 211
[total_orders] => 11
[status] => wc-shipped
)
)
then manipulate $data
//print_r($data);
//
$currency = (function_exists('get_woocommerce_currency_symbol'))?get_woocommerce_currency_symbol():'';
foreach($data as $item) {
echo sprintf('<p>%s : Total Orders %s -> Total Cash -> %s%s </p>', $item->status, $item->total_orders, $item->total_cash, $currency);
}
demo of $data. Click Execute code button.
Prints like:
wc-cancelled : Total Orders 2 -> Total Cash -> 35$
wc-completed : Total Orders 21 -> Total Cash -> 315$
wc-shipped : Total Orders 11 -> Total Cash -> 211$
I will give a solution that based on your question .
$order = new WC_Order('your order id ');
In your case
while($loop->have_posts()): $loop->the_post();
$order_id=get_the_ID();
$order = new WC_Order($order_id);
(1) get order status from order we can use $order->post_status
(2) to get order total we can use $order->get_total()
You can combine them and store it in to one array
$order_status_array[]=$order->post_status .'*'.$order->get_total();
here i combined using * , you can use your own.
so that the out put array like
Array ( [0] => wc-cancelled*64 [1] => wc-cancelled*254 [2] =>wc-cancelled*93 [3] => wc-cancelled*44 [4] => wc-cancelled*213 [5] => wc-cancelled*44)
Then use the following code to arrange this array in proper format
$new_array = [];
foreach($order_status_array as $key => $value) {
list($name, $val) = explode('*', $value);
if(array_key_exists($name, $new_array)) {
$new_array[$name]['total_cash'] += $val;
$new_array[$name]['total_order']++;
} else {
$new_array[$name]['total_cash'] = $val;
$new_array[$name]['total_order'] = 1;
}
}
now your array is ready , and it's like
Array(
[wc-cancelled] => Array(
[total_cash] => ...
[total_order] =>...
)
...
)
now use the following code
foreach ($new_array as $l=>$m){
echo $l.'Total Order:->'.$m['total_order'] .'Total Cash:->'.$m['total_cash'].'</br>';
}
. This will work . You can use other good solutions also . Try this .
so entire code is
while($loop->have_posts()): $loop->the_post();
$order_id=get_the_ID();
$order = new WC_Order($order_id);
$order_status_array[]=$order->post_status .'*'.$order->get_total();
endwhile;
$new_array = [];
foreach($order_status_array as $key => $value) {
list($name, $val) = explode('*', $value);
if(array_key_exists($name, $new_array)) {
$new_array[$name]['total_cash'] += $val;
$new_array[$name]['total_order']++;
} else {
$new_array[$name]['total_cash'] = $val;
$new_array[$name]['total_order'] = 1;
}
}
foreach ($new_array as $l=>$m){
echo $l.'Total Order:->'.$m['total_order'] .'Total Cash:->'.$m['total_cash'].'</br>';
}
If I understand your question correctly, you want all orders dumbed down to a list of rows summed by the post_status field, right?
In the end you want something like this:
$order_status = array(
'wc-shipped' => 10,
'wc-completed' => 20,
'wc-cancelled' => 30
);
I see two options:
1) Change the query to utilize posts_groupby to only return summarized columns.
2) Iterate over all the rows in the result set and summarize them by post_status manually. Use an array with the key of the status and increment the value by $order->get_total()

Resources