如何使用XML Feed更改woocommerce库存状态

时间:2018-09-22 14:41:50

标签: php wordpress woocommerce

我在我的域中上传了一个包含产品可用性的xml文件。我该如何更新库存状态?我在考虑以下内容,但对于如何调用和使用它感到困惑

function wc_update_product_stock_status() { 
    global $xml; 
    foreach($xml as $x) {
        $sku = $x->sku;     
        $availability = $x->availability;
        switch($availability) {
            case 1:
                $status='instock';
            break;
            case 0:
                $status='outofstock';
            break;
        }
        // get the product ID from the SKU
        $product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku'AND meta_value='%s' LIMIT 1", $sku ));
        $product = wc_get_product( $product_id );
        if ( $product ) {
            $product->set_stock_status( $status );
            $product->save();
        }
    }
}

我做错什么了吗?我需要添加一些东西使其变得更好吗?

谢谢

1 个答案:

答案 0 :(得分:0)

您不能修改之前声明的woocommerce函数,也不能编写使用之前声明的相同函数,因此,如果要编写自定义函数,可以执行以下操作:

  

注意,我已经修改了函数名称

function update_product_stock_status() {
    global $xml;
    foreach ( $xml as $x ) {
        $sku          = $x->sku;
        $availability = $x->availability;
        switch ( $availability ) {
            case 1:
                $status = 'instock';
                break;
            case 0:
                $status = 'outofstock';
                break;
        }
        // get the product ID from the SKU
        $product_id = wc_get_product_id_by_sku( $sku );
        $product    = wc_get_product( $product_id );

        if ( $product ) {
            $product->set_stock_status( $status );
            $product->save();
        }
    }
}



add_action( 'init', 'update_product_stock_status' );

,或者如果您愿意,可以在自定义函数中使用wc_get_product_id_by_sku,如下所示:

function update_product_stock_status() {
    global $xml;
    foreach ( $xml as $x ) {
        $sku          = $x->sku;
        $availability = $x->availability;
        switch ( $availability ) {
            case 1:
                $status = 'instock';
                break;
            case 0:
                $status = 'outofstock';
                break;
        }
        // get the product ID from the SKU
        $product_id = wc_get_product_id_by_sku( $sku );

        if ( $product_id ) {
            wc_update_product_stock_status( $product_id, $status );
        }
    }
}



add_action( 'init', 'update_product_stock_status' );

我使用init钩子调用了此函数,该钩子在WordPress完成加载后但未发送任何标头之前触发。

但这当然不是最好的方法,您无需每次更新XML文件时都使用WordPress cron作业来挂接函数即可。或通过使用Linux crontab更好。

例如,要使用Wordpress Cron运行您的功能,可以通过添加以下内容来实现:

if ( ! wp_next_scheduled( 'my_stock_update' ) ) {
    wp_schedule_event( time(), 'hourly', 'my_stock_update' );
}

add_action( 'my_stock_update', 'update_product_stock_status' );

函数上方的这段代码将每小时运行一次,当然您可以对其进行修改。

有关WordPress Cron的更多详细信息,请检查下面的链接:

Reference 1

Reference 2