-
-
Save EricBusch/fbe9f7164ec0d4a85d70d0f430581e9a to your computer and use it in GitHub Desktop.
<?php | |
/** | |
* Add the product's Size as an attribute. | |
* | |
* The attribute "Size" with a slug of "size" must already exist here: WordPress Admin Area > Products > Attributes | |
* | |
* @param array|string $value The current value of the $attribute for this $post. | |
* @param string $attribute The slug of the attribute. Examples: pa_color or pa_shoe-size | |
* @param array $post An array of post data including ID, post_title, post_status, etc... | |
* @param array $product An array of product data returned from the Datafeedr API. | |
* @param array $set A post array for this Product Set with an array key of postmeta containing all post meta data. | |
* @param string $action The action the Product Set is performing. Value are either "insert" or "update". | |
* | |
* @return array|string The updated attribute's value. | |
*/ | |
function mycode_import_size_attribute( $value, $attribute, $post, $product, $set, $action ) { | |
$ai = new Dfrpswc_Attribute_Importer( 'size', $value, $attribute, $product ); | |
$ai->add_field( [ 'size' ] ); | |
// If a field contains a comma "," split the field into multiple values. | |
$ai->field_delimiter = ','; | |
$ai->add_term( "Extra Small", [ "xs", "x-small" ] ); | |
$ai->add_term( "Small", [ "s", "sm" ], [ "x-small" ] ); | |
$ai->add_term( "Medium", [ "m", "md", "med" ] ); | |
$ai->add_term( "Large", [ "l", "lg" ], [ "x-large", "xx-large", "xxx-large" ] ); | |
$ai->add_term( "Extra Large", [ "x-large", "xl" ] ); | |
return $ai->result(); | |
} | |
add_filter( 'dfrpswc_filter_attribute_value', 'mycode_import_size_attribute', 20, 6 ); | |
/** | |
* Add the product's Color as an attribute. | |
* | |
* The attribute "Color" with a slug of "color" must already exist here: WordPress Admin Area > Products > Attributes | |
* | |
* @param array|string $value The current value of the $attribute for this $post. | |
* @param string $attribute The slug of the attribute. Examples: pa_color or pa_shoe-size | |
* @param array $post An array of post data including ID, post_title, post_status, etc... | |
* @param array $product An array of product data returned from the Datafeedr API. | |
* @param array $set A post array for this Product Set with an array key of postmeta containing all post meta data. | |
* @param string $action The action the Product Set is performing. Value are either "insert" or "update". | |
* | |
* @return array|string The updated attribute's value. | |
*/ | |
function mycode_import_color_attribute( $value, $attribute, $post, $product, $set, $action ) { | |
$ai = new Dfrpswc_Attribute_Importer( 'color', $value, $attribute, $product ); | |
$ai->add_field( [ 'color' ] ); | |
$ai->add_field( [ 'description.tags.attribute5.name' ], 'color', "Multicolor" ); | |
$ai->field_delimiter = ','; | |
$ai->add_term( "Black", [ "ebony", "onyx", "obsidian" ] ); | |
$ai->add_term( "Blue", [ "navy", "indigo", "azure", "periwinkle", "lavender", "cobalt" ] ); | |
$ai->add_term( "Brown", [ "caramel" ] ); | |
$ai->add_term( "Green", [ "lime", "moss", "mint", "pine", "chartreuse", "sage", "olive" ] ); | |
$ai->add_term( "Grey", [ "gray", "silver", "charcoal" ] ); | |
$ai->add_term( "Pink", [ "rose", "fuchsia", "rouge", "salmon", "coral", "magenta" ] ); | |
$ai->add_term( "Purple", [ "mauve", "violet", "lavender", "beetroot", "burgundy", "mulberry" ] ); | |
$ai->add_term( "Orange" ); | |
$ai->add_term( "Red", [ "cherry", "rose", "ruby", "crimson", "scarlet", "garnet" ] ); | |
$ai->add_term( "Tan", [ "beige", "camel", "khaki" ] ); | |
$ai->add_term( "White", [ "pearl", "alabaster", "ivory", "cream", "egg shell", "eggshell" ] ); | |
$ai->add_term( "Yellow", [ "lemon" ] ); | |
return $ai->result(); | |
} | |
add_filter( 'dfrpswc_filter_attribute_value', 'mycode_import_color_attribute', 20, 6 ); | |
/** | |
* Add the product's Gender as an attribute. | |
* | |
* The attribute "Gender" with a slug of "gender" must already exist here: WordPress Admin Area > Products > Attributes | |
* | |
* @param array|string $value The current value of the $attribute for this $post. | |
* @param string $attribute The slug of the attribute. Examples: pa_color or pa_shoe-size | |
* @param array $post An array of post data including ID, post_title, post_status, etc... | |
* @param array $product An array of product data returned from the Datafeedr API. | |
* @param array $set A post array for this Product Set with an array key of postmeta containing all post meta data. | |
* @param string $action The action the Product Set is performing. Value are either "insert" or "update". | |
* | |
* @return array|string The updated attribute's value. | |
*/ | |
function mycode_import_gender_attribute( $value, $attribute, $post, $product, $set, $action ) { | |
$ai = new Dfrpswc_Attribute_Importer( 'gender', $value, $attribute, $product ); | |
$ai->add_field( [ 'gender', 'attribute6.name.description' ], 'gender' ); | |
$ai->add_term( "Womens", [ "female", "womens", "woman", "women" ] ); | |
$ai->add_term( "Mens", [ "male", "mens", "man", "men" ] ); | |
return $ai->result(); | |
} | |
add_filter( 'dfrpswc_filter_attribute_value', 'mycode_import_gender_attribute', 20, 6 ); | |
/** | |
* Normalize the product's Merchant's name when importing as an attribute. | |
* | |
* The attribute "Merchant" with a slug of "merchant" must already exist here: WordPress Admin Area > Products > Attributes | |
* | |
* @param array|string $value The current value of the $attribute for this $post. | |
* @param string $attribute The slug of the attribute. Examples: pa_color or pa_shoe-size | |
* @param array $post An array of post data including ID, post_title, post_status, etc... | |
* @param array $product An array of product data returned from the Datafeedr API. | |
* @param array $set A post array for this Product Set with an array key of postmeta containing all post meta data. | |
* @param string $action The action the Product Set is performing. Value are either "insert" or "update". | |
* | |
* @return array|string The updated attribute's value. | |
*/ | |
function mycode_normalize_merchant_name( $value, $attribute, $post, $product, $set, $action ) { | |
$ai = new Dfrpswc_Attribute_Importer( 'merchant', $value, $attribute, $product ); | |
$ai->add_field( [ "merchant" ], "merchant" ); | |
$ai->add_term( "Adidas" ); | |
$ai->add_term( "AppOutdoors", [ "AppOutdoors.com" ] ); | |
$ai->add_term( "Black Diamond" ); | |
$ai->add_term( "C.A.M.P.", [ "camp" ] ); | |
$ai->add_term( "CampSaver", [ "CampSaver.com" ] ); | |
$ai->add_term( "ChinaVision" ); | |
$ai->add_term( "Mad Rock", [ "madrock" ] ); | |
$ai->add_term( "Marmot" ); | |
$ai->add_term( "Metolius" ); | |
$ai->add_term( "Outdoor Play", [ "outdoorplay" ] ); | |
$ai->add_term( "Petzl" ); | |
$ai->add_term( "REI" ); | |
$ai->add_term( "Summit Sports", [ "Summit Sports Sites", "SummitSports" ] ); | |
$ai->add_term( "The North Face", [ "north face" ] ); | |
$result = $ai->result(); | |
return $result; | |
} | |
add_filter( 'dfrpswc_filter_attribute_value', 'mycode_normalize_merchant_name', 20, 6 ); | |
/** | |
* Add the product's Age Group as an attribute. | |
* | |
* The attribute "Age Group" with a slug of "age-group" must already exist here: WordPress Admin Area > Products > Attributes | |
* | |
* @param array|string $value The current value of the $attribute for this $post. | |
* @param string $attribute The slug of the attribute. Examples: pa_color or pa_shoe-size | |
* @param array $post An array of post data including ID, post_title, post_status, etc... | |
* @param array $product An array of product data returned from the Datafeedr API. | |
* @param array $set A post array for this Product Set with an array key of postmeta containing all post meta data. | |
* @param string $action The action the Product Set is performing. Value are either "insert" or "update". | |
* | |
* @return array|string The updated attribute's value. | |
*/ | |
function mycode_import_age_group_attribute( $value, $attribute, $post, $product, $set, $action ) { | |
$ai = new Dfrpswc_Attribute_Importer( 'age-group', $value, $attribute, $product ); | |
$ai->add_field( [ 'gender.name.description.category' ], '', 'All Ages' ); | |
$ai->add_term( | |
"Girls", | |
[ "girl" ], | |
[ "womens", "woman", "women", "adult", "ladies" ] | |
); | |
$ai->add_term( | |
"Boys", | |
[ "boy" ], | |
[ "mens", "man", "men", "adult" ] | |
); | |
$ai->add_term( | |
"Womens", | |
[ "female", "womens", "woman", "women" ], | |
[ "girl", "girls", "child", "children", "kids", "kid" ] | |
); | |
$ai->add_term( | |
"Mens", | |
[ "male", "mens", "man", "men" ], | |
[ "boy", "boys", "child", "children", "kids", "kid" ] | |
); | |
$ai->add_term( | |
"Adult", | |
[ "male", "mens", "man", "men", "female", "womens", "woman", "women" ], | |
[ "boy", "boys", "girl", "girls", "child", "children", "kids", "kid" ] | |
); | |
$ai->add_term( | |
"Children", | |
[ "boy", "boys", "girl", "girls", "child", "children", "kids", "kid" ], | |
[ "male", "mens", "man", "men", "womens", "woman", "women" ] | |
); | |
return $ai->result(); | |
} | |
add_filter( 'dfrpswc_filter_attribute_value', 'mycode_import_age_group_attribute', 20, 6 ); | |
/** | |
* Add the product's Country Name as an attribute. | |
* | |
* The attribute "Country" with a slug of "country" must already exist here: WordPress Admin Area > Products > Attributes | |
* | |
* @param array|string $value The current value of the $attribute for this $post. | |
* @param string $attribute The slug of the attribute. Examples: pa_color or pa_shoe-size | |
* @param array $post An array of post data including ID, post_title, post_status, etc... | |
* @param array $product An array of product data returned from the Datafeedr API. | |
* @param array $set A post array for this Product Set with an array key of postmeta containing all post meta data. | |
* @param string $action The action the Product Set is performing. Value are either "insert" or "update". | |
* | |
* @return array|string The updated attribute's value. | |
*/ | |
function mycode_import_country_attribute( $value, $attribute, $post, $product, $set, $action ) { | |
$ai = new Dfrpswc_Attribute_Importer( 'country', $value, $attribute, $product ); | |
$ai->add_field( [ "source", "merchant" ], "country", 'United States' ); | |
$ai->add_term( "Australia", [ "AU" ] ); | |
$ai->add_term( "Austria", [ "AT" ] ); | |
$ai->add_term( "Belgium", [ "BE" ] ); | |
$ai->add_term( "Brazil", [ "BR" ] ); | |
$ai->add_term( "Brazil", [ "BR" ] ); | |
$ai->add_term( "Canada", [ "CA" ] ); | |
$ai->add_term( "Denmark", [ "DK" ] ); | |
$ai->add_term( "Finland", [ "FI" ] ); | |
$ai->add_term( "France", [ "FR" ] ); | |
$ai->add_term( "Germany", [ "DE" ] ); | |
$ai->add_term( "Ireland", [ "IE" ] ); | |
$ai->add_term( "Italy", [ "IT" ] ); | |
$ai->add_term( "India", [ "IN" ] ); | |
$ai->add_term( "Netherlands", [ "NL" ] ); | |
$ai->add_term( "New Zealand", [ "NZ" ] ); | |
$ai->add_term( "Norway", [ "NO" ] ); | |
$ai->add_term( "Poland", [ "PL" ] ); | |
$ai->add_term( "Portugal", [ "PT" ] ); | |
$ai->add_term( "Spain", [ "ES" ] ); | |
$ai->add_term( "Sweden", [ "SE" ] ); | |
$ai->add_term( "Switzerland", [ "CH" ] ); | |
$ai->add_term( "United Kingdom", [ "UK", "GB" ] ); | |
$ai->add_term( "United States", [ "US", "USA" ] ); | |
return $ai->result(); | |
} | |
add_filter( 'dfrpswc_filter_attribute_value', 'mycode_import_country_attribute', 20, 6 ); | |
/** | |
* Add the product's Country Name as an attribute. | |
* | |
* The attribute "Country" with a slug of "country" must already exist here: WordPress Admin Area > Products > Attributes | |
* | |
* @param array|string $value The current value of the $attribute for this $post. | |
* @param string $attribute The slug of the attribute. Examples: pa_color or pa_shoe-size | |
* @param array $post An array of post data including ID, post_title, post_status, etc... | |
* @param array $product An array of product data returned from the Datafeedr API. | |
* @param array $set A post array for this Product Set with an array key of postmeta containing all post meta data. | |
* @param string $action The action the Product Set is performing. Value are either "insert" or "update". | |
* | |
* @return array|string The updated attribute's value. | |
*/ | |
function mycode_import_material_attribute( $value, $attribute, $post, $product, $set, $action ) { | |
$ai = new Dfrpswc_Attribute_Importer( 'material', $value, $attribute, $product ); | |
$ai->add_field( [ "description.name.material" ], "material" ); | |
$ai->add_term( "Bamboo" ); | |
$ai->add_term( "Denim", [ "jean", "jeans" ] ); | |
$ai->add_term( "Flannel" ); | |
$ai->add_term( "Fur" ); | |
$ai->add_term( "Glass" ); | |
$ai->add_term( "Leather", [ "cowhide" ] ); | |
$ai->add_term( "Metal", [ "copper", "steel", "iron", "aluminum" ] ); | |
$ai->add_term( "Nylon" ); | |
$ai->add_term( "Plastic" ); | |
$ai->add_term( "Polyester" ); | |
$ai->add_term( "Rayon" ); | |
$ai->add_term( "Spandex" ); | |
$ai->add_term( "Wood" ); | |
return $ai->result(); | |
} | |
add_filter( 'dfrpswc_filter_attribute_value', 'mycode_import_material_attribute', 20, 6 ); |
Hi Eric,
Thanks a lot. I will clean up my list of term and do a test with a category with just a few products. Thanks a lot.
Simon
You're welcome! Hope that works for you!
Hi Eric,
Your last suggestion did the trick for me. Thanks a lot. I just noticed the length of a product description seems limited to a 1000 characters. Do you happen to know if this is the case?
Here is an example of a feed i am using right now: https://pf.tradetracker.net/?aid=394294&encoding=utf-8&type=xml-v2&fid=561798&categoryType=2&additionalType=2
This feed has product descriptions longer than 1000 characters. For example. When searching this product in the feed above "Georg Julius Sauvignon Blanc (Organic)" you will see the product description is longer than 1000 characters. In this case 1016. The text is "interupted" in a strange way now for this product.
You can see what i mean right here: https://www.buydrinks.nl/product/georg-julius-sauvignon-blanc-organic-2/
Is there a way to extend the maximum number of character that Datafeedr is parsing and importing into the products. For as far as i can see right now the limitation is in the datafeedr api.
Best regards from the Netherlands!
Simon
@jans9208 - I'm looking into this and will get back to you shortly.
Hello Eric, thanks a lot. I hope to here from you soon.
Best regards,
Simon
Hi Simon
I looked into it and we don't truncate any data when it gets imported into our database.
We will update that merchant's feed shortly and hopefully that resolves the issue.
Eric
Hello Eric,
Thanks a lot your help again. Have a great day!
Best regards,
Simon
You're welcome! If after the next update the problem still persists, let me know and we'll take a look at our feed source.
Hello Eric,
I have just checked this product and as you can see the text is still limited to 1000 characters.
https://www.buydrinks.nl/product/georg-julius-sauvignon-blanc-organic-2/
Can you check the feed source please?
Greetings Simon
@jans9208 Sorry for the late reply.
We took a look at the feed which we get from TradeTracker and the Long Description is truncated. See attached.
You might try reaching out to TT or the merchant about this. Unfortunately there's nothing we can do from our end. If the data is incorrect we are unable to fix it.
If you have any other questions, please don't hesitate to ask.
Thanks,
Eric
Hello Eric,
Sorry to ask you again for support. One of our partners, Vinifiy, had a feed problem last thursday. All of their products were gone by a coding mistake on their side. I reported this issue because 177 products were deleted on my site. They fixed it on friday, in Daisycon all of the 177 products were visible again the same day: https://daisycon.io/datafeed/?filter_id=89959&settings_id=11064
The product are not visible yet in the Datafeedr API and so not visible on https://www.buydrinks.nl It is still displaying "0 products", see attachment. Is there a delay in updating feeds from Daisycon or how does this work?
I hope you can be of any assistance
Yes, there is a delay. They should become available in the next day or so. Sorry for the inconvenience!
No problem! Thanks for the update!
Hi Eric,
I hope you are doing well! All goes well for buydrinks.nl. We are growing and we will launch a new winesite very soon. The products that have to be on this website will be sent from a warehouse via drop-shipping. We will also list these same wines via an affiliate network (probably Awin or Daisycon) on our website buydrinks.
I was wondering if it would be possible to import these wines via Datafeedr, and set them automatically as simple product instead of external/affiliate products? In this way we can use Wordpress multisite and maintain a dropshipping website and an affiliate website via Datafeedr via the same installation.
Best regards,
Simon
Hi Simon
Glad to hear your site is going well!
Yes, you could use this action to make the changes you need:
do_action( 'dfrpswc_post_save_product', $this );
You will need to have enabled this change before that action will actually work.
The $this
argument actually contains all of the objects you will need.
Primarily, it will contain:
$this->wc_product // This is the WC_Product object
$this->post // This is an array of the Post data related to the product imported into WooCommerce
$this->dfr_product // This is an array of the product data from the Datafeedr API
So you could do something like this (this is untested and just a simple example):
add_action( 'dfrpswc_post_save_product', function ( Dfrpswc_Product_Update_Handler $updater ) {
$updater->wc_product->product_type = 'simple';
$updater->wc_product->save();
} );
Hope this helps!
Eric
@jans9208 Yes, that should work. But instead of adding the same str_replace
call over and over again, this might simplify your code and make it easier to update your code now and in the future.
add_filter( 'dfrpswc_filter_post_array', function ( $post, $product, $set, $action ) {
/**
* This is for the descriptions.
*
* The keys are the terms you want to replace and the values are what you want to use instead.
*/
$desc_map = [
'strong' => '',
'br br' => '',
'Br Br' => '',
];
/**
* This is for the title.
*
* The keys are the terms you want to replace and the values are what you want to use instead.
*/
$title_map = [
'bij Jumbo' => '',
];
$desc = str_replace( array_keys( $desc_map ), array_values( $desc_map ), $post['post_content'] ?? '' );
$title = str_replace( array_keys( $title_map ), array_values( $title_map ), $post['post_title'] ?? '' );
$post['post_content'] = trim( $desc );
$post['post_title'] = trim( $title );
return $post;
}, 20, 4 );
@jans9208 Yes, that should work. But instead of adding the same
str_replace
call over and over again, this might simplify your code and make it easier to update your code now and in the future.add_filter( 'dfrpswc_filter_post_array', function ( $post, $product, $set, $action ) { /** * This is for the descriptions. * * The keys are the terms you want to replace and the values are what you want to use instead. */ $desc_map = [ 'strong' => '', 'br br' => '', 'Br Br' => '', ]; /** * This is for the title. * * The keys are the terms you want to replace and the values are what you want to use instead. */ $title_map = [ 'bij Jumbo' => '', ]; $desc = str_replace( array_keys( $desc_map ), array_values( $desc_map ), $post['post_content'] ?? '' ); $title = str_replace( array_keys( $title_map ), array_values( $title_map ), $post['post_title'] ?? '' ); $post['post_content'] = trim( $desc ); $post['post_title'] = trim( $title ); return $post; }, 20, 4 );
Thanks Eric, sorry for my noob code. Online marketeer, no developer ;)
No worries. Your code would work fine! My code is the same as yours but maybe just easier to update.
Hi Eric,
I have a question about new or existing networks/publisher on the Datafeedr ecosystem. I have just received an invitation for "Topdrinks" from Tradetracker. The publisher is active.
Whenever i browse this URL https://www.datafeedr.
com/networks it is not listed, or yet.
Another publisher is "COOP NL - FamilyBlend" they have accepted my request weeks ago but is not listed on the Datafeedr website. Both networks have a productfeed. Are there any restrictions before accepting feeds from your side? Because this would cause delays or publishing problems in the future.
Looking forward to hear from you.
Best regards,
Simon
Hi @jans9208
Here's more information regarding our inclusion of merchants:
https://datafeedrapi.helpscoutdocs.com/article/27-request-a-missing-merchant
If you need to request a missing merchant, just let us know in the Contact Form here:
Thanks!
Eric
Hi Eric,
You are all ok? I have to reach out to you again. Since a few week importing product properties doesn't go well. For some properties multiple instances are created. E.g; i have a property rumregion which sets the country of origin for the rum. Here you see the function.
In the attachment you see the result. Do you happen to know what the reason for this is and how i can fix it?
// Change 'color' to the slug of the attribute you want to target.
$ai = new Dfrpswc_Attribute_Importer( 'rumregion', $value, $attribute, $product );
$ai->add_field( [ 'description' ], 'rumregion' );
// Add terms that will be allowed for import
$ai->add_term( "Trinidad", [ "Trinidad" ] );
$ai->add_term( "Tobago", [ "Tobago" ] );
$ai->add_term( "Panama", [ "Tobago" ] );
$ai->add_term( "Barbados", [ "Barbados" ] );
$ai->add_term( "Cuba", [ "Cuba" ] );
$ai->add_term( "Verenigde Staten", [ "Verenigde Staten" ] );
$ai->add_term( "Dominicaanse Republiek", [ "Dominicaanse Rep" ] );
$ai->add_term( "Fiji", [ "Fiji" ] );
$ai->add_term( "Guatemala", [ "Guatemala" ] );
$ai->add_term( "Belize", [ "Belize" ] );
$ai->add_term( "Venezuela", [ "Venezuela" ] );
return $ai->result();
}
add_filter( 'dfrpswc_filter_attribute_value', 'mycode_import_rumregion_attribute', 20, 6 );```
@jans9208 You need to add this code to your custom plugin.
Hope this helps!
Hi
I tested something like this and it worked for me. Try doing a small test like this:
Hope this helps!