Hello @niikk ,
It’s always great to see that you are trying to extend Dokan functionality.
I do not have an exact example code for you on this requirement. If I understand correctly, Dokan uses wc_add_order_item_meta
to set the commission. So, you can use wc_get_order_item_meta
to retrieve that information.
I have not tested it so, I am unable to guarantee this. However, this should work to retrieve any metadata saved with the ordered item.
Thank you 🙂
Thread Starter
niikk
(@niikk)
Hello @rur165
Yes, So we want to display under each product in the order the commission typ and commission rate. With wc_add_order_item_met
we will display the commission from the whole order right?
Like in that example here the “name your shirt row”: https://rudrastyh.com/wp-content/uploads/2018/02/woocommerce-order-items-in-admin.png
I’m not able to display the needed information with this code here. Hoe do I have to access this _dokan_commission_rate
and _dokan_commission_type
?
add_action( 'woocommerce_checkout_create_order_line_item', display_product_vendor_earnings', 10, 4 );
function display_product_vendor_earnings( $item, $cart_item_key, $values, $order ) {
if ( !empty( $values['_dokan_commission_rate'] ) ) {
$item->add_meta_data( 'Product commission:', $values['_dokan_commission_rate'] );
}
}
Or with that one:
function display_product_commissions($order){
echo "<p><strong>Name of pickup person:</strong> " . $order->order_custom_fields['_dokan_commission_type'][0] . "</p>";
}
add_action( 'woocommerce_checkout_create_order_line_item', 'display_product_commissions', 10, 1 );
You should be able to copy that in your function.php and then it should be displayed IF the code works 😉 Because those values are already stored in the order right?
-
This reply was modified 4 years, 3 months ago by
niikk.
Thread Starter
niikk
(@niikk)
Hi @rur165
Now I also tried to access the order product meta array… But same result. Nothing is displayed. Can it be that hard just to display those values?! hehe 😂
function display_product_commissions($order){
global $post;
$order = wc_get_order( $post->ID );
$items = $order->get_items();
foreach ( $order->get_items() as $item_id => $item ) {
// Here you get your data
$custom_field = wc_get_order_item_meta( $item_id, '_dokan_commission_rate', true );
// To test data output (uncomment the line below)
print_r($custom_field);
// Iterating in an array of keys/values
foreach( $custom_field as $key => $value ){
echo '<p>key: '.$key.' | value: '.$value.'</p>';
}
}
}
add_action( 'woocommerce_checkout_create_order_line_item', 'display_product_commissions', 10, 1 );
I saw, that in dokan-lite commission.php you guys use a function to hide those values:
/**
* Hide extra meta data
*
* @since 2.9.21
*
* @param array
*
* @return array
*/
public function hide_extra_data( $formated_meta ) {
$meta_to_hide = [ '_dokan_commission_rate', '_dokan_commission_type', '_dokan_additional_fee' ];
$meta_to_return = [];
foreach ( $formated_meta as $key => $meta ) {
if ( ! in_array( $meta->key, $meta_to_hide ) ) {
array_push( $meta_to_return, $meta );
}
}
return $meta_to_return;
}
-
This reply was modified 4 years, 3 months ago by
niikk.
Hello @niikk ,
Again, it’s wonderful that you share the updates of your work here.
All these require time to debug and according to our support policy I am unable to go through the custom codes hence it is hard to make a comment on this.
However, you have actually found the solution already. The function hide_extra_data
is actually stopping you to access this metadata. You can comment out the function from line no. 38 on this file – \dokan-lite\includes\Commission.php
.
Then you will see the metadata is showing automatically in the ordered item – https://prnt.sc/10dccrc.
I do not have an example code to remove the filter using a child theme so can’t share that which would have been good to have.
I hope you understand the limitation.
Thank you 🙂
Thread Starter
niikk
(@niikk)
@rur165
Thanks. Yeah.. now its working. But always change this after a update is stupid. 😄
But I guess it should not be that hard so create a filter to unset that via function.php file?
I tried with that.. but does not work.. any ideas why? 🙂
add_action( 'plugins_loaded', 'webearth_remove_plugin_filter' );
function webearth_remove_plugin_filter() {
remove_filter( 'woocommerce_order_item_get_formatted_meta_data',
array('constructor', 'hide_extra_data'),
10 );
}
-
This reply was modified 4 years, 3 months ago by
niikk.
Thread Starter
niikk
(@niikk)
@rur165 I guess the code above should work. But I thins the class from the array is wrong. Where is this class defined?
Thread Starter
niikk
(@niikk)
@rur165
Hello Rashed,
I’m still trying to get this to work. I think I always get the wrong class name. I’m not sure if constructor
is the right class name. After I have the right class name, I think the snipped should work.. 😉
add_action( 'plugins_loaded', 'webearth_remove_plugin_filter' );
function webearth_remove_plugin_filter() {
global $constructor;
remove_filter( 'woocommerce_order_item_get_formatted_meta_data',
array('$constructor', 'hide_extra_data'),
10 );
}
Hello @niikk ,
This version of the code seems to be working for me –
add_action( 'init', function () {
remove_filter( 'woocommerce_order_item_get_formatted_meta_data', [ dokan()->commission, 'hide_extra_data' ] );
}, 20 );
Thank you 🙂
Thread Starter
niikk
(@niikk)
@rur165
Works! Cool!
Just one last question: Those values are stored in the order right? So if I change a commission type or amount from product A, it will not change the values there in orders where product A was ordered by the customer?
Hello @niikk ,
You are right that these are saved with the order. So changing the commission will not affect these values.
If you make a new order while having a different commission then that will be saved. Consider it as a product price. You can change the price any time but that does not reflect on all orders.
I hope this clears the confusion.
Thank you 🙂