I have an issue where I have a custom function that creates a custom product, and then add it to the cart afterwards.
The big issue is that it works, perfectly in Chrome, but not in Firefox and Safari? Anybody having an idea why it works only in Chrome?
My funciton in functions.php
add_action('wp_loaded', 'customcart');
function customcart() {
if (isset($_POST["addcustomcarts"])) {
global $woocommerce;
$my_post = array(
'post_title' => 'Design selv skilt',
'post_content' => '<div class="col-md-12">Dette er et design selv skilt, tjek egenskaber på produktet for at se hvad kunden har bestilt.</div>',
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'product'
);
// Insert the post into the database
$product_ID = wp_insert_post( $my_post );
$filteredData=substr($_POST['img_val'], strpos($_POST['img_val'], ",")+1);
//Decode the string
$unencodedData=base64_decode($filteredData);
//Save the image
file_put_contents('img' . $product_ID . '.png', $unencodedData);
if ( $product_ID ){
wp_set_object_terms( $product_ID, 'design-selv-skilte', 'product_cat' );
add_post_meta($product_ID, '_regular_price', $_POST["priceInput"] );
add_post_meta($product_ID, '_price', $_POST["priceInput"] );
add_post_meta($product_ID, '_stock_status', 'instock' );
//add_post_meta($product_ID, '_manage_stock', 'yes' );
//add_post_meta($product_ID, '_stock', '10' );
add_post_meta($product_ID, '_sku', 'designselvskilt-' . $product_ID );
add_post_meta($product_ID, '_visibility', 'hidden' );
add_post_meta($product_ID, 'tekst-paa-linje-1', $_POST["textInput"] );
add_post_meta($product_ID, 'tekst-paa-linje-2', $_POST["text2Input"] );
add_post_meta($product_ID, 'stoerrelse', $_POST["størrelseInput"] );
add_post_meta($product_ID, 'form', $_POST["formInput"] );
add_post_meta($product_ID, 'farve', $_POST["farveInput"] );
add_post_meta($product_ID, 'type-skilt', $_POST["typeInput"] );
add_post_meta($product_ID, 'fastgoering', $_POST["fastgøringInput"] );
add_post_meta($product_ID, 'font', $_POST["fontInput"] );
add_post_meta($product_ID, 'linje-1-font-size', $_POST["fontSizeLine1Input"] );
add_post_meta($product_ID, 'linje-2-font-size', $_POST["fontSizeLine2Input"] );
add_post_meta($product_ID, 'product_image_gallery', $_POST["img_val"]);
add_post_meta($product_ID, 'product_image_url', 'img' . $product_ID . '.png');
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
$home = home_url();
$url = $home . '/img' . $product_ID . '.png';
$post_id = $product_ID;
$desc = $_POST["textInput"];
$image = media_sideload_image($url, $post_id, $desc, src );
function getImageId( $image ) {
// Split the $url into two parts with the wp-content directory as the separator
$parsed_url = explode( parse_url( WP_CONTENT_URL, PHP_URL_PATH ), $image );
// Get the host of the current site and the host of the $url, ignoring www
$this_host = str_ireplace( 'www.', '', parse_url( home_url(), PHP_URL_HOST ) );
$file_host = str_ireplace( 'www.', '', parse_url( $image, PHP_URL_HOST ) );
// Return nothing if there aren't any $url parts or if the current host and $url host do not match
if ( ! isset( $parsed_url[1] ) || empty( $parsed_url[1] ) || ( $this_host != $file_host ) ) {
return;
}
// Now we're going to quickly search the DB for any attachment GUID with a partial path match
// Example: /uploads/2013/05/test-image.jpg
global $wpdb;
$attachment = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->prefix}posts WHERE guid RLIKE %s;", $parsed_url[1] ) );
// Returns null if no attachment is found
return $attachment[0];
}
set_post_thumbnail($post_id, getImageId( $image ));
$woocommerce->cart->get_cart_from_session();
$woocommerce->cart->add_to_cart($product_ID);
wp_redirect( '/kurv' ); exit;
}
}
}
I ran into something similar, except it worked in Chrome/Safari and not Firefox/Opera. It turned out that somebody had changed the status of the product from published to pending. After the change all tested browsers worked just fine. The weird thing is why that happened at all since it should be all server side scripting controlling the add to cart process from a link.