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

¿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.

mira este mi formulario <form name="addpro" method="post" action=""> <input type="submit" name="addcustomcarts" value="AGREGAR AL CARRITO" /> </form>

¿puedes compartir tu código de los cambios exactos que hiciste en function.php?

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.

No creo que el valor del botón de enviar se publique. Mira mi código editado y prueba eso.

puedes verificarlo, he añadido mi formulario HTML en la parte inferior

He probado tu formulario, y el valor del botón de enviar no se publica. Por favor, prueba lo que he sugerido.

vamos a continuar esta discusión en el chat

¿Tienes alguna idea sobre los adjuntos de correo electrónico en WooCommerce?

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();
}
}
