web-dev-qa-db-ja.com

何もせずにウーコマースカートのコンテンツを入手するにはどうすればいいですか?

写真をアップロードするたびに、私はwoocommerce製品を作成します。そして、いつか私は未使用の製品をたくさん持っているという考えを得るかもしれません。商品IDと画像のアップロードリンクをテキストファイルに保存します。

私がやろうとしているのは、カートに入っていない商品を24時間後に削除することで、これをcronで実行したいのです。

私が抱えている問題は、グローバルなウーコマースプロパティをスケジュールされたイベントでも利用できるようにする方法が理解できないことです(cron)。

これは私がスケジュールされたイベントを設定する方法です:

add_action('daily_product_removal',  'delete_unused_products' );

function activate() {
    wp_schedule_event( time(), 'daily', 'daily_product_removal' );
}

function deactivate() {
    wp_clear_scheduled_hook('daily_product_removal');
}

カート機能ウー:

function woo_in_cart($product_id) {
    global $woocommerce;

    foreach($woocommerce->cart->get_cart() as $key => $val ) {
        $_product = $val['data'];

        if($product_id == $_product->id ) {


       return true;
        }
    }

    return false;
}

メイン機能:

function delete_unused_products() {

    $woocommerce = new Client(
        'site_link',
        'ck_numbers',
        'cs_numbers',
        [
            'wp_api' => true,
            'version' => 'wc/v1',
        ]
    );

    $myFile = "products.txt";

    $myFileLink = fopen($myFile, 'r');

    $products = [];

     while(!feof($myFileLink)) {
          $this_line = fgets($myFileLink);
          array_Push($products,$this_line);
     }

     fclose($myFileLink);

     foreach($products as $i => $item) {

        $product = unserialize($item);
        $creation_date_from_file = $product->creation_date;
        $product_id = $product->product_id;

        $createDate = strtotime($creation_date_from_file);

        if (strtotime("$creation_date_from_file +1 day") <= time() && !woo_in_cart($product_id)) { // created more than 24 hours ago and is not added in cart

            $results = $woocommerce->delete('products/' . $product_id, ['force' => true]);

            if (file_exists($item->local_url)) {
                unlink($item->local_url);
            }
        if (file_exists($item->local_mockup_url)) {
            unlink($item->local_url);
        }

        file_put_contents($myFile, str_replace($i . "\r\n", "", file_get_contents($myFile))); // delete the line

    }
}

}

私が持っている問題は、私がwoocommerce特有のアクションフックの下でこの機能を実行するならば、言うことができるということです:

add_action( 'woocommerce_cart_contents', 'delete_unused_products' );

その問題はありませんが、(cronを介して)必要なときにこれを実行すると、エラーが発生します。$ woocommerce-> cartのようなものは定義されていません。

これを機能させる方法を私の頭を包むことはできません。ありがとう。

1
user385917

テストされていませんが、使用した場合はどうなりますか

WC()->cart->get_cart()

グローバル$ woocommerceオブジェクトの代わりにカートの内容を取得するには?

しかし、私は問題はカートの中身がユーザーのセッションを必要とし、cron経由でそれにアクセスすることがユーザーが誰なのかわからないということだと私は信じます。特定のユーザーセッションの外でこの情報を見つけるためには、$ wpdbを介して直接データベースの照会を開始する必要があるかもしれません。

1
Shawn H