WooCommerce – продукты в зависимости от подписки

ВОПРОС

Мне нужно отображать определенные продукты на страницах учетных записей клиентов в зависимости от их подписки. Пример: если клиент подписался на Продукт № 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;
}