ВОПРОС
Мне нужно отображать определенные продукты на страницах учетных записей клиентов в зависимости от их подписки. Пример: если клиент подписался на Продукт № 517, но затем переключился на Продукт № 5910, я хочу, чтобы на его электронных письмах и странице учетной записи отображались данные ($ menu_listing), связанные с # 5910.
Я нашел способ как в их электронных письмах добиться этого – с помощью $ order-> get_items ():
add_filter( 'woocommerce_email_order_meta', 'add_hgf_to_order');
function add_hgf_to_order( $order_id ) {
global $posts;
global $woocommerce;
$order = new WC_Order( $order_id );
$user_id = (int)$order->user_id;
$items = $order->get_items();
foreach ($items as $item) {
if ( $item['product_id' ]== 517 || $item['product_id' ]== 5938 ) {
$menu_listing = "menu_listing";
} elseif ( $item['product_id' ]== 5910 || $item['product_id' ]== 5915 ) {
$menu_listing = "menu_listing_c";
} elseif ( $item['product_id' ]== 5934 || $item['product_id' ]== 5926 ) {
$menu_listing = "menu_listing_a";
}
}
return $order_id;
}
Хотя$ order-> get_items () правильноработаетсфункциейwoocommerce_email_order_meta, онанеработаетнастранице«Мояучетнаязапись» клиента. Вместо этого я смог вызвать данные на страницу с помощью wc_customer_bought_product (), однако он не показывает самую последнюю покупкуклиента:
add_filter( 'woocommerce_after_my_account', 'hgf_customer_orders' );
function hgf_customer_orders() {
global $current_user;
global $posts;
global $woocommerce;
$email = $current_user->email;
if ( wc_customer_bought_product( $email, $current_user->ID, 517 ) || wc_customer_bought_product( $email, $current_user->ID, 5938) ) {
$menu_listing = "menu_listing";
} elseif ( wc_customer_bought_product( $email, $current_user->ID, 5910 ) || wc_customer_bought_product( $email, $current_user->ID, 5915) ) {
$menu_listing = "menu_listing_c";
} elseif ( wc_customer_bought_product( $email, $current_user->ID, 5934 ) || wc_customer_bought_product( $email, $current_user->ID, 5926) ) {
$menu_listing = "menu_listing_a";
} else {
return null;
}
}
То, что он делает (используя пример вверху), отображает Product # 517 вместо # 5910. Поэтому мне нужно либо иметь возможность отображать самую последнюю покупку для wc_customer_bought_product (), либо заставить функцию $ order-> get_items () работать правильно на странице «Моя учетная запись» пользователя.
Кто-нибудь может помочь мне решить эту проблему?
ОТВЕТ
(кстати, решение нашел сам пользователь, задавший вопрос)
В итоге я нашел решение, потянув код из WooCommerce> templates> my-order.php вокруг моего оператора foreach ():
add_filter( 'woocommerce_after_my_account', 'hgf_customer_orders' );
function hgf_customer_orders() {
wp_reset_query();
global $posts;
global $woocommerce;
$customer_orders = get_posts( apply_filters( 'woocommerce_my_account_my_orders_query', array(
'numberposts' => 1,
'meta_key' => '_customer_user',
'meta_value' => get_current_user_id(),
'post_type' => wc_get_order_types( 'view-orders' ),
'post_status' => array_keys( wc_get_order_statuses() )
) ) );
if ( $customer_orders ){
foreach ( $customer_orders as $customer_order ) {
$order = wc_get_order();
$order->populate( $customer_order );
$items = $order->get_items();
// echo $order->get_order_number();
foreach ($items as $item) {
if ( $item['product_id' ]== 517 || $item['product_id' ]== 5938 ) {
$menu_listing = "menu_listing";
} elseif ( $item['product_id' ]== 5910 || $item['product_id' ]== 5915 ) {
$menu_listing = "menu_listing_c";
} elseif ( $item['product_id' ]== 5934 || $item['product_id' ]== 5926 ) {
$menu_listing = "menu_listing_a";
}
}
}
} // Close for if ( $customer_orders )
echo $menu_listing;
}