Php Woocommerce使用产品SKU获取产品id

Php Woocommerce使用产品SKU获取产品id,php,mysql,wordpress,woocommerce,custom-fields,Php,Mysql,Wordpress,Woocommerce,Custom Fields,我正在处理一个单独的模板页面,该页面使用wordpress post的自定义字段获取Woocomece产品sku。我需要获取该sku的产品id,以便创建Woocomece对象并执行进一步的操作,这是我的代码 global $woocommerce; //this return sku (custom field on a wordpress post) $sku=get_field( "product_sku" ); if($sku!=''){ //need to create object

我正在处理一个单独的模板页面,该页面使用wordpress post的自定义字段获取Woocomece产品sku。我需要获取该sku的产品id,以便创建Woocomece对象并执行进一步的操作,这是我的代码

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_产品类构造函数并创建对象。谢谢您可以使用此函数()。谷歌是你的朋友

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;
}

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

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

wc_get_product_id_by_sku( $sku )

WooCommerce产品是一种特殊的邮政类型。因为这可能会被用于按SKU和其他参数查找产品。当您需要使用其他标准限制搜索时,可以使用此选项

例如,如果您使用(或其他插件)进行站点翻译,您可能需要指定语言。也可以按产品类型限制搜索

他们使用WooCommerce方法进行直接SQL查询,我认为这在很多情况下都是非常好的。但如果使用翻译,则可能不起作用,它将返回随机产品,但不是当前语言中的产品

使用WP_查询按SKU查找产品的示例代码(受产品类型和语言的限制):

$sku=获取字段(“产品sku”);从wordpress自定义字段返回woocommerce产品的sku,我需要获取该sku的产品id
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;
}