Frage

Wir haben eine einfache Katalogpreisregel, die auf unbestimmte Zeit gültig ist.

In unserem Google Shopping -Feed, das um Mitternacht generiert wird, gilt die Preisregel nicht.

Meine Theorie ist, dass es einen kleinen Zeitrahmen gibt, in dem die berechneten Preise nicht verfügbar sind.

ich habe kontrolliert catalogrule_product_price - Es scheinen nur bis heute Preise berechnet zu geben (2013-04-22), so würden sie um Mitternacht ablehnen:

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)

Ist das normal?cron_schedule Hat jüngste Einträge, also denke ich, dass das Cron -System im Allgemeinen ausgeführt wird.

Ich hatte im Sinn, dass die Preisregeln immer einige Tage im Voraus generiert werden, um solche Zeitspannen mit falschen Preisen zu vermeiden - war ich mit dieser Annahme falsch? Was geht hier vor sich?

Bearbeiten: Überprüft es heute erneut (2013-04-25) - gleiches Problem. Ich wünschte, ich hätte es gestern überprüft, um zu sehen, ob auch 23., 24. und 25. Wo existieren und so die Preise immer in Trauben oder Baum generiert werden, wenn die Preise immer bis heute und vor drei Tagen generiert werden.

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)
War es hilfreich?

Lösung

Nein.

Der Cron -Job ruft die Beobachtermethode an Mage_CatalogRule_Model_Observer::dailyCatalogUpdate(). Dieser ruft an Mage_CatalogRule_Model_Resource_Rule::applyAllRulesForDateRange() ohne Argumente.

Wenn applyAllRulesForDateRange() Es wird ohne Argumente bezeichnet, ein Tag +/- Der aktuelle Datum wird angenommen.

Also du kann Erstellen Sie neuere oder ältere Daten, aber der nächtliche Cron -Job nicht.

Andere Tipps

Ich verbringe irgendwann, um das zu verstehen :)

Und das Skript berechnen die Preise für die heutige Tag, Der vorherige Tag und der nächste Tag.

In diesem Zusammenhang umfassen Aktualisierungen Intervall 3 Tage [in Magento 2.2.x

  • Aktueller Tag - 1 Tage vor + 1 Tagen danach

Tägliche Aktualisierungskatalogpreisregel von Cron

/vendor/magento/module-catalog-rule/cron/dailycatalogupdate.php

  • Das Update umfasst Intervall 3 Tage - aktueller Tag - 1 Tage vor + 1 Tagen danach
  • Diese Methode wird aus dem Cron -Prozess aufgerufen, Cron arbeitet in der UTC -Zeit und
  • Wir sollten Daten für Intervall -1 -Tag generieren ... +1 Tag

Reindedex -Produktpreise gemäß den Regeleinstellungen.

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

Also die Berechnungsdauer

$fromDate = mktime(0, 0, 0, date('m'), date('d') - 1);
$toDate = mktime(0, 0, 0, date('m'), date('d') + 1);

In Magento 1.x dies Insekt tritt auf, wenn Sie in einer Zeitzone leben, die mehr als +01: 00 von GMT ist. Der Standard -Cronjob wird um 01:00 Uhr ausgeführt und verwendet die GMT -Zeit, um das Regel_Date festzulegen. In diesem Fall wird das Datum "gestern" sein, so dass es für den aktuellen Tag keine Preisregel geben würde.

Beispiel:

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"

Lösung in 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;

Verweise

  1. http://www.divisionlab.com/solvingmagento/magento-catalog-price-rules/
  2. https://github.com/magento/magento2/issues/6610
  3. https://ipfs-sec.stackexchange.cloudflare-ipfs.com/magento/a/question/3161.html
  4. https://support.google.com/merchants/answer/6069284?hl=de
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top