カタログ価格ルールの計算は常に3日前に発生するべきではありませんか?
-
16-10-2019 - |
質問
無期限に有効なシンプルなカタログ価格ルールがあります。
真夜中に生成されるGoogleショッピングフィードでは、価格ルールは適用されません。
私の理論では、計算された価格が利用できない小さな時間枠があるということです。
確認しました catalogrule_product_price
- 今日まで計算された価格のみがあるようです(2013-04-22
)、そのため、彼らは真夜中に期限切れになります:
mysql> select distinct rule_date from catalogrule_product_price; +------------+ | rule_date | +------------+ | 2013-04-20 | | 2013-04-21 | | 2013-04-22 | +------------+ 3 rows in set (0.05 sec)
これは正常ですか?cron_schedule
最近のエントリがあるので、Cronシステムは一般的に実行されていると思います。
私は、価格ルールが常に数日前に生成されることを念頭に置いていました。ここで何が起こっているのですか?
編集:今日もう一度チェックしました(2013-04-25
) - 同じ問題。昨日チェックして、23。、24もかかるかどうかを確認したいと思います。 25.既存の場合、価格は常に今日と3日前まで生成される場合、常に束または木で生成されます。
mysql> select distinct rule_date from catalogrule_product_price; +------------+ | rule_date | +------------+ | 2013-04-23 | | 2013-04-24 | | 2013-04-25 | +------------+ 3 rows in set (0.00 sec)
解決
いいえ。
Cronジョブは、オブザーバーメソッドを呼び出します Mage_CatalogRule_Model_Observer::dailyCatalogUpdate()
. 。これは電話をかけます Mage_CatalogRule_Model_Resource_Rule::applyAllRulesForDateRange()
議論なし。
もしも applyAllRulesForDateRange()
議論なしで呼ばれ、1日+/-現在の日付が想定されます。
だからあなた できる 新しいまたは古い日付を作成しますが、毎晩のクロンの仕事はそうではありません。
他のヒント
私はこれを理解するためにいつか費やします:)
スクリプトは価格を計算します 現在の日, その前日 と 次の日.
そこには、更新には3日間の間隔が含まれます[Magento 2.2.x
- 現在の日 - 1日前 + 1日後
Cronによる毎日の更新カタログ価格ルール
/vendor/magento/module-catalog-rule/cron/dailycatalogupdate.php
- 更新インターバル3日 - 現在の日 - 1日前 + 1日後
- この方法はCron Processから呼び出され、CronはUTCの時間に動作し、
- 間隔-1日のデータを生成する必要があります... +1日
ルールの設定に応じた製品価格を再インドします。
/vendor/magento/module-catalog-rule/model/indexer/reindexruleproductprice.php
public function execute(
$batchCount,
\Magento\Catalog\Model\Product $product = null,
$useAdditionalTable = false
) {
$fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
$toDate = mktime(0, 0, 0, date('m'), date('d') + 1);
/**
* Update products rules prices per each website separately
* because of max join limit in mysql
*/
-
-
-
$ruleData['from_time'] = $this->roundTime($ruleData['from_time']);
$ruleData['to_time'] = $this->roundTime($ruleData['to_time']);
/**
* Build prices for each day
*/
for ($time = $fromDate; $time <= $toDate; $time += IndexBuilder::SECONDS_IN_DAY) {
if (($ruleData['from_time'] == 0 ||
$time >= $ruleData['from_time']) && ($ruleData['to_time'] == 0 ||
$time <= $ruleData['to_time'])
) {
$priceKey = $time . '_' . $productKey;
if (isset($stopFlags[$priceKey])) {
continue;
}
if (!isset($dayPrices[$priceKey])) {
$dayPrices[$priceKey] = [
'rule_date' => $time,
'website_id' => $ruleData['website_id'],
'customer_group_id' => $ruleData['customer_group_id'],
'product_id' => $ruleProductId,
'rule_price' => $this->productPriceCalculator->calculate($ruleData),
'latest_start_date' => $ruleData['from_time'],
'earliest_end_date' => $ruleData['to_time'],
];
} else {
$dayPrices[$priceKey]['rule_price'] = $this->productPriceCalculator->calculate(
$ruleData,
$dayPrices[$priceKey]
);
$dayPrices[$priceKey]['latest_start_date'] = max(
$dayPrices[$priceKey]['latest_start_date'],
$ruleData['from_time']
);
$dayPrices[$priceKey]['earliest_end_date'] = min(
$dayPrices[$priceKey]['earliest_end_date'],
$ruleData['to_time']
);
}
if ($ruleData['action_stop']) {
$stopFlags[$priceKey] = true;
}
}
}
したがって、計算期間
$fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
$toDate = mktime(0, 0, 0, date('m'), date('d') + 1);
Magento 1.xでこれ バグ GMTから+01:00を超えるタイムゾーンに住んでいる場合に発生します。デフォルトのCronjobは01:00に実行され、GMT時間を使用してRule_Dateを設定しています。上記の場合、日付は「昨日」になるため、現在の日には価格ルールはありません。
例:
Current Datetime: 2017-07-19 01:00:00 (at current timezone)
Current Datetime at GMT: 2017-07-18 23:00:00
At 01:00 cronjob runs to write price rules with "$coreDate->gmtTimestamp('Today');"
Function will return "2017-07-18" which in this example is "yesterday"
2.2.xの溶液
/vendor/magento/module-catalog-rule/model/indexer/indexbuilder.php
$fromTime = strtotime($rule->getFromDate());
$toTime = strtotime($rule->getToDate());
$toTime = $toTime ? $toTime + self::SECONDS_IN_DAY - 1 : 0;
参照