Cómo usar la función wc_customer_bought_product para verificar si el cliente compró el producto en una matriz

En primer lugar, soy un principiante y nuevo en PHP, así que perdona mi ignorancia. Hice mi primera pregunta sobre stackoverflow hoy y alguien tuvo la amabilidad de proporcionar una gran solución, así que le doy otra oportunidad.

Intento usar una función para verificar si un cliente compró un producto dentro de un conjunto de identificadores de producto como en las páginas de su cuenta cuando inició sesión Necesito mostrar un menú diferente si compró producto de la matriz A o producto de la matriz B, matriz C, lo entiendes Me gustaría crear una función diferente para cada conjunto de identificadores de producto y asociarlo con un código corto diferente.

Encontré wc_customer_bought_product_function en la referencia de funciones de woocommerce, que se escribe así:

/** * Checks if a user (by email) has bought an item * * @access public * @param string $customer_email * @param int $user_id * @param int $product_id * @return bool */ function wc_customer_bought_product( $customer_email, $user_id, $product_id ) { global $wpdb; $emails = array(); if ( $user_id ) { $user = get_user_by( 'id', $user_id ); $emails[] = $user->user_email; } if ( is_email( $customer_email ) ) { $emails[] = $customer_email; } if ( sizeof( $emails ) == 0 ) { return false; } return $wpdb->get_var( $wpdb->prepare( " FROM {$wpdb->prefix}woocommerce_order_items as order_items LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS itemmeta ON order_items.order_item_id = itemmeta.order_item_id LEFT JOIN {$wpdb->postmeta} AS postmeta ON order_items.order_id = postmeta.post_id LEFT JOIN {$wpdb->posts} AS posts ON order_items.order_id = posts.ID WHERE posts.post_status IN ( 'wc-completed', 'wc-processing' ) AND itemmeta.meta_value = %s AND itemmeta.meta_key IN ( '_variation_id', '_product_id' ) AND postmeta.meta_key IN ( '_billing_email', '_customer_user' ) AND ( postmeta.meta_value IN ( '" . implode( "','", array_unique( $emails ) ) . "' ) OR ( postmeta.meta_value = %s AND postmeta.meta_value > 0 ) ) ", $product_id, $user_id ) ); } 

Así que traté de usarlo para lograr lo que quería transformando solo el último parámetro:

 // Create function to check if client bought a product from array A function check_is_category_A_customer() { global $woocommerce; $user_id = get_current_user_id(); $customer_email = $current_user->email; if (wc_customer_bought_product( $customer_email, $user_id, $product_id=array ('2258', '2253', '2242'))) return true; return false; } // Create shortcode to display menu for customers cat A add_shortcode('CATA','check_cat_bought_A'); function check_cat_bought_A($atts,$content=""){ if( check_is_category_A_customer() ){ return do_shortcode($content); } } 

Pero no funcionó. Cuando uso el shortcode, el menú ya no aparece, pero no aparece una vez que compré un producto cuya identificación está en la matriz.

Intenté esta versión de la función basada en otro ejemplo:

 function check_is_category_A_customer() { global $woocommerce; $user_id = get_current_user_id(); $customer_email = $current_user->email; if ( '' !=wc_customer_bought_product( $customer_email, $user_id, $product_id=array ('2258', '2253', '2242'), true)) return true; return false; } 

Pero eso tampoco funcionó. El shortcode ya no tiene efecto, el menú aparece en todas las situaciones.

Escribí esto usando diferentes funciones que tomé como modelos e información con la que tropecé, y probablemente cometí errores terribles, porque no está funcionando. Si alguien tiene alguna idea de lo que hice mal o cómo lograr este objective de manera diferente, ¡sería una gran ayuda! Gracias.

 function check_is_category_A_customer(array $product_ids) { $product_ids= array ('2258','2253','2242');//for testing global $woocommerce; $user_id = get_current_user_id(); $current_user= wp_get_current_user(); $customer_email = $current_user->email; foreach($product_ids as $item): if ( wc_customer_bought_product( $customer_email, $user_id, $item) ) return true; endforeach; return false; } 

No estabas configurando el objeto $ current_user, mira arriba para la corrección.

Así que David me ayudó a seguir el camino correcto y debería haber sabido cómo pasar 1 identificación de producto a la vez dentro de la misma función, pero no lo hice.

Después de algunas investigaciones y estudios, escribí una nueva función usando declaraciones else if para cada identificación de producto, la probé y hasta ahora está funcionando.

Entonces, incluso si el uso de una matriz o una identificación de categoría hubiera sido más práctico (pero aún no sé cómo hacerlo), estoy compartiendo esta solución para otras personas que quieran lograr el mismo objective:

 // Create function to check if client bought a product from array A function check_is_category_A_customer() { global $woocommerce; $user_id = get_current_user_id(); $current_user= wp_get_current_user(); $customer_email = $current_user->email; if ( wc_customer_bought_product( $customer_email, $user_id,'2258')) { return true; } else if ( wc_customer_bought_product( $customer_email, $user_id,'2253')) { return true; } else if ( wc_customer_bought_product( $customer_email, $user_id,'2242')) { return true; } return false; } // Create shortcode to display menu for customers cat A add_shortcode('CATA','check_cat_bought_A'); function check_cat_bought_A($atts,$content=""){ if( check_is_category_A_customer() ){ return do_shortcode($content); } } 

Gracias de nuevo a David por señalar la dirección 🙂 Por supuesto, si alguien tiene una mejor solución o ve algún error en esto, por favor hable.