WooCommerce crear nuevo producto y añadir al carrito al enviar formulario
Estoy personalizando el plugin WooCommerce para añadir productos desde el frontend al carrito. He escrito la función en functions.php, pero estoy obteniendo un error fatal.
Obtengo este error-->
Fatal error: Call to a member function add_to_cart() on a non-object en
C:\wamp\www\cutting-edge_server\wordpress_theme\wp-content\themes\cutting_age\responsive\functions.php en la línea 56
¿Alguien tiene alguna idea de cómo resolverlo?
Mi archivo functions.php
if (isset($_POST["addcustomcarts"]))
{
echo $_SERVER[QUERY_STRING];
// echo $_SERVER[REQUEST_URI];
echo "estoy en if";
//exit();
add_filter('woocommerce_before_cart', 'customcart');
function customcart() {
echo "estoy en la función";
//global $woocommerce;
$my_post = array(
'post_title' => 'Mi publicación',
'post_content' => 'Esta es mi publicación.',
'post_status' => 'publish',
'post_author' => 1,
'post_type' =>'product'
);
// Insertar la publicación en la base de datos
$product_ID=wp_insert_post( $my_post );
add_post_meta($product_ID, '_regular_price', 100, $unique);
add_post_meta($product_ID, '_price', 100, $unique);
add_post_meta($product_ID, '_stock_status', 'instock', $unique);
//Error en esta línea.
$woocommerce->cart->add_to_cart( $product_ID, $quantity=1 );
exit( wp_redirect( home_url( "cart" ) ) );
}
customcart();
}
Mi archivo HTML
<form name="addpro" method="post" action="">
<input type="submit" name="addcustomcarts" value="AÑADIR AL CARRITO" />
</form>
No estoy seguro exactamente de lo que estás haciendo, pero el siguiente código funcionó para mí al crear un nuevo producto y agregarlo al carrito. Ten en cuenta que tuve que usar $_GET para probar en mi configuración ya que no tengo el resto de tu código y no me sentí como para crear un formulario.
EDITAR: He agregado un simple elemento <form> y cambiado a $_POST.
EDITAR 2: He eliminado el formulario. Aparentemente el OP tiene el formulario en la página principal.
add_action('init', 'customcart');
function customcart() {
if (isset($_POST["addcustomcarts"])) {
global $woocommerce;
$my_post = array(
'post_title' => 'Mi publicación',
'post_content' => 'Esta es mi publicación.',
'post_status' => 'publish',
'post_author' => 1,
'post_type' =>'product'
);
// Insertar la publicación en la base de datos
$product_ID = wp_insert_post( $my_post );
if ( $product_ID ){
add_post_meta($product_ID, '_regular_price', 100 );
add_post_meta($product_ID, '_price', 100 );
add_post_meta($product_ID, '_stock_status', 'instock' );
//Obteniendo error en esta línea.
$woocommerce->cart->add_to_cart( $product_ID, $quantity=1 );
exit( wp_redirect( get_permalink( woocommerce_get_page_id( 'cart' ) ) ) );
}
}
}
tengo un formulario con un botón de envío y el método del formulario es post
Sanjay Nakate
¿Estás seguro de que tu formulario está configurado como post? Porque, he cambiado a $_POST y una vez que hago clic en 'Enviar', el post se inserta y se agrega al carrito.
helgatheviking
mira este mi formulario <form name="addpro" method="post" action=""> <input type="submit" name="addcustomcarts" value="AGREGAR AL CARRITO" /> </form>
Sanjay Nakate
¿puedes compartir tu código de los cambios exactos que hiciste en function.php?
Sanjay Nakate
Mi código ya está publicado arriba. También deberías editar tu pregunta con el código de tu formulario, ya que puede ser difícil leer código en los comentarios.
helgatheviking
No creo que el valor del botón de enviar se publique. Mira mi código editado y prueba eso.
helgatheviking
puedes verificarlo, he añadido mi formulario HTML en la parte inferior
Sanjay Nakate
He probado tu formulario, y el valor del botón de enviar no se publica. Por favor, prueba lo que he sugerido.
helgatheviking
vamos a continuar esta discusión en el chat
helgatheviking
¿Tienes alguna idea sobre los adjuntos de correo electrónico en WooCommerce?
Sanjay Nakate
El objeto $woocommerce->cart aparentemente no es un objeto durante la llamada. Configúralo para que se verifique antes de la línea que genera el error:
if( $woocommerce->cart )
$woocommerce->cart->add_to_cart( $product_ID, $quantity=1 );
Esto asegurará que el carrito exista y no ejecutará la línea si no está presente.
add_action( 'template_redirect', 'agregar_al_carrito_en_pagina_personalizada_y_redireccionar');
function agregar_al_carrito_en_pagina_personalizada_y_redireccionar(){
if( is_page( 'mi-pagina' ) ) { // también puedes pasar un ID de página en lugar del slug
WC()->cart->add_to_cart( 72 ); // agregar al carrito el producto con ID 72
wp_safe_redirect( wc_get_checkout_url() );
exit();
}
}