使用产品SKU获取WooCommerce产品ID

23

我正在制作一个单独的模板页面,该页面获取wordpress文章自定义字段中的woocommece产品sku。我需要获取该sku对应的产品id以创建woocommece对象并进行进一步操作,以下是我的代码。

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类构造函数并创建对象。谢谢


$sku = get_field("product_sku"); 从WordPress自定义字段返回Woocommerce产品的SKU,我需要获取该SKU的产品ID。 - Suneth Kalhara
3个回答

95

WooCommerce2.3最终在核心中添加了对此的支持。

如果您正在使用此版本,您可以调用

wc_get_product_id_by_sku( $sku )

3
附加说明:这将获取$product = new WC_Product(wc_get_product_id_by_sku($sku)); - optimiertes
如果每个变体都有自己的SKU,那么这也适用于可变产品。然后,您可以通过 new WC_Product_Variable(wc_get_product_id_by_sku($variation_sku)); 声明它的类。 - Smithee

20
你可以使用这个函数(在这里找到)。Google是你的朋友!
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;
}

此查询未检查产品是否已发布,如果产品处于草稿状态、私有状态或具有相同 SKU 的产品在垃圾箱中,则可能会将用户发送到 404 页面。 - rmmoul

1
WooCommerce产品是一种特殊的文章类型。因此,WP_Query 可以用于按SKU和其他参数查找产品。当您需要通过其他标准限制搜索时,可以使用此方法作为替代方法。 例如,如果您使用 Polylang(或其他插件)进行网站翻译,则可能希望指定语言。或者您可以按产品类型限制搜索。 在 WooCommerce 方法 get_product_id_by_sku 中直接执行SQL查询,在许多情况下我认为这是完全可以的。但是,如果您使用翻译,则可能无法正常工作,它将返回随机产品而不是当前语言中的产品。 使用 WP_Query 查找产品的示例代码(通过产品类型和语言进行限制):
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;
}

在那个例子中,您不需要使用tax_query,我不太明白您试图通过它实现什么。 - NIck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,