web-dev-qa-db-ja.com

Woocommerceは製品SKUを使用して製品IDを取得します

別のテンプレートページで作業しています。このページでは、wordpress post。のカスタムフィールドを使用してwoocommece製品のSKUを取得します。woocommeceオブジェクトを作成してさらに処理を行うには、そのSKUの製品IDを取得する必要があります。これが私のコードです。

global $woocommerce;
//this return sku (custom field on a wordpress post)
$sku=get_field( "product_sku" );
if($sku!=''){
  //need to create object, but using sku cannot create a object, 
  $product = new WC_Product($sku); 
  echo $product->get_price_html();
}

オブジェクトを作成する前に製品IDを取得する方法はありますか?その後、製品IDをWC_Productクラスコンストラクターに渡してオブジェクトを作成できます。ありがとうございます

9
Suneth Kalhara

この関数を使用できます( ここにあります )。グーグルはあなたの友達です!

function get_product_by_sku( $sku ) {

    global $wpdb;

    $product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku ) );

    if ( $product_id ) return new WC_Product( $product_id );

    return null;
}
10
pmandell

WooCommerce 2.ついにコアでこれのサポートを追加します。

このバージョンを使用している場合は、

wc_get_product_id_by_sku( $sku )
41
Akshay Agarwal

WooCommerce製品は特別な投稿タイプです。このため - WP_Query SKUおよびその他のパラメータで製品を検索するために使用される場合があります。これは、他の基準で検索を制限する必要がある場合の代替手段として使用される場合があります。

たとえば、サイトの翻訳に Polylang (または他のプラグイン)を使用する場合は、言語を指定できます。または、製品タイプで検索を制限することもできます。

WooCommerceメソッドで直接SQLクエリを実行します get_product_id_by_sku 多くの場合完全に問題ないと思います。ただし、翻訳を使用すると機能しない場合があります。ランダムな製品が返されますが、現在の言語の製品は返されません。

WP_Queryを使用してSKUで製品を検索するためのサンプルコード(製品タイプと言語による制限付き):

public function find( string $lang, string $sku ) {
    $query = [
        'lang'       => $lang,
        'post_type'  => 'product',
        'meta_query' => [
            [
                'key'     => '_sku',
                'value'   => $sku,
                'compare' => '='
            ]
        ],
        'tax_query'  => [
            [
                'taxonomy' => 'product_type',
                'terms'    => [ 'grouped' ],
                'field'    => 'name',
            ]
        ]
    ];
    $posts = ( new WP_Query() )->query( $query );

    return count( $posts ) > 0 ? $posts[0] : null;
}
1
Victor Smirnov