web-dev-qa-db-ja.com

WooCommerceの変数として製品のカスタムフィールド値を取得する

私はクラスの登録にWoocommerceを使用しています。各クラス/製品には最大20のカスタムフィールドがあり、チェックアウトおよび注文の詳細ページと顧客の電子メールテンプレートを高度にカスタマイズするために変数として返す必要があります。

出力を非常に厳密に制御する必要があるため、フックを使用してすべてのカスタムメタデータを追加したいだけです。たとえば、カートページにカスタムフィールドを含めると、次の回答がうまく機能しました。 Woocommerceカートとチェックアウトアイテムにカスタムフィールドの値を表示

しかし、私はそれらをチェックアウト、注文の詳細、および電子メールにも表示し、それらが表示されるHTMLを完全に制御できるようにします(場合によっては、それらも変換する必要があります(例:Unixタイムスタンプから人間へ)可読時間)

order-item-details.phpテンプレート私は以下を試しました:

$room = get_post_meta( $product->ID, 'room', true );
$room_number = get_post_meta( $product->ID, 'room_number', true );
$instructor = get_post_meta( $product->ID, 'instructor', true );

echo 'Your instructor is ' . $instructor . '.';
echo 'Your class is in ' . $room . '.';

しかし、うまくいきませんでした…

特定の製品に関連付けられているカスタムフィールド値にアクセスして使用するにはどうすればよいですか?

5
GunStreetGirl

まず_$product->ID_は機能しません。 つまり、問題は製品IDを取得する方法です。

複数のケース

1)ショップなどのアーカイブページまたは単一の製品ページ:

  • get_the_id()を使用すると、ほとんど常に製品ID(投稿ID)が得られます

    _$room = get_post_meta( get_the_id(), 'room', true );
    _
  • _global $product;_が定義されていない場合は、_$product_を$product->get_id()とともに使用することもできます。

    _global $product;
    
    $room = get_post_meta( $product->get_id(), 'room', true );
    _
  • _global $post;_を_$post->ID_とともに使用することもできます(_$post_が定義されていない場合):

    _global $post;
    
    $room = get_post_meta( $post->ID, 'room', true );
    _

2)カートアイテムの場合(カートオブジェクトから):

_// Loop through cart items
foreach( WC()->cart->get_cart() as $cart_item ){
    // Get the WC_Product object (instance)
    $product = $cart_item['data'];
    $product_id = $product->get_id(); // get the product ID

    $room = get_post_meta( $product->get_id(), 'room', true );
    ## … / … 
}
_
  • 製品バリエーションの場合、親変数の製品IDを取得する必要がある場合は、以下を使用します。

    _// Get the parent product ID (the parent variable product)
    $parent_id = $cart_item['product_id'];
    
    $room = get_post_meta( $parent_id, 'room', true );
    ## … / … 
    _

3)注文商品の場合(定義済みの_WC_Order_オブジェクトから_$order_)

_// Loop through cart items
foreach( $order->get_items() as $item ){
    // Get the Product ID
    $product_id = $item->get_product_id();

    $room = get_post_meta( $product_id, 'room', true );
    ## … / … 
}
_
  • 製品バリエーションの場合、親変数の製品IDを取得する必要がある場合は、以下を使用します。

    _// Loop through cart items
    foreach( $order->get_items() as $item ){
        // Get the parent Product ID
        $product = $item->get_product();
        $parent_id = $product->get_parent_id(); // The parent product ID
    
        $room = get_post_meta( $parent_id, 'room', true );
        ## … / … 
    }
    _

だからそれはあなた次第です。

12
LoicTheAztec